download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

Алгоритъм за търсене на изображения

Автор
Съобщение
insecteater
Вто, 02.04.13, 14:08
Привет, мъча се да направя функция, която да претърсва дадена област от екрана за наличието на много копия от една и съща картинка, като на намерените копия да съхранява координатите.

Езика е autohotkey. По принцип самият език има функция за търсене на изображения, но функцията търси и намира (в правоъгълна област) едно единствено изображение:
-----------------------------
ImageSearch, OutputVarX, OutputVarY, X1, Y1, X2, Y2, ImageFile

Връща променливите:
OutputVarX - намерената координата по X на изображението
OutputVarY - намерената координата по X на изображението

Подавани параметри:
X1 - Координатата по X на горния ляв ъгъл, от който да започне претърсването
Y1 - Координатата по Y на горния ляв ъгъл, от който да започне претърсването
X2 - Координатата по X на долния десен ъгъл, до който да търси
Y2 - Координатата по Y на долния десен ъгъл, до който да търси
ImageFile - Път до файла с картинката, която ще търсим по екрана
-----------------------------
Например ако имам картинка на червено кръгче, мога да търся това червено кръгче, като задам координатите на правоъгълника. Функцията ще претърси в границите на правоъгълника, ще го намери и ще ми върне координатите, но ако имам няколко червени кръгчета по екрана, функцията ще намери само първото.

Целта ми е, да намеря всички червени кръгчета, без изключение, като алгоритъма на претърсване да не става излишно тромав. Със сигурност ще е някакъв цикъл, който да претърсва отгоре надолу, но оплитам конците нещо - това което направих претърсва излишно много пъти припокриващи се области, които вече са били претърсвани.

Не търся конкретен сорс код на този език - търся идея, алгоритъм, дори илюстриран и с помощта на друг език би ми свършил работа.

редактиран от insecteater на 02.04.13 14:10
редактиран от insecteater на 02.04.13 14:17
редактиран от insecteater на 02.04.13 14:19
programings
Вто, 02.04.13, 14:43
Погледни тук.
редактиран от programings на 02.04.13 14:43
редактиран от programings на 02.04.13 14:45
dreven
Вто, 02.04.13, 17:20

RE: Алгоритъм за търсене на изображения

” Със сигурност ще е някакъв цикъл, който да претърсва отгоре надолу, но оплитам конците нещо - това което направих претърсва излишно много пъти припокриващи се области, които вече са били претърсвани.

Едва ли е сложно да разделиш ширината и височината на монитора на равен брой интервали. Фактът че претърсването се извършва в припокриващи се области ме навежда на мисълта, че мерките с които работи функцията и това, което ти и подаваш не е в една дименсия. Докарай всичко само до пиксели или туипове и тогава пускай функцията. Връзката между тях беше 1/15, но не съм много сигурен, трябва да го провериш.

anonymous
Вто, 02.04.13, 17:45
Хванал си се не с трудния начин, а с да кажем, неправилните инструменти :)
Ето как би изглеждало с С/С++ и OpenCV
#include <cv.h>
#include <highgui.h>
#include <math.h>
 
using namespace cv;
 
int main(int argc, char** argv)
{
    Mat img, gray;
    if( argc != 2 && !(img=imread(argv[1], 1)).data)
        return -1;
    cvtColor(img, gray, CV_BGR2GRAY);
    // smooth it, otherwise a lot of false circles may be detected
    GaussianBlur( gray, gray, Size(9, 9), 2, 2 );
    vector<Vec3f> circles;
    HoughCircles(gray, circles, CV_HOUGH_GRADIENT,
                 2, gray->rows/4, 200, 100 );
    for( size_t i = 0; i < circles.size(); i++ )
    {
         Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
         int radius = cvRound(circles[i][2]);
         // draw the circle center
         circle( img, center, 3, Scalar(0,255,0), -1, 8, 0 );
         // draw the circle outline
         circle( img, center, radius, Scalar(0,0,255), 3, 8, 0 );
    }
    namedWindow( "circles", 1 );
    imshow( "circles", img );
    return 0;
}

insecteater
Сря, 03.04.13, 08:35
Нещо не можах да схвана идеята на сорса, който си дал
А примера с кръгчетата е само пример. По принцип целта е произволно повтарящо се bitmap изображение.

Hotkey-а не е чак толкова за изхвърляне. А и цялото голямо приложение е писано на него и има прекалено много готови неща, за да се изоставят с лека ръка, и да се мине на нещо друго, само защото някаква странична функция е по-удобно да се напише на това нещо друго. А с викане на външни dll-ли подозирам че ще стане бавно - но и без това не разполагам вече със знанията да го направя по този начин. То вече сглобих една претърсваща функция, която работи що годе добре, но има още какво да се желае.

zlatena
Съб, 06.04.13, 08:57
Не знам дали схващам това,което търсиш
Но ми беше интересно да прочета малко тази сутрин.

SURF (Speeded Up Robust Features)
Ето и произволни линкове...
http://habrahabr.ru/post/103107/
http://www.vision.ee.ethz.ch/~surf/papers.html
http://en.wikipedia.org/wiki/SURF#cite_note-1
--------------
Scale -invariant feature transform
http://en.wikipedia.org/wiki/Scale-invariant_feature_transform

---------------------------------------------------------------
http://www.cse.wustl.edu/~kilian/cse517a2010/Course_Page/Syllabus/Syllabus.html
http://ramsrigoutham.com/category/technology/viola-jones-face-detection-and-tracking/
http://cgm.computergraphics.ru/content/view/112
http://ru.wikipedia.org/wiki/AdaBoost
Това го пиша за мен
MATLAB
Signal Processing Toolbox
https://github.com/akshar100/Matlab-Image-Detection/blob/master/WhiteBallGreenBG.m
https://github.com/akshar100/Matlab-Image-Detection/blob/master/ImageDetection.m
http://www.boosting.org/software

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.