精华内容
下载资源
问答
  • OpenCV轮廓匹配

    2019-03-19 14:45:03
    把模板图像要匹配的图像(该图像可以包含多个模板图像,可以是旋转拉伸过的)路径输入后即可进行匹配,并画出匹配图像
  • 当对平面物体进行视觉定位时,往往采用图像模板匹配的方式,然而当目标含有一定角度的旋转时,如何精确估算出旋转角度成了一个难题。下面是博主根据自己的理解所做的一个小的总结,也能算纠结,欢迎高手围观。 1 ...

    当对平面物体进行视觉定位时,往往采用图像模板匹配的方式,然而当目标含有一定角度的旋转时,如何精确估算出旋转角度成了一个难题。下面是博主根据自己的理解所做的一个小的总结,也能算纠结,欢迎高手围观。

    1 基于灰度的模板匹配(NCC等)

        用灰度模板进行模板匹配,往往耗时,并且要匹配含有旋转的目标,就需要建立多角度的模板。如果目标的角度范围是(-30°,30°),以1°为步幅,则需要60个模板,如果要把精度提高到0.1°,那至少要600个模板。显然是不太理想的方式。

    2 图像主轴角的旋转匹配

    当图像噪声较大、形状对比度不鲜明时,主轴角不准确,进而估算出的旋转角度误差较大。

    3 点模式匹配

    通过分别提取模板和目标图像中的特征点,建立对应关系,求得仿射变换参数。这种方式只对一定的目标适用,如果图像噪声大,并且形状是圆等,就很难提取出合适的角点。

    4 sift(仿射无关特征变换)

    这种方式也是可以的,只是对于噪声较大的图像还是不行,计算量大,提出的特征点往往很多,工业上对时间有较大要求,sift还是多用于立体匹配,用在平面检测中还是有点大材小用了。

    5 边缘几何特征旋转角度估计

    这种方法显然非常依赖边缘,如果目标含有缺陷,估算出的角度精度仍然不足。能够使得精度达到1°已经很不错了。

    7 矩方法

    这种方法进行模板匹配,估算位置和角度,当图像噪声大,难以二值化时,就不好办了。

    8 广义霍夫变换

    第一比较依赖边缘提取精度,然后就是耗时的问题。

    9 梯度直方图

    建立梯度直方图,角度精度也很难到达0.2°甚至更高。

     

    在平面模板匹配方面,Halcon已经做的很好了,而且算法很通用,速度精度都能达到工业要求,只是商业软件的核心思想很难摸透。

    要想通过模板匹配快速估算出精确的旋转角度,最终还是要插值或者拟合。

    对于含有噪声的多目标匹配定位,还是有很多需要研究的地方,希望高手能提供宝贵建议!

    原文:https://blog.csdn.net/lsh_2013/article/details/4765746

    展开全文
  • 图像轮廓匹配图像的几何矩和Hu矩图像轮廓匹配计算 图像的几何矩和Hu矩 几何矩 几何矩是由Hu(Visual pattern recognition by moment invariants)在1962年提出的,具有平移、旋转和尺度不变性。 定义如下: Hu矩 ...

    图像的几何矩和Hu矩

    • 几何矩
      几何矩是由Hu(Visual pattern recognition by moment invariants)在1962年提出的,具有平移、旋转和尺度不变性。 定义如下:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
    • Hu矩
      在这里插入图片描述

    图像轮廓匹配计算

    • 基于Hu矩轮廓匹配
      在这里插入图片描述
    • 相关API: momentsHuMomentsmatchShapes
    //计算几何矩
    CV_EXPORTS_W Moments moments( InputArray array, bool binaryImage = false );
    //计算Hu矩
    CV_EXPORTS_W void HuMoments( const Moments& m, OutputArray hu );
    //轮廓匹配
    CV_EXPORTS_W double matchShapes( InputArray contour1, InputArray contour2,
                                     int method, double parameter );
    

    其中 matchShapes的method有三种:CONTOURS_MATCH_I1 、CONTOURS_MATCH_I2 、CONTOURS_MATCH_I3,返回值越小说明轮廓相似程度越高!

    //获取图像轮廓方法
    void contour_info(Mat &image, vector<vector<Point>>&contours);
    
    //图像轮廓匹配
    int main(int argc, char** argv) {
    
    	Mat src1 = imread("F:/code/images/abc.png");
    	Mat src2 = imread("F:/code/images/a5.png");
    	CV_Assert(!src1.empty());
    	CV_Assert(!src2.empty());
    	imshow("input1", src1);
    	imshow("input2", src2);
    
    	vector<vector<Point>>contours1;
    	vector<vector<Point>>contours2;
    
    	//获取轮廓
    	contour_info(src1, contours1);
    	contour_info(src2, contours2);
    	
    	//轮廓Hu计算
    	//将src2中的一个轮廓作为模板,在src1中的很多轮廓中查找匹配
    
    	//src2 
    	Moments mm2 = moments(contours2[0]);
    	Mat Hu2;
    	HuMoments(mm2, Hu2);
    
    	//src1
    	for (size_t t = 0; t < contours1.size(); t++) {
    		Moments mm1 = moments(contours1[t]);
    		
    		//可以获取轮廓的中心位置
    		double cx = mm1.m10 / mm1.m00;
    		double cy = mm1.m01 / mm1.m00;
    		circle(src1, Point(cx, cy), 3, Scalar(255, 0, 0), 2, 8, 0);
    		
    		Mat Hu1;
    		HuMoments(mm1, Hu1);
    		double dist = matchShapes(Hu1, Hu2, CONTOURS_MATCH_I1, 0);
    		printf("matched distance value: %.2f\n", dist);
    		if (dist < 1) {
    			drawContours(src1, contours1, t, Scalar(0, 0, 255), 2, 8);
    		}
    	}
    	imshow("match contours demo", src1);
    
    
    	waitKey(0);
    	destroyAllWindows();
    	return 0;
    }
    
    void contour_info(Mat& image, vector<vector<Point>>& contours) {
    
    	Mat dst;
    	//高斯滤波
    	GaussianBlur(image, dst, Size(3, 3), 0);
    	
    	//得到灰度图
    	Mat gray, binary;
    	cvtColor(dst, gray, COLOR_RGB2GRAY);
    	
    	//得到二值图
    	threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
    
    	//发现轮廓
    	vector<Vec4i> hierarchy;//层次信息
    	findContours(binary, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());//RETR_EXTERNAL 获取最大的轮廓
    	printf("%llu\n", contours.size());
    }
    

    在这里插入图片描述

    展开全文
  • 图像轮廓匹配

    千次阅读 2017-05-29 22:08:28
    (1)普通矩: 图像概率密度分布函数为f(x,y)的二维连续随机函数的p+q阶原点矩m_pq 各阶矩的物理意义: ...2阶矩(m_02,m_11,m_20)-------表示旋转半径 3阶矩(m_03,m_12,m_21,m_30)--描述目标的
    (1)普通矩:
    图像概率密度分布函数为f(x,y)的二维连续随机函数的p+q阶原点矩m_pq

    各阶矩的物理意义:
    0阶矩(m_00)-----------------为目标区域的质量
    1阶矩(m_01,m_10)------------表示目标区域的质心
    2阶矩(m_02,m_11,m_20)-------表示旋转半径
    3阶矩(m_03,m_12,m_21,m_30)--描述目标的方位和斜度,反应目标的扭曲程度

        但矩要能够作为一种特征描述方法得到运用,其要与目标的空间变换(平移、尺度、旋转)无关。因此在几何矩的基本定义基础上,进一步构造平移不变、尺度不变、旋转不变矩阵。
    (2)中心矩:构造平移不变性
    质心坐标:
    为使矩具有平移不变性,利用质心坐标构造中心矩:

    (3)归一化中心矩:构造尺度不变性
    为抵消尺度变化对中心矩的影响,用零阶中心矩μ_00(表示面积)对其余各阶中心矩进行归一化处理,得到归一化中心矩为

    (4)hu矩:构造旋转不变性

        这样七个矩(可以理解为七个数值)构成了一个七维向量,即:我们可以用一个七维向量来描述一个图像或轮廓,这个向量具有以上三种不变性。
        由Hu矩组成的特征量对图片进行识别,优点就是速度很快,缺点是识别率比较低,Hu不变矩一般用来识别图像中大的物体,对于物体的形状描述得比较好,图像的纹理特征不能太复杂,像识别水果的形状,或者对于车牌中的简单字符的识别效果会相对好一些。

    OpenCV中实现:
    普通矩、中心矩和hu矩的计算
    1. void cvMoments( const CvArr* arr, CvMoments* moments, int binary V_DEFAULT(0));  
    2. //arr:图像(1-通道或3-通道,有COI设置)或多边形(点的CvSeq或一族点的向量)  
    3. //moments:返回矩状态接口的指针  
    4. //binary:(仅对图像)如果标识为非零,则所有零像素点为0,其它的被看成1  
    5. /*函数cvMoments 计算最高达三阶的空间和中心矩,并且将结果存在结构moments 中、矩用来计算形状的重心、面积、主轴和其它形状特征,如 7Hu 不变量等*/  
    6.   
    7. void cvGetHuMoments( CvMoments* moments, CvHuMoments* hu_moments );  
    8. //moments:返回矩状态接口的指针  
    9. //hu_moments:矩阵结构的指针  
    代码如下:
    1. #include "stdafx.h"  
    2. #include "cv.h"  
    3. #include "highgui.h"  
    4. #include "cxcore.h"  
    5. #include "cvaux.h"  
    6.   
    7. int main(int argc, char* argv[])  
    8. {  
    9.     //产生一幅图像  
    10.     IplImage* src;  
    11.     src = cvCreateImage(cvSize(10,10),8,1);  
    12.     //图像初始值清零  
    13.     cvZero(src);  
    14.     //图像的前面5行5列赋值为255  
    15.     for(int yy=0;yy<5;yy++)  
    16.     {  
    17.         for(int xx=0;xx<5;xx++)  
    18.         {  
    19.             cvSetReal2D(src,yy,xx,255);  
    20.         }  
    21.     }  
    22.   
    23.     double m00,m10,m01;  
    24.   
    25.     //定义矩变量  
    26.     CvMoments moment;  
    27.     //计算原始矩和中心矩  
    28.     cvMoments(src,&moment,2);  
    29.   
    30.     m00 = cvGetSpatialMoment(&moment,0,0);  
    31.     m10 = cvGetSpatialMoment(&moment,1,0);  
    32.     m01 = cvGetSpatialMoment(&moment,0,1);  
    33.   
    34.     //计算质心坐标  
    35.     float x = (float)(m10/m00);  
    36.     float y = (float)(m01/m00);  
    37.   
    38.     //定义hu矩变量  
    39.     CvHuMoments humoment;  
    40.   
    41.     //计算hu矩  
    42.     cvGetHuMoments(&moment,&humoment);  
    43.   
    44.     return 0;  
    45. }  

    轮廓匹配
    1. double cvMatchShapes( const void* object1, const void* object2,  
    2. int method, double parameter CV_DEFAULT(0));  
    3. //object1:第一个轮廓或灰度图像  
    4. //object2:第二个轮廓或灰度图像  
    5. //method:比较方法  
    6. //parameter:比较方法的参数  
    代码如下:
    1. #include "stdafx.h"  
    2. #include "highgui.h"  
    3. #include "cv.h"  
    4. #include "cxcore.h"  
    5.   
    6. /* 
    7. *函数功能:获取输入图像 的轮廓 
    8. *输入:  
    9. *srcIn : 单通道图像 
    10. *返回: 
    11. *CvSeq* : 存储轮廓信息 
    12. */  
    13. CvSeq* getImageContour(IplImage* srcIn)  
    14. {  
    15.     IplImage* src;  
    16.     src = cvCreateImage(cvGetSize(srcIn),8,1);    
    17.     //拷贝图像   
    18.     cvCopy(srcIn,src);  
    19.     //创建空间  
    20.     CvMemStorage* mem = cvCreateMemStorage(0);  
    21.     CvSeq* seq;  
    22.     if(!mem)  
    23.     {  
    24.         printf("mem is null");  
    25.     }  
    26.     //二值化图像  
    27.     cvThreshold(src,src,100,255,0);  
    28.     //计算图像轮廓  
    29.     cvFindContours(src,mem,&seq);//,sizeof(CvContour),CV_RETR_CCOMP);  
    30.     //释放图像空间  
    31.     cvReleaseImage(&src);  
    32.     //返回轮廓信息  
    33.     return seq;  
    34. }  
    35.   
    36.   
    37. int main(int argc, char* argv[])  
    38. {  
    39.     //加载图像1  
    40.     IplImage* src1 = cvLoadImage("lena.jpg", 0);  
    41.     //获取图像1的轮廓  
    42.     CvSeq* contour1;  
    43.     contour1 = getImageContour(src1);  
    44.   
    45.     //加载图像2  
    46.     IplImage* src2 = cvLoadImage("char2.png",CV_LOAD_IMAGE_GRAYSCALE);  
    47.     //获取图像2的轮廓  
    48.     CvSeq* contour2;  
    49.     contour2 = getImageContour(src2);  
    50.   
    51.     //进行比对  
    52.     double result;  
    53.     result = cvMatchShapes(contour1,contour2,1);  
    54.     //输出结果  
    55.     printf("result is %f \n",result);  
    56.     getchar();  
    57.   
    58.     //释放轮廓存储空间  
    59.     cvReleaseMemStorage(&contour1->storage);  
    60.     cvReleaseMemStorage(&contour2->storage);  
    61.     //释放图像空间  
    62.     cvReleaseImage(&src1);  
    63.     cvReleaseImage(&src2);  
    64.   
    65.     return 0;  
    66. }  

    原文地址:http://blog.csdn.net/cp32212116/article/details/38374015
    展开全文
  • 摘 要:首先对轮廓曲线进行多边形近似,然后通过Hermite插值曲线求出多边形各顶点的曲率作为特征,最后以Hausdorff距离 为准则进行轮廓线匹配。算法充分利用了轮廓线的几何信息,...关键词:轮廓匹配;曲率; Hausdorff距离
  • 图像中的几何变换 vector_to_hom_mat2d:输入的是数组,得到平移旋转缩放斜切矩阵 vector_angle_to_rigid:输入的是一个点,只得到平移旋转的矩阵 轮廓匹配

    图像中的几何变换

    在这里插入图片描述
    vector_to_hom_mat2d:输入的是数组,得到平移旋转缩放斜切矩阵
    vector_angle_to_rigid:输入的是一个点,只得到平移旋转的矩阵
    在这里插入图片描述
    在这里插入图片描述

    轮廓匹配

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    定位测量:

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 第20集 图像轮廓匹配

    2014-08-14 16:56:15
    图像轮廓匹配时减少和消除图像缩放,平移,旋转造成的影响计算普通矩和中心矩(cvMoments)通过普通矩和中心矩计算hu矩(cvGetHuMoments)可直接用cvMatchShapes比较两幅图像的相似度程序:#include"cv.h" ...
  • Hu矩图像轮廓匹配

    千次阅读 2017-04-06 17:51:04
    1.1普通矩的计算 图像概率密度分布函数为f(x,y)的二维...2阶矩(m02, m20, m11)表示旋转半径 3阶矩(m03, m30, m12, m21)描述目标的方位和斜度,反应目标的扭曲程度 但矩要能够作为和种特征描述方法得到应用,其要与目
  • 基于HU矩的轮廓匹配

    2020-09-06 15:31:52
    HU矩具备旋转、平移、缩放不变性。 void findcontours(Mat &image, vector<vector<Point>> &contours) { Mat gray, binary; vector<Vec4i> hierarchy; //图像灰度化 cvtColor(image, ...
  • 图像和轮廓匹配(hu矩)

    千次阅读 2016-12-14 15:02:54
    图像和轮廓匹配(hu矩) (1)hu矩的概念,我也总结了但是我不过多的阐述,因为我也不是太理解,只知道它具有平移,旋转,尺度不变性,详细见别人的这篇blog:...
  • 二值图像分析—Hu矩实现轮廓匹配

    千次阅读 2019-11-06 22:25:28
    Hu矩由于具有尺度、旋转、平移不变性,可以用来做匹配。 Hu不变矩主要是利用归一化中心矩构造了7个不变特征矩,由二阶矩和三阶矩可以导出7个不变矩: opencv中计算Hu矩函数 说明 该函数计算7个Hu不变量。 这些值被...
  • 常见的矩描述自可以分为以下几种:几何矩、正交矩、复数矩和旋转矩。 图像的几何矩,这里的图像指的是单同道,也就是灰度图像。我们把图像可以看成是一个平板的物体,每个像素点的值看成是该处的密度。对某点求期望...
  • 基于轮廓的模板匹配

    千次阅读 2020-03-23 08:40:15
    基于灰度的匹配一般应用在没有缩放和旋转,颜色变化不大的场合。基于特征的匹配一般应用在具有缩放和旋转,颜色变化较大的场合。在模板各个组件有相对位移的情况下,使用基于组件的匹配算法。在图像模糊,目标定位不...
  • 基于灰度的匹配一般应用在没有缩放和旋转,颜色变化不大的场合。基于特征的匹配一般应用在具有缩放和旋转,颜色变化较大的场合。在模板各个组件有相对位移的情况下,使用基于组件的匹配算法。在图像模...
  • 基于目标轮廓的图像匹配,首先需要能够较为准确提取目标的轮廓。能够抗一定的光照影响,遮挡影响,耗时比传统图像的模板匹配快。如果需要旋转角度的话,可以使用二分法或者每隔一定角度重复调用。 该代码是基于...
  • 带微小缩放和旋转的模板匹配

    千次阅读 2020-04-03 18:33:49
    问题提出: ...带有旋转和缩放,首先想到使用外轮廓进行Hu矩匹配,然后根据外轮廓周长比例和面积开方的比例确定缩放系数,根据轮廓最小包围旋转矩形的角度差确定旋转角度。这个思路要求目标外轮廓不...
  • 梯度方向取整后可能的方向是360个,对模板轮廓上的点(xc, yc)(通过Canny算子与Sobel算子检测)求出其梯度方向取整,并且轮廓上的点与参考点之间有一个相对位置(xc- xo, yc- yo),将所以轮廓点的相对位置坐标根据...
  • 图像和轮廓匹配(hu矩)  (1)hu矩的概念,我也总结了但是我不过多的阐述,因为我也不是太理解,只知道它具有平移,旋转,尺度不变性,详细见别人的这篇blog:...
  • 目前对图像的旋转,缩放情况下的轮廓匹配的方法一般是,对模板图像和待匹配的图像均进行金字塔下采样,缩小图像的大小,减小计算量。然后穷举法暴力匹配,就是每旋转一个角度,缩放一个尺寸,就匹配一次。在上层的...
  • 图像与轮廓的相似度匹配

    千次阅读 2014-03-16 01:23:20
    普通局 中心距:平移不变性 归一化中心距:缩放不变性 hu矩:旋转不变性
  • 图像和轮廓匹配(hu矩)  (1)hu矩的概念,我也总结了但是我不过多的阐述,因为我也不是太理解,只知道它具有平移,旋转,尺度不变性,详细见别人的这篇blog:...
  • 为了获取鲁棒的特征区域, 提出了一种基于轮廓旋转和...进行了特征匹配的实验, 图像集包含旋转、尺度、仿射、光照和压缩五种变换, 算法获得了很好的匹配结果。结果表明算法简单快速, 具有较强的鲁棒性和广泛的应用性。
  • 以[X、][Y]方向向量为描述的关键轮廓点集为匹配特征,根据模板具体信息,计算最佳金字塔分层数、模板旋转角度步长和缩放步长,图像金字塔最高层则利用二级筛选策略,依据待测图优先剔除大量目标非潜在位置区域,仅对...
  • 如果能完成旋转匹配更接近于实用性. 当然要完成全角度匹配的难度是要量级数的提升. Download source - 140 KB Download demo - 138 KB Introduction Template matching is an image process...
  • 【opencv】图像和轮廓匹配(hu矩)

    千次阅读 2014-04-16 15:32:24
    图像的hu矩具有平移不变、尺度不变和旋转不变形。 (1)中心
  • 这是OPT小讲堂的第八课,主要讲解图像匹配算法中,灰度匹配、特征匹配、轮廓匹配这三种算法的原理、参数、案例等。什么是图像匹配图像匹配,是指以模板图像作为标准目标,在待匹配图像中寻找与标准目标相似性高的...
  • 目录 零之前言 一.轮廓检测 1.简述 2.实现 ①参数 ②返回值 二.绘制轮廓 ...三....②旋转矩形 ...三....2.轮廓匹配 零之前言 本节内容,书里的内容可能有些问题,需要额外的查询更多的博客,然后我...

空空如也

空空如也

1 2 3 4 5 6
收藏数 117
精华内容 46
关键字:

旋转轮廓匹配