轮廓特征属性及应用(七)—位置关系及轮廓匹配

1.计算点与轮廓的距离及位置关系——pointPolygonTest()

2.矩的计算——moments()

3.形状匹配(比较两个形状或轮廓间的相似度)——matchShapes()

先上ppt:

opencv 轮廓 模板匹配 python opencv 轮廓匹配 获取坐标_#pragma

 

opencv 轮廓 模板匹配 python opencv 轮廓匹配 获取坐标_#include_02

 

opencv 轮廓 模板匹配 python opencv 轮廓匹配 获取坐标_相似度_03

 

opencv 轮廓 模板匹配 python opencv 轮廓匹配 获取坐标_人工智能_04

 

opencv 轮廓 模板匹配 python opencv 轮廓匹配 获取坐标_#include_05

代码:1.计算点到轮廓的距离与位置关系

 

1. ///计算点到轮廓的距离与位置关系  
2. #include "opencv2/opencv.hpp"  
3. using namespace cv;  
4. #include <iostream>  
5. using namespace std;  
6. int main()  
7. {  
8. //1.查找轮廓前的预处理  
9. "00.png",CV_LOAD_IMAGE_COLOR);  
10.     Mat copyImg = srcImg.clone();  
11.     cvtColor(srcImg,srcImg,CV_BGR2GRAY);  
12. //确保黑中找白  
13. "thresh",srcImg);  
14. //2.查找轮廓  
15.     vector<vector<Point>> contours;  
16. //最外层轮廓  
17.     drawContours(copyImg, contours, -1, Scalar(0, 255, 0), 2, 8);  
18. //3.计算点到轮廓的距离与位置关系  
19.     Point2f p1(20, 20);  
20.     circle(copyImg,p1,3,Scalar(0,0,255),-1,8);  
21. double a0 = pointPolygonTest(contours[0], p1, true);//true表示点到轮廓的距离  
22. double b0 = pointPolygonTest(contours[0], p1, false);//false表示计算点与轮廓的位置关系  
23. "a0=" << a0 << endl;  
24. "b0=" << b0 << endl;  
25. "contours",copyImg);  
26.     waitKey(0);  
27. return 0;  
28. }

运行结果:

opencv 轮廓 模板匹配 python opencv 轮廓匹配 获取坐标_#pragma_06

 

代码:2.轮廓矩的计算

 


1. ///轮廓矩的计算  
2. #include "opencv2/opencv.hpp"  
3. using namespace cv;  
4. #include <iostream>  
5. using namespace std;  
6. int main()  
7. {  
8. //1.查找轮廓前的预处理  
9. "00.png", CV_LOAD_IMAGE_COLOR);  
10.     Mat copyImg = srcImg.clone();  
11.     cvtColor(srcImg, srcImg, CV_BGR2GRAY);  
12. //确保黑中找白  
13. "thresh", srcImg);  
14. //2.查找轮廓  
15.     vector<vector<Point>> contours;  
16. //最外层轮廓  
17.     drawContours(copyImg, contours, -1, Scalar(0, 255, 0), 2, 8);  
18. //3.轮廓矩的计算  
19. false);//计算轮廓矩  
20. //输出空间矩之一的m00  
21. "contours", copyImg);  
22.     waitKey(0);  
23. return 0;  
24. }

 

运行结果:

opencv 轮廓 模板匹配 python opencv 轮廓匹配 获取坐标_#include_07

代码:3.形状匹配---比较两个形状或轮廓间的相似度

 

 

1. ///形状匹配---比较两个形状或轮廓间的相似度  
2. #include "opencv2/opencv.hpp"  
3. using namespace cv;  
4. #include <iostream>  
5. using namespace std;  
6. int main()  
7. {  
8. //1.查找模版图像的轮廓  
9. "1.jpg", CV_LOAD_IMAGE_COLOR);  
10.     Mat copyImg1 = templateImg.clone();  
11.     cvtColor(templateImg, templateImg, CV_BGR2GRAY);  
12. //确保黑中找白  
13. "thresh1", templateImg);  
14.     vector<vector<Point>> contours1;  
15. //最外层轮廓  
16.     drawContours(copyImg1, contours1, -1, Scalar(0, 255, 0), 2, 8);  
17. //2.查找待测试图像的轮廓  
18. "2.jpg", CV_LOAD_IMAGE_COLOR);  
19.     Mat copyImg2 = testImg.clone();  
20.     cvtColor(testImg, testImg, CV_BGR2GRAY);  
21. //确保黑中找白  
22. "thresh2", testImg);  
23.     vector<vector<Point>> contours2;  
24. //最外层轮廓  
25. //3.形状匹配---比较两个形状或轮廓间的相似度  
26. for (int i = 0; i < contours2.size();i++)//遍历待测试图像的轮廓  
27.     {  
28. //返回此轮廓与模版轮廓之间的相似度,a0越小越相似  
29. double a0 = matchShapes(contours1[0],contours2[i],CV_CONTOURS_MATCH_I1,0);  
30. "模版轮廓与待测试图像轮廓" << i << "的相似度:" << a0 << endl;//输出两个轮廓间的相似度  
31. if (a0<0.1)//如果此轮廓与模版轮廓的相似度小于0.1  
32.         {  
33. //则在待测试图像上画出此轮廓  
34.         }  
35. "copyImg2", copyImg2);  
36. if (waitKey(0) == 27)//等待按键进行下一个轮廓,ESC则退出  
37.         {  
38. "ESC退出" << endl;  
39. break;  
40.         }  
41.     }  
42.     waitKey(0);  
43. return 0;  
44. }

 

运行结果:

opencv 轮廓 模板匹配 python opencv 轮廓匹配 获取坐标_#pragma_08

 

图像与轮廓的相似度匹配

1 普通局

2 中心距:平移不变性

3 归一化中心距:缩放不变性

4 hu矩:旋转不变性

 

iplImage* img=cvload("xxxxx");
//计算普通局和中心距
CvMoments moment;
cvMoments(img,&moment,2);//第三个参数:>0  0/1组成图像
 
//计算hu矩
CVHuMoments humoment;
cvGetHuMoments(&moment,&humoment);


 

图像1---》hu矩

图像2---》hu矩

通过比较 图像1和2 的hu矩 --- 值越小 相似度就越大。

 


 

1. // contourMatch.cpp : Defines the entry point for the console application.  
2. //  
3.   
4. #include "stdafx.h"  
5. #include "cv.h"  
6. #include "highgui.h"  
7. #include "cxcore.h"  
8. #include "cvaux.h"  
9.   
10.   
11.   
12. //www.opencvchina.com  
13.   
14. int main(int argc, char* argv[])  
15. {  
16.   
17.   
18. //产生一幅图像  
19.     IplImage* src;  
20.     src = cvCreateImage(cvSize(10,10),8,1);  
21.       
22. //图像初始值清零  
23.     cvZero(src);  
24.   
25. //图像的前面5行5列赋值为255  
26. for(int yy=0;yy<5;yy++)  
27.     {  
28. for(int xx=0;xx<5;xx++)  
29.         {  
30.             cvSetReal2D(src,yy,xx,255);  
31.         }  
32.     }  
33.   
34. double m00,m10,m01;  
35.   
36. //定义矩变量  
37.     CvMoments moment;  
38.   
39. //计算原始矩和中心矩  
40.     cvMoments(src,&moment,2);  
41.   
42.     m00 = cvGetSpatialMoment(&moment,0,0);  
43.     m10 = cvGetSpatialMoment(&moment,1,0);  
44.     m01 = cvGetSpatialMoment(&moment,0,1);  
45.   
46. //计算质心坐标  
47. float x = (float)(m10/m00);  
48. float y = (float)(m01/m00);  
49.   
50. //定义hu矩变量  
51.     CvHuMoments humoment;  
52.   
53. //计算hu矩  
54.     cvGetHuMoments(&moment,&humoment);  
55.   
56. return 0;  
57. }

 

OPencv 比较hu矩的函数(已经封装的上述的运算)

 

CvSeq* contours1=通过函数获取img的轮廓 指针。

CvSeq* contours1=通过函数获取img的轮廓 指针。

double result=cvMatchShapes(contours1,contours2,1);//第三个参数 为比较的方式。 输出比较的相似度浮点值。

 

 



1. #pragma comment(lib,"cxcore.lib")  
2. #pragma comment(lib,"cv.lib")  
3. #pragma comment(lib,"highgui.lib")  
4. #pragma comment(lib,"ml.lib")  
5. #pragma comment(lib,"cvcam.lib")  
6. #pragma comment(lib,"cvaux.lib")  
7.   
8.   
9. #include <stdio.h>  
10. #include <iostream>  
11.   
12. #include <cv.h>  
13. #include <cxcore.h>  
14. #include <highgui.h>  
15.   
16. using namespace std;  
17.   
18. CvSeq* getImageContous(IplImage* srcin)  
19. {   
20.     IplImage*src;  
21.     src=cvCreateImage(cvGetSize(srcin),8,1);  
22.     cvCopy(srcin,src);  
23.   
24.     CvMemStorage* mem=cvCreateMemStorage(0);  
25.     CvSeq* seq;  
26.   
27. if (!mem)  
28.     {  
29. "mem is null");  
30.     }  
31.   
32. // 二值化  
33. sizeof(CvContour),CV_RETR_CCOMP);  
34.   
35.     cvReleaseImage(&src);  
36.   
37. return seq;  
38.   
39. }  
40.   
41. int main()  
42. {  
43.   
44. "img//contour.jpg",CV_LOAD_IMAGE_GRAYSCALE);  
45.     CvSeq* contours1=getImageContous(src1);  
46.   
47. "img//carno//2.bmp",CV_LOAD_IMAGE_GRAYSCALE);  
48.     CvSeq* contours2=getImageContous(src2);  
49.   
50.   
51. double result=cvMatchShapes(contours1,contours2,1);  
52. "%f \n",result);  
53.   
54.       
55.   
56.     cvWaitKey(0);  
57. //release  
58.   
59.     cvReleaseImage(&src1);  
60.     cvReleaseImage(&src2);  
61.   
62.   
63. return 0;  
64. }
65. 

               #include "cv.h"              


               #include "cxcore.h"              


               #include "highgui.h"              


               #include <iostream>              


               #include "function.h"              


               int                MatchContour(               int                argc,               char               ** argv)              


               {              


               IplImage *Src1=cvLoadImage(               "e:\\picture\\jiantou.jpg"               ,0);              


               IplImage *Src2=cvLoadImage(               "e:\\picture\\jiantou2.jpg"               ,0);              


               IplImage *BinaryImage1=cvCreateImage(cvGetSize(Src1),Src1->depth,1);              


               IplImage *BinaryImage2=cvCreateImage(cvGetSize(Src2),Src2->depth,1);              


               IplImage *SrcColor1=cvCreateImage(cvGetSize(Src1),Src1->depth,3);              


               IplImage *SrcColor2=cvCreateImage(cvGetSize(Src2),Src2->depth,3);              


               cvThreshold(Src1,BinaryImage1,100,255,CV_THRESH_BINARY);              


               cvThreshold(Src2,BinaryImage2,100,255,CV_THRESH_BINARY);              


               CvMemStorage* storage1=cvCreateMemStorage(0);              


               CvMemStorage* storage2=cvCreateMemStorage(0);              


               CvSeq* ContourSeq1=NULL;              


               CvSeq* ContourSeq2=NULL;              


               cvFindContours(BinaryImage1,storage1,&ContourSeq1,               sizeof               (CvContour));              


               cvFindContours(BinaryImage2,storage2,&ContourSeq2,               sizeof               (CvContour));              


               cvCvtColor(Src1,SrcColor1,CV_GRAY2BGR);              


               cvCvtColor(Src2,SrcColor2,CV_GRAY2BGR);              


               cvDrawContours(              


               return                0;              


               }