加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

cvMatchShapes匹配

(2011-12-17 10:00:08)
标签:

杂谈

 函数 cvMatchShapes 比较两个形状。 三个实现方法全部使用 Hu 矩.
Hu矩具有平移、伸缩和旋转不变形.

那么在匹配中,如下两种方法哪种会更精确些?
1、先进行canny边缘检测 将得到的边缘信息作为输入 再用cvMatchShapes 
2、先进行角点检测 将得到的角点信息作为输入 再用cvMatchShapes  

边缘检测应该会更准确一些. 

# include "cv.h"
# include "highgui.h"
# include <iostream>
using namespace std;

int main()

   IplImage *mode = cvLoadImage("D:\\picture\\jz.jpg", 1);
   IplImage *test = cvLoadImage("D:\\picture\\stuff.jpg", 1);
   IplImage* bw_mode = cvCreateImage(cvGetSize(mode),mode->depth,1);
   IplImage* bw_test = cvCreateImage(cvGetSize(test),mode->depth,1);
   IplImage* canny_mode = cvCreateImage(cvGetSize(mode),mode->depth,1);
   IplImage* canny_test = cvCreateImage(cvGetSize(test),mode->depth,1);

   CvMemStorage *mode_mems=cvCreateMemStorage();
   CvSeq *mode_seqs;
   CvMemStorage *test_mems=cvCreateMemStorage();
   CvSeq *test_seqs;

   cvCvtColor(mode,bw_mode,CV_RGB2GRAY);
   cvCvtColor(test,bw_test,CV_RGB2GRAY);

   //model contours
   cvCanny(bw_mode,canny_mode,50,60);
   cvFindContours( canny_mode, mode_mems,
                  &mode_seqs,sizeof(CvContour),CV_RETR_TREE);

   //test contours
   cvCanny(bw_test,canny_test,50,60);
   cvFindContours( canny_test, test_mems,
                  &test_seqs,sizeof(CvContour),CV_RETR_TREE);

   double matching=cvMatchShapes( test_seqs, mode_seqs, 3);
   cout << matching << endl;
   
   system("pause");
   //释放内存
}

 

也可以直接用灰度图进行匹配。
返回值越靠近0,说明两张图像相似度越高。
你用的是不是两张完全一样的图片啊。
不妨贴一下。
 

cvMatchShapes

http://www.opencv.org.cn/forum/styles/prosilver/imageset/icon_post_target.gif Venus » 2009-07-23 22:26

int cvMatchShapes_test()
{
IplImage *mode = cvLoadImage("D:\\lena.jpg", 1);
IplImage *test = cvLoadImage("D:\\test3.bmp", 1);
IplImage* bw_mode = cvCreateImage(cvGetSize(mode),mode->depth,1);
IplImage* bw_test = cvCreateImage(cvGetSize(test),mode->depth,1);
IplImage* canny_mode = cvCreateImage(cvGetSize(mode),mode->depth,1);
IplImage* canny_test = cvCreateImage(cvGetSize(test),mode->depth,1);

CvMemStorage *mode_mems=cvCreateMemStorage();
CvSeq *mode_seqs;
CvMemStorage *test_mems=cvCreateMemStorage();
CvSeq *test_seqs;

cvCvtColor(mode,bw_mode,CV_RGB2GRAY);
cvCvtColor(test,bw_test,CV_RGB2GRAY);

//model contours
//cvCanny(bw_mode,canny_mode,50,60);
cvFindContours( bw_mode, mode_mems,
&mode_seqs,sizeof(CvContour),CV_RETR_TREE);

//test contours
//cvCanny(bw_test,canny_test,50,60);
cvFindContours( bw_test, test_mems,
&test_seqs,sizeof(CvContour),CV_RETR_TREE);

double matching=cvMatchShapes( test_seqs, mode_seqs, 3);
printf("%f",matching);

cvReleaseImage( &mode ); //ÊÍ·ÅͼÏñ
cvReleaseImage( &test );
cvReleaseImage( &bw_mode ); //ÊÍ·ÅͼÏñ
cvReleaseImage( &bw_test );
cvReleaseImage( &canny_mode ); //ÊÍ·ÅͼÏñ
cvReleaseImage( &canny_test );
//ÊÍ·ÅÄÚ´æ
return 1;
}
 
 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有