作者:RayChiu_Labloy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
目录
背景:
思路:
代码:
背景:
目标物体固定大小,目标中包含圆形轮廓以及直线边缘,想将目标摆正角度并且x、y方向平移至固定位置。
(倾斜并且不在规定位置的目标图)
思路:
需要将固定大小的目标物体先矫正角度(利用关键边缘线进行霍夫线变换后计算角度,然后仿射变换矫正角度),然后想通过找到圆心确定需要x、y方向平移的幅度。
找圆心第一个想到的是霍夫圆变换 HoughCircles(),但是发现找到的圆和圆心不太准确。
后来尝试了轮廓的椭圆拟合 fitEllipse() ,发现效果比较好,如下图。
代码:
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
//只输出最顶层轮廓 baseCny是canny边缘检测后的Mat
findContours(baseCny, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);for (int i = 0; i < contours.size(); i++)
{RotatedRect ellipse_rect = fitEllipse(contours[i]);//获取椭圆的长轴和短轴长度(外接矩形的长和宽)int w = ellipse_rect.size.width;int h = ellipse_rect.size.height;//椭圆的中心坐标Point center = ellipse_rect.center;//绘制拟合椭圆ellipse(imgEnd, ellipse_rect, Scalar(0, 0, 255), 1, 8);
}
/*// 找到扁形工件的左上角圆,然后比较模板中的位置,确定仿射变换的值
vector<Vec3f> unknownSurfaceCircles;
cv::HoughCircles(baseCny, unknownSurfaceCircles, HOUGH_GRADIENT, 1, 80, 100, 15, 10, 15);
if (unknownSurfaceCircles.size() < 1) {cout << "图片中没有找到圆" << endl;
}
//在原图中画出圆心和圆
for (size_t i = 0; i < unknownSurfaceCircles.size(); i++)
{//提取出圆心坐标Point center(cvRound(unknownSurfaceCircles[i][0]), cvRound(unknownSurfaceCircles[i][1]));//提取出圆半径int radius = cvRound(unknownSurfaceCircles[i][2]);//圆心circle(imgEnd, center, 3, Scalar(0, 255, 0), -1, 8, 0);//圆circle(imgEnd, center, radius, Scalar(0, 0, 255), 1, 8, 0);
}*/
【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】