opencvsharp_基于轮廓的形状匹配中匹配坐标与旋转角度

Posted x1angzeeD.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencvsharp_基于轮廓的形状匹配中匹配坐标与旋转角度相关的知识,希望对你有一定的参考价值。

本篇博客不讲理论!

    需要看理论的这里附上三个博客:

① 一步一步实现多尺度多角度的形状匹配算法(C++版本)

② 图像的矩,以及利用矩求图像的重心,方向

③ OpenCV学习(十九) :图像的矩:moments(),HuMoments()


直接上干货!

    以下代码为定位零件的像素位置,旋转角度              emmmmm其他没有……

我们拿着模板(轮廓)去匹配的时候,找到的目标像素坐标为:

首先用Cv2.MatchShapes去筛选图像中的轮廓,然后筛选好的轮廓如果分值达到要求了就拿着这个筛选好的轮廓去计算他的位置坐标:

Moments M1; 
M1 = Cv2.Moments(contours);
double cX = M1.M10 / M1.M00;
double cY = M1.M01 / M1.M00;

那角度计算就需要用到模板轮廓了:

Moments M1; //目标物
M1 = Cv2.Moments(contours_img[min_pos]);
double cX = M1.M10 / M1.M00; double cY = M1.M01 / M1.M00;  //目标物的质心
float a1 = (float)(M1.M20 / M1.M00 - cX * cX);
float b1 = (float)(2 * (M1.M11 / M1.M00 - cX * cY));
float c1 = (float)(M1.M02 / M1.M00 - cY * cY);
double tanAngle1 = Cv2.FastAtan2(b1, a1 - c1) / 2;
// double tempAngle1 = tanAngle1 / 2;

Moments M2; //模板
M2 = Cv2.Moments(imgTemplateContours);
double ic = M2.M10 / M2.M00; double jc = M2.M01 / M2.M00;   //模板的质心
float a2 = (float)(M2.M20 / M2.M00 - ic * ic);
float b2 = (float)(2 * (M2.M11 / M2.M00 - ic * jc));
float c2 = (float)(M2.M02 / M2.M00 - jc * jc);
double tanAngle2 = Cv2.FastAtan2(b2, a2 - c2) / 2;

double aimAngle = tanAngle2 - tanAngle1;//这个即为旋转的角度(单位:°)

 

 

如果没看懂,点击这个链接研究研究

https://blog.csdn.net/qq_48705696/article/details/111059991?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162082631916780261995936%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=162082631916780261995936&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-4-111059991.pc_v2_rank_blog_default&utm_term=OpenCVSharp

以上是关于opencvsharp_基于轮廓的形状匹配中匹配坐标与旋转角度的主要内容,如果未能解决你的问题,请参考以下文章

如何利用OPENCV的matchShapes进行轮廓匹配

如何利用OPENCV的matchShapes进行轮廓匹配?

图像轮廓之形状匹配

两个相似形状之间的 OpenCV 形状匹配

OpenCV计算机图像处理 —— 凸性缺陷 + 点多边形测试 + 形状匹配 + 轮廓分层与cv.findContours()

OpenCV 查找图像的紧密匹配