Opencv--minEnclosingCircle源码--求最小包围圆的算法

在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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值