opencvsharp_基于轮廓的形状匹配中匹配坐标与旋转角度
Posted x1angzeeD.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencvsharp_基于轮廓的形状匹配中匹配坐标与旋转角度相关的知识,希望对你有一定的参考价值。
本篇博客不讲理论!
需要看理论的这里附上三个博客:
③ 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;//这个即为旋转的角度(单位:°)
如果没看懂,点击这个链接研究研究
以上是关于opencvsharp_基于轮廓的形状匹配中匹配坐标与旋转角度的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV计算机图像处理 —— 凸性缺陷 + 点多边形测试 + 形状匹配 + 轮廓分层与cv.findContours()