zoukankan      html  css  js  c++  java
  • 【OpenCV学习笔记】三十、轮廓特征属性及应用(七)—位置关系及轮廓匹配

    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  ",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;
        }

         

  • 相关阅读:
    算法题:单调递增的数字
    算法题:搜索旋转排序数组
    算法题:K个一组翻转链表
    django错误
    virtualenvwrapper出错
    谷歌浏览器css样式不显示问题
    Python爬取豆瓣电子书信息
    flask secret key的作用
    【Hibernate】--实体状体与主键生成策略
    【Struts2+Spring3+Hibernate3】SSH框架整合实现CRUD_1.3
  • 原文地址:https://www.cnblogs.com/jukan/p/7813065.html
Copyright © 2011-2022 走看看