Tlya 1 Жалоба Опубликовано March 31, 2017 Здравствуйте!такой вопрос: создал прилагу по поиску фрагмента на картинке по шаблону 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #define CV_TM_SQDIFF 0 #include<opencv2\highgui\highgui.hpp> #include<opencv2\core\core.hpp> #include<opencv2\opencv.hpp> #include<opencv\cv.h> #include<stdio.h> using namespace cv; using namespace std; double minval, maxval; int main(int argc, const char** argv) { setlocale(LC_ALL, "Russian"); string ishod_im = "TEST.jpg"; char ish_is[100]; strcpy(ish_is, ishod_im.c_str()); IplImage* image = 0; image = cvLoadImage(ish_is, 1); string shablon_im = "X.jpg"; char ish_sh[100]; strcpy(ish_sh, shablon_im.c_str()); IplImage* templ = 0; templ = cvLoadImage(ish_sh, 1); int width = templ->width; int height = templ->height; IplImage *res = cvCreateImage(cvSize((image->width - templ->width + 1), (image->height - templ->height + 1)), IPL_DEPTH_32F, 1); cvMatchTemplate(image, templ, res, CV_TM_SQDIFF); CvPoint minloc, maxloc; cvMinMaxLoc(res, &minval, &maxval, &minloc, &maxloc, 0); cvRectangle(image, cvPoint(minloc.x, minloc.y), cvPoint(minloc.x + templ->width - 1, minloc.y + templ->height - 1), CV_RGB(0, 0, 255), 2, 8); cvShowImage("Совпадения", image); waitKey(0); return 0; } С большего все работает норм, интересует два вопроса:1. как сделать так чтобы находило более одного совпадения? (вроде как есть какой-то способ "скользящего окна", но хотелось бы знать как его реализовать. а может и не им надо пользоваться)2. как сделать чтобы в случае отсутствия совпадения не показывал ни одной рамки (сейчас прога ищет совпадения, но даже если адекватных нет выдает хоть какой-то результат (неверный)) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
iskees 32 Жалоба Опубликовано March 31, 2017 Вместо cvMinMaxLoc(res, &minval, &maxval, &minloc, &maxloc, 0); пробегайте сами по "res" и выбирайте максимальные значения с нужным фильтром. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Tlya 1 Жалоба Опубликовано March 31, 2017 С помощью этого решается 1-й или 2-й вопрос? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
iskees 32 Жалоба Опубликовано March 31, 2017 да Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Tlya 1 Жалоба Опубликовано March 31, 2017 Может есть какой нибудь пример или ссылка? не уверен что с моим опытом удастся правильно реализовать...( Или хотя бы отправьте куда надо Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Tlya 1 Жалоба Опубликовано April 3, 2017 В 31.03.2017 at 19:53, iskees сказал: Вместо cvMinMaxLoc(res, &minval, &maxval, &minloc, &maxloc, 0); пробегайте сами по "res" и выбирайте максимальные значения с нужным фильтром. можно подробнее про "пробегайте"?) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 3, 2017 Отправляю: http://docs.opencv.org/2.4/doc/tutorials/core/how_to_scan_images/how_to_scan_images.html У ас MathTemplate выдаст изображение с типом элементов float если мне не изменяет склероз. http://docs.opencv.org/trunk/d4/dc6/tutorial_py_template_matching.html см. картинки слева. И снизу, кстати есть пример поиска монеток на экране (на питоне, но смысл тот-же). Просканировали его и выбрали максимумы. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Tlya 1 Жалоба Опубликовано April 3, 2017 Нашел по вашим ссылкам нужный код, но не получается перевести его на С++ import cv2 import numpy as np from matplotlib import pyplot as plt img_rgb = cv2.imread('mario.png') img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) template = cv2.imread('mario_coin.png',0) w, h = template.shape[::-1] res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED) threshold = 0.8 loc = np.where( res >= threshold) for pt in zip(*loc[::-1]): cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Tlya 1 Жалоба Опубликовано April 9, 2017 Ну же, неужели никто не поможет новичку? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 9, 2017 12 строчек ! За 6 дней можно не то что разобрать пример, но и питон выучить, если есть желание, а если нет, тогда привет. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Tlya 1 Жалоба Опубликовано April 9, 2017 так мне ж не все непонятно, затуп конкретно буквально в нескольких строках: import cv2 import numpy as np //что за numpy? from matplotlib import pyplot as plt // as plt? //дальше понятное дело считывание, перевод в грей, изменение размера res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED) // тоже всё ясно threshold = 0.8 // визуал предлагает либо cvThreshold либо threshold loc = np.where( res >= threshold) //конструкция с перебором массива я так понимаю... как ее изобразить на ++ for pt in zip(*loc[::-1]): // откуда взялся zip cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2) //рисуем квадрат п.с. я же не все 6 дней сидел и думал над этим)) просто вспомнил на днях)) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 9, 2017 import cv2 oprncv-шная либа import numpy as np //что за numpy? библиотека работы с матрицами, в питоне нет cv::Mat, там их заменяют матрицы numpy. from matplotlib import pyplot as pl библиотека для отрисовки графиков и изображений. Это питоновские "#include" для С++ хватит и "#include opencv2/opencv.hpp" остальное в питоне и в C++ вариантах очень похоже. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах