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

你可能感兴趣的:(opencv,c#)