在Opencv中,求最小包围圆的函数:
他的方法是什么呢?怎么找出这个最小包围圆的呢?
为了方便理解源码,我新建了一个工程,把相关的源文件复制过来,再输入一张测试图,让代码跑起来看中间过程。
工程文件包括:
其中 my_minEnclosingCircle是main函数入口,其他文件从C:\...\opencv\sources\modules\... 路径下搜索,然后复制到该工程文件夹内。这样在代码中使用“转到定义”的时候就可以查看相关源码了,还可以用不同的测试图去测试。
main函数:
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat gray = imread("3.jpg",0);
Mat src;
threshold(gray, src, 200, 255, THRESH_BINARY);
imshow("src", src);
vector< vector<Point> > contours;
vector<Vec4i> hiearachy;
Mat src_cp = src.clone();
findContours(src_cp, contours, hiearachy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
Point2f center;
float radius;
minEnclosingCircle(contours[0], center, radius);
Mat dst(src.size(), CV_8UC3, Scalar::all(0));
Point center1;
center1.x = cvRound (center.x);
center1.y = cvRound(center.y);
int radius1 = cvRound(radius);
circle(dst, center1, radius1, Scalar(0,0,255), 2, 8);
dst.setTo(Scalar(255,255,255), src);
imwrite("dst.jpg", dst);
waitKey(0);
return 0;
}
测试图(左)、自己做一些标记(中)、最小包围圆(右)
minEnclosingCircle 函数定义:
void cv::minEnclosingCircle( InputArray _points,
Point2f& center, float& radius )
{
Mat points = _points.getMat();
CV_Assert(points.checkVector(2) >= 0 && (points.depth() == CV_32F || points.depth() == CV_32S));
CvMat _cpoints = points;
cvMinEnclosingCircle( &_cpoints, (CvPoint2D32f*)¢er, &radius );
}
c++的接口,然后转到c函数中去。cvMinEnclosingCircle函数定义:
CV_IM