嘿,我正在进行过去两周的道路标志检测项目,我遇到了从图像中检测椭圆的主要问题。任何人都告诉我如何处理这个问题!!!你可以看到结果和code.Thanks
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(GreyImage, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
for (size_t i = 0; i < contours.size(); i++)
{
Mat pointsf;
Mat(contours[i]).convertTo(pointsf, CV_32F);
RotatedRect box = fitEllipse(pointsf);
ellipse(OrignalImg, box, Scalar(0, 0, 255), 1, 8);
}
答案 0 :(得分:3)
该函数计算最适合(在最小二乘意义上)一组2D点的椭圆。
只要你传递一个轮廓,它就会适合一个椭圆。这是什么意思?好吧考虑一下积分清单。如果我通过了表示矩形(角落)的点,则可能的输出将是绘制的椭圆。
上面的矩形实际上会找到一个椭圆,以便没有错误&#39;因为它适合使用矩形的角落。在其他情况下,它将尝试找到适合减少误差的椭圆(例如在带有多边形的图像中)。没关系,只要你传递图像中接近椭圆的轮廓。
轮廓(由findContours返回)定义为分隔区域的线条。这些区域可以是正方形,三角形或几乎任何形状。您将这些轮廓传递给fitEllipse函数;也就是说,你制作一个通过这些轮廓的椭圆,无论这些轮廓是否实际代表椭圆。
正如@Micka所说,在尝试制作(拟合)椭圆之前,您需要检查给定轮廓是否实际上是椭圆。可以使用各种方法在StackOverflow中找到示例,例如HoughCircles,MatchShape,HuTransforms和RANSAC: