2011-07-12 39 views
3

我需要做一个iPhone应用程序,可以在图像中查找图像模式。 (像thisiphone中使用openCV进行对象检测?模板匹配还是哈尔?

经过无数谷歌搜索,我觉得唯一的选择,我已经在opencv中使用模板匹配功能,它已被移植到objectiveC。

我发现从this GitHub的代码的ObjectiveC一个简单的OpenCV的项目一个很好的起点。

但它是仅使用边缘检测和人脸检测功能在OpenCV的。我需要一个使用模板匹配函数 - “cvMatchTemplate” - 在objectiveC for iPhone中使用的objectiveC示例吗?

下面是我现在的代码:(至少它没有给我错误,但这段代码,返回一个完全黑色的图像,我期待结果图像匹配区域会更亮?)

IplImage *imgTemplate = [self CreateIplImageFromUIImage:[UIImage imageNamed:@"laughing_man.png"]]; 
    IplImage *imgSource = [self CreateIplImageFromUIImage:imageView.image];   
    CvSize sizeTemplate = cvGetSize(imgTemplate); 
    CvSize sizeSrc = cvGetSize(imgSource);  
    CvSize sizeResult = cvSize(sizeSrc.width - sizeTemplate.width+1, sizeSrc.height-sizeTemplate.height + 1); 
    IplImage *imgResult = cvCreateImage(sizeResult, IPL_DEPTH_32F, 1); 
    cvMatchTemplate(imgSource, imgTemplate, imgResult, CV_TM_CCORR_NORMED); 
    cvReleaseImage(&imgSource); 
    cvReleaseImage(&imgTemplate);   
    imageView.image = [self UIImageFromIplImage:imgResult]; 
    cvReleaseImage(&imgResult); 

p/S:或者,我应该尝试使用cvHaarDetectObjects识别对象?

+0

嗨,你可以帮我一个任务 – Rajneesh071

+0

它不工作 – Rajneesh071

+0

喜抱歉,我已经停止了这方面的工作太久...... – mkto

回答

5

从cvMatchTemplate的结果是一个32位的浮点图像。为了显示结果,您需要将其转换为无符号字符8位图像(IPL_DEPTH_8U)。

的CV_TM_CCORR_NORMED方法之间[0,1]和cvConvertScale提供了一种简单的方法来做到的缩放和类型转换产生的值。尝试加入以下代码:

IplImage* displayImgResult = cvCreateImage(cvGetSize(imgResult), IPL_DEPTH_8U, 1);  
cvConvertScale(imgResult, displayImgResult, 255, 0); 
imageView.image = [self UIImageFromIplImage:displayImgResult]; 
+0

嗨jeff,谢谢你的回答我会在我回去工作的时候尝试一下。同时我也可以问你,为了实现类似于我发布的YouTube链接,我应该坚持matchtemplate还是应该看看cvHaarDetectObject? – mkto

+0

嗨,杰夫,谢谢你的指针!我终于看到了opencv返回的一些有意义的模式(你可以在这里看到它们:http://encryptedpixel.wordpress.com/2011/07/13/346/)。我创建了另一个问题来了解如何分析这些模式:http://stackoverflow.com/questions/6673684/how-to-analyze-results-returned-by-opencvs-cvmatchtemplate如果你有答案,请帮助我谢谢! – mkto

+1

刚刚对视频进行了更改,我会推荐一种不同的方法。我认为使用SIFT或SURF功能的物体识别类型方法可以获得更好的效果。这些将为您提供一些稳健的缩放,旋转和比模板匹配更具辨别性。 – jeff7