opencv中的椭圆拟合

匿名 (未验证) 提交于 2019-12-03 00:32:02

首先贴一个最简单的程序:访问:https://blog.csdn.net/guduruyu/article/details/70069426

//创建一个用于绘制图像的空白图     cv::Mat image = cv::Mat::ones(480, 640, CV_8UC3);   //设置蓝色背景   image.setTo(cv::Scalar(100, 0, 0));      //输入拟合点     std::vector<cv::Point> points;      points.push_back(cv::Point(200, 240));   points.push_back(cv::Point(300, 400));   points.push_back(cv::Point(400, 360));   points.push_back(cv::Point(500, 300));   points.push_back(cv::Point(500, 200));   points.push_back(cv::Point(300, 150));      //将拟合点绘制到空白图上     for (int i = 0; i < points.size(); i++)   {       cv::circle(image, points[i], 5, cv::Scalar(0, 0, 255), 2, 8, 0);   }      //获取拟合椭圆的外包围矩形   cv::RotatedRect rotate_rect = cv::fitEllipse(points);   //绘制拟合椭圆   cv::ellipse(image, rotate_rect, cv::Scalar(0, 255, 255), 2, 8);      cv::imshow("image", image);   cv::waitKey(0);  

其次,这里有关于opencv椭圆拟合的各种定义:https://blog.csdn.net/suky520/article/details/18601307

opencv中的椭圆通过RotatedRect来定义,其center(块中心(x,y)), size(宽和高,宽小于高), angle(旋转角)分别对应椭圆的中心,短轴长轴

         RotatedRect box = fitEllipse(pointsf);              //把那些长轴与短轴之比很多的那些椭圆剔除。           if( MAX(box.size.width, box.size.height) > MIN(box.size.width, box.size.height)*8 )               continue;           //绘制轮廓           drawContours(cimage, contours, (int)i, Scalar::all(255), 1, 8);              //绘制椭圆           ellipse(cimage, box, Scalar(0,0,255), 1, CV_AA);           //绘制椭圆          // ellipse(cimage, box.center, box.size*0.5f, box.angle, 0, 360, Scalar(0,255,255), 1, CV_AA);  //注意这里需要乘以0.5
最后,目前opencv3中支持三种椭圆拟合方式:fitEllipse,fitEllipseAMS,fitEllipseDirect,其中第三种来自《


可以访问https://docs.opencv.org/trunk/de/dc7/fitellipse_8cpp-example.html


参考链接:

https://blog.csdn.net/suky520/article/details/18601307

https://www.cnblogs.com/as3asddd/p/7455712.html

3.

https://blog.csdn.net/guduruyu/article/details/70069426

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!