cvMatchShapes匹配

转: http://blog.sina.com.cn/s/blog_73ee929c01010f45.html

函数 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

帖子由 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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个简单的Delphi-OpenCV人脸对比示例代码: ```delphi uses OpenCV; function CompareFaces(const Image1, Image2: IplImage): Double; var Gray1, Gray2, Diff: IplImage; ResultMat: CvMat; begin // 将两张图像转换成灰度图像 Gray1 := cvCreateImage(cvGetSize(Image1), IPL_DEPTH_8U, 1); Gray2 := cvCreateImage(cvGetSize(Image2), IPL_DEPTH_8U, 1); cvCvtColor(Image1, Gray1, CV_BGR2GRAY); cvCvtColor(Image2, Gray2, CV_BGR2GRAY); // 计算两张图像的差异 Diff := cvCreateImage(cvGetSize(Image1), IPL_DEPTH_8U, 1); cvAbsDiff(Gray1, Gray2, Diff); // 将差异图像转换成矩阵,并计算其平均值 ResultMat := cvMat(Diff.Height, Diff.Width, CV_8UC1, Diff.ImageData); Result := cvAvg(@ResultMat).Val[0]; // 释放内存 cvReleaseImage(@Gray1); cvReleaseImage(@Gray2); cvReleaseImage(@Diff); end; ``` 该函数接受两个IplImage对象作为参数,分别表示待比较的两张图像。首先将它们转换成灰度图像,然后计算它们之间的差异,最后将差异图像转换成矩阵,并计算其平均值,作为两张图像之间的相似度。 ### 回答2: Delphi和OpenCV结合可以用于人脸对比的代码。在Delphi中,可以使用OpenCV库中提供的IplImage结构进行图像处理。 首先,需要加载要对比的两个人脸图像,并将它们转化为IplImage格式。可以使用cvLoadImage函数加载图像文件,并通过cvCreateImage函数创建IplImage对象。例如: ``` var img1, img2: PIplImage; begin // 加载第一个图像 img1 := cvLoadImage('face1.jpg'); // 加载第二个图像 img2 := cvLoadImage('face2.jpg'); end; ``` 然后,需要对人脸图像进行处理以提取人脸特征。可以使用OpenCV的人脸检测器,如Haar分类器来检测人脸。可以使用cvHaarDetectObjects函数进行人脸检测,并通过Rectangle函数绘制检测到的人脸区域。例如: ``` var cascade: PCvHaarClassifierCascade; storage: PCvMemStorage; faces: CvSeq; scale: double; i: integer; r: TCvRect; begin // 加载人脸分类器 cascade := cvLoadHaarClassifierCascade('haarcascade_frontalface_alt.xml'); // 创建内存存储器 storage := cvCreateMemStorage(0); // 将图像尺寸调整为相同大小 scale := img1.height / 150; // 调整比例 cvResize(img1, img1, CV_INTER_LINEAR); // 调整大小 cvResize(img2, img2, CV_INTER_LINEAR); // 调整大小 // 检测第一个图像中的人脸 faces := cvHaarDetectObjects(img1, cascade, storage, 1.1, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(img1.width div 8, img1.height div 8)); // 绘制第一个图像中检测到的人脸 for i := 0 to faces.total - 1 do begin r := PCvRect(cvGetSeqElem(faces, i))^; cvRectangle(img1, cvPoint(r.x, r.y), cvPoint(r.x + r.width, r.y + r.height), CV_RGB(255, 0, 0), 3, 8); end; // 检测第二个图像中的人脸 faces := cvHaarDetectObjects(img2, cascade, storage, 1.1, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(img2.width div 8, img2.height div 8)); // 绘制第二个图像中检测到的人脸 for i := 0 to faces.total - 1 do begin r := PCvRect(cvGetSeqElem(faces, i))^; cvRectangle(img2, cvPoint(r.x, r.y), cvPoint(r.x + r.width, r.y + r.height), CV_RGB(255, 0, 0), 3, 8); end; // 释放内存 cvReleaseMemStorage(@storage); end; ``` 最后,可以使用OpenCV提供的人脸对比算法对提取的人脸特征进行对比。可以使用cvMatchShapes函数计算两个人脸的相似度。例如: ``` var result: double; begin // 对比人脸图像的相似度 result := cvMatchShapes(img1, img2, CV_CONTOURS_MATCH_I2); end; ``` 这样,就可以使用Delphi和OpenCV实现人脸对比的代码了。以上是对人脸图像的简单处理和对比,具体的代码实现可以根据实际需求进行完善和扩展。 ### 回答3: delphi-opencv是一个利用Delphi语言结合OpenCV库进行图像处理的工具。而IplImage是OpenCV中一种表示图像的结构,人脸对比是指通过比较两张图像中的人脸部分来判断是否为同一人。 要实现人脸对比的代码,首先需要安装Delphi-opencv并导入相关的模块和库。然后,加载两张待对比的图像,并使用OpenCV的人脸检测功能来检测图像中的人脸。 在Delphi中,可以使用cvLoadImage函数加载图像,并使用cvHaarDetectObjects函数来检测人脸。这些函数需要传入图像路径、人脸检测器模型等参数。检测到的人脸将通过矩形框表示。 接下来,可以使用OpenCV的人脸识别算法来提取人脸特征。可以使用cvEigenDecomposite函数来对人脸图像进行特征提取,并得到对应的特征向量。 最后,通过计算两个特征向量之间的相似度来判断两张图像中的人脸是否为同一人。一种常用的相似度计算方法是计算特征向量之间的欧几里得距离或余弦相似度。 需要注意的是,人脸对比的准确性受到人脸检测和特征提取的影响。为了获得更好的准确性,可以使用更精确的人脸检测器模型,或者使用更复杂的特征提取算法。 总结起来,通过使用Delphi-opencv和IplImage,可以实现人脸对比的代码。这个代码包括加载图像、人脸检测、特征提取和相似度计算等步骤。通过这个代码,可以实现对两张图像中人脸的对比,并判断是否为同一人。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值