码迷,mamicode.com
首页 > 其他好文 > 详细

【OpenCV学习笔记】三十、轮廓特征属性及应用(七)—位置关系及轮廓匹配

时间:2017-11-10 10:55:17      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:syntax   ack   pat   scalar   lsp   处理   blank   amp   iostream   

http://blog.csdn.net/abc8730866/article/details/69219992

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

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

2.矩的计算——moments()

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

先上ppt:

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

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

 

[cpp] view plain copy
 
  1. ///计算点到轮廓的距离与位置关系  
  2. #include "opencv2/opencv.hpp"  
  3. using namespace cv;  
  4. #include <iostream>  
  5. using namespace std;  
  6. int main()  
  7. {  
  8.     //1.查找轮廓前的预处理  
  9.     Mat srcImg = imread("00.png",CV_LOAD_IMAGE_COLOR);  
  10.     Mat copyImg = srcImg.clone();  
  11.     cvtColor(srcImg,srcImg,CV_BGR2GRAY);  
  12.     threshold(srcImg,srcImg,100,255,CV_THRESH_BINARY);//确保黑中找白  
  13.     imshow("thresh",srcImg);  
  14.     //2.查找轮廓  
  15.     vector<vector<Point>> contours;  
  16.     findContours(srcImg,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);//最外层轮廓  
  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.     cout << "a0=" << a0 << endl;  
  24.     cout << "b0=" << b0 << endl;  
  25.     imshow("contours",copyImg);  
  26.     waitKey(0);  
  27.     return 0;  
  28. }  

 

运行结果:

技术分享

 

代码:2.轮廓矩的计算

 

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

 

运行结果:

技术分享

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

 

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

 

运行结果:

技术分享

 

图像与轮廓的相似度匹配

http://blog.csdn.net/zt271675484/article/details/21305893

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矩 --- 值越小 相似度就越大。

 

[cpp] view plain copy
 
  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);//第三个参数 为比较的方式。 输出比较的相似度浮点值。

 

 

[cpp] view plain copy
 
    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.         printf("mem is null");  
    30.     }  
    31.   
    32.     cvThreshold(src,src,200,255,CV_THRESH_BINARY);// 二值化  
    33.     cvFindContours(src,mem,&seq,sizeof(CvContour),CV_RETR_CCOMP);  
    34.   
    35.     cvReleaseImage(&src);  
    36.   
    37.     return seq;  
    38.   
    39. }  
    40.   
    41. int main()  
    42. {  
    43.   
    44.     IplImage* src1=cvLoadImage("img//contour.jpg",CV_LOAD_IMAGE_GRAYSCALE);  
    45.     CvSeq* contours1=getImageContous(src1);  
    46.   
    47.     IplImage* src2=cvLoadImage("img//carno//2.bmp",CV_LOAD_IMAGE_GRAYSCALE);  
    48.     CvSeq* contours2=getImageContous(src2);  
    49.   
    50.   
    51.     double result=cvMatchShapes(contours1,contours2,1);  
    52.     printf("%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;
      }

       

【OpenCV学习笔记】三十、轮廓特征属性及应用(七)—位置关系及轮廓匹配

标签:syntax   ack   pat   scalar   lsp   处理   blank   amp   iostream   

原文地址:http://www.cnblogs.com/jukan/p/7813065.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!