2013-04-19 5 views
0

У меня есть шаблон, и я хочу знать, присутствует ли шаблон в изображении. Ну, я много гугл и пришел к выводу, что мне нужно использовать cvMatchTemplate и cvMinMaxLoc.OpenCV C++ распознавание шаблона

Вот мой код:

image = cvLoadImage("C:/images/flower.jpg",1); 
templat = cvLoadImage("C:/images/flo.jpg",1); 
image2=cvCreateImage(cvSize(image->width, image->height), IPL_DEPTH_8U, 1); 
result=cvCreateImage(cvSize(image->width, image->height), IPL_DEPTH_8U, 1); 
cvZero(result); 
cvZero(image2); 
cvCvtColor(image,image2,CV_BGR2GRAY); 
cvMatchTemplate(image2, templat,result,CV_TM_CCORR_NORMED); 

double min_val=0, max_val=0; 
CvPoint min_loc, max_loc; 
cvMinMaxLoc(result, &min_val, &max_val, &min_loc, &max_loc); 

cvRectangle(image, max_loc, cvPoint(max_loc.x+templat->width, 
max_loc.y+templat->height), cvScalar(0), 1); 

cvShowImage("src", image); 
cvShowImage("result image", result); 
cvWaitKey(0); 

Моя проблема, когда я запускаю код выше, окно сообщения отображается говоря:

Unhandled exception at 0x747d812f in matching.exe: Microsoft C++ exception: cv::Exception at memory location 0x001ff6ec.. 

и в черном экране появляется сообщение:

OpenCV Error: Sizes of input arguments do not match <image and template should have the same type> in unknown function, file..\..\..\..\ocv\opencv\scr\cv\cvtempl.cpp, line 356. 

Пожалуйста, обратите внимание, что flower.jpg является цветным изображением и flo.jpg является серой шкалой этого изображения.

Любые идеи о том, что происходит?

+0

Как вы объявляете 'image' и' templat'? Каковы их типы? –

+0

IplImage * templat = NULL; IplImage * image = NULL; – vidzz

ответ

2

Вам необходимо преобразовать flower.jpg и flo.jpg в одноканальное изображение. Даже если flo.jpg в оттенках серого, вы загружаете его как трехканальное изображение. Также изображение result должно быть IPL_DEPTH_32F instad of IPL_DEPTH_8U.

Вот правильный код (непроверенный):

IplImage* image = cvLoadImage("C:/images/flower.jpg", 1); 
IplImage* templat = cvLoadImage("C:/images/flo.jpg", 1); 
IplImage* image2 = cvCreateImage(cvSize(image->width, image->height), IPL_DEPTH_8U, 1); 
IplImage* templat2 = cvCreateImage(cvSize(templat->width, templat->height), IPL_DEPTH_8U, 1); 

cvCvtColor(image, image2, CV_BGR2GRAY); 
cvCvtColor(templat, templat2, CV_BGR2GRAY); 

int w = image->width - templat->width + 1; 
int h = image->height - templat->height + 1; 
result = cvCreateImage(cvSize(w, h), IPL_DEPTH_32F, 1); 
cvMatchTemplate(image2, templat, result, CV_TM_CCORR_NORMED); 

double min_val, max_val; 
CvPoint min_loc, max_loc; 
cvMinMaxLoc(result, &min_val, &max_val, &min_loc, &max_loc); 

cvRectangle(image, max_loc, cvPoint(max_loc.x+templat->width, 
max_loc.y+templat->height), cvScalar(0), 1); 

cvShowImage("src", image); 
cvShowImage("result image", result); 
cvWaitKey(0); 
+0

@ bsdnoobz- привет, я получаю ошибку в строке "templat2 = cvCreateImage (cvSize (template-> width, template-> height), IPL_DEPTH_8U, 1);" ошибка C2059: синтаксическая ошибка: 'template' :( – vidzz

+0

@vidzz Извините, я забыл, что вам нужно объявить 'IplImage * templat2;'. См. Мой отредактированный код. – flowfree

+0

@ bsdnoobz Я объявил это, но затем я получил вышеупомянутую ошибку. – vidzz

1

соответствие шаблон подразумевает, что оба image и template имеют одинаковое число каналов и глубина канала. Самый простой способ сделать это, чтобы загрузить их обоих в оттенках серого:

Mat I = imread("lena.png", 0); 
Mat T = imread("template.png", 0); 

Примечания: Я приказываю, чтобы использовать интерфейс OpenCV2.0 C++. Поэтому вместо cvLoadImage используйте imread. Старый интерфейс больше не разработан.

Смежные вопросы