学习opencv使用反向块投影搜寻图像中的物体的位置cvcalcbackproject_第1页
学习opencv使用反向块投影搜寻图像中的物体的位置cvcalcbackproject_第2页
学习opencv使用反向块投影搜寻图像中的物体的位置cvcalcbackproject_第3页
学习opencv使用反向块投影搜寻图像中的物体的位置cvcalcbackproject_第4页
学习opencv使用反向块投影搜寻图像中的物体的位置cvcalcbackproject_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、学习opencv使用反向块投影搜寻图像中的物体的位置cvCalcBackProject.前一篇讲了使用cvCalcBackProject寻找手的肤色地 方这一篇讲在一幅图像中寻找莫个特定的小物体步骤:1 .使用一幅只包含小物体的图片(图片大小和物体一样大即可,不需要向上一篇同样大),计算其二维直方图(HSV空间中的h(亮度)和s (饱和度)二维直方图(还可以和图像的梯度和(或)梯度角度结合起来,查找纹理相似和(或)颜色相似2 .输入一幅待搜索的图片,转化为HSV空间,只取h和s分量3 .设置搜索块大小和物体大小相同 (即和第1步中图片大小 相同),使用cvCalcBackProjectPatc

2、h反向块投影 和图片 result4 .在result中取最大值所在位置,即可得到物体在输入图片 中的位置了。(或者设定一个阈值)示例程序如下:#include <iostream>#include <cv.h>#include <highgui.h>#include <cxcore.h>using namespace std;void GetHSV(const IplImage *image,IplImage *h,IplImage*s,IplImage *v);int main(

3、)IplImage *src = cvLoadImage("f:imagesbluecup.jpg");IplImage *h_src = NULL ,*s_src = NULL;GetHSV(src,&h_src,&s_src,NULL);IplImage *images口 = h_src,s_src;CvHistogram *hist_src;计算二维直方图int dims = 2;int size = 30,32; / 这个地方不要取的太大 !当取为size口 = 180,256时E7200CPU会运行长达10几 分钟的!float r

4、ange_h口 = 0,180 / 再用 cvCvtColor 转换时 h 已经归 一化到180 了,range_s = 0,256;float *ranges口 = range_h,range_s;hist_src =cvCreateHist(dims,size,CV_HIST_ARRAY ,ranges);cvCalcHist(images,hist_src);cvNormalizeHist(hist_src,1);IplImage *dst = cvLoadImage("f:imagesadrian1.jpg");IplImage *h_dst = NULL,*s_d

5、st = NULL;GetHSV(dst,&h_dst,&s_dst,NULL);images0 = h_dst ,images1 = s_dst;CvSize patch_size = cvSize(src->width,src->height);IplImage *result = cvCreateImage(cvSize(h_dst->width -patch_size.width +1,h_dst->height - patch_size.height +1),IPL_DEPTH_32F,1);/块

6、搜索时处理边缘是直接舍去,故 result的大/卜比 dst小path_size大/卜/32F类型,取值为01最亮为1,可直接显示/CV_COMP_CORREL 相关度,1时最匹配,0时最不匹配cvCalcBackProjectPatch(images,result,patch_size,hist_src,CV_COMP_CORREL,1);cvShowImage("result",result);我由最大值位置,可得到此位置即为杯子所在位置CvPoint max_location;cvMinMaxLoc(result,NULL,NULL,NULL,&max

7、_location ,NULL);加上边缘,得到在原始图像中的实际位置max_location.x += cvRound(patch_size.width/2);max_location.y += cvRound(patch_size.height/2);/在dst图像中用红色小圆点标由位置cvCircle(dst,max_location,3,CV_RGB(255,0,0),-1);cvShowImage("dst",dst);cvWaitKey();cvReleaseImage(&src);cvReleaseImage(&dst);cvR

8、eleaseImage(&h_src);cvReleaseImage(&h_dst);cvReleaseImage(&s_dst);cvReleaseImage(&s_src);cvReleaseHist(&hist_src);cvReleaseImage(&result);cvDestroyAllWindows();void GetHSV(const IplImage *image , IplImage *h,IplImage*s,IplImage *v) (IplImage *hsv = cvC

9、reateImage(cvGetSize(image),8,3);cvCvtC010r(image,hsv,CV_BGR2HSV);if(h != NULL) && (*h = NULL)* h = cvCreateImage(cvGetSize(image),8,1);if(s != NULL) && (*s = NULL)* s = cvCreateImage(cvGetSize(image),8,1);if(v != NULL) && (*v = NULL)* v = cvCreateImag

10、e(cvGetSize(image),8,1);cvSplit(hsv,*h,(s =NULL)?NULL:*s,(v=NULL)?NULL:*v,NULL);cvReleaseImage(&hsv);第一步物体图片src刚好包含要搜索的物体:第二步输入图像即待搜索的图像如下:在我的E7200 CPU , 1GB内存 上大概运行了 20秒内吧, 将size内的数应该可以再适当改的更小此,速度就会提高更多了结果如下(见图中红色小圆圈标记由来):若待搜索的图片里有多个此物体,也是可以通过这种方法找由来的产于cvCalcBackProjectPatch 的大概意义,按我的理解的话,应该是通过块窗口搜索图像,比较窗口中对应像素的二维直方图与给定直方图的差异,若完全相同,那当然就越匹配对于不同的相关度方法,越匹配,具值由相关度方法而定,如本程序使用的是CV_COMP_CORREL即越相似,则值越

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论