概念
得到包含二维点集的最小圆。
效果图
●图像原轮廓
●取到的最小圆
函数讲解
●函数原型(findContours)
○c++
void minEnclosingCircle( InputArray points,
CV_OUT Point2f& center, CV_OUT float& radius )
○Android
void minEnclosingCircle(MatOfPoint2f points, Point center, float[] radius)
●参数解释
○points:输入的二维点集。
○center:输出的圆形的中心坐标,是Point2f型。
○radius:输出的最小圆的半径,是float型。
函数使用
●c++中
#include
#include
using namespace cv;
using namespace std;
int main() {
Mat src = imread("C:/Users/Administrator/Desktop/t01.jpg");//引入源图像
if (src.empty()) {
return -1;
}
cvtColor(src, src, CV_BGR2GRAY);//图像灰度化
threshold(src, src, 200, 255, CV_THRESH_BINARY_INV);//图像二值化
vector> contours;//存储图像轮廓点集
findContours(src, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);//查找轮廓
Scalar lineColor = Scalar(0, 255, 255);//绘制线的颜色为黄色
Mat contoursMat = Mat::zeros(src.size(), CV_8UC3);//图像原轮廓
//绘制轮廓
drawContours(contoursMat, contours, -1, lineColor, 2, 8);
imshow("contours", contoursMat);//展示图像原轮廓
vector circleCenters(contours.size());//存储圆心点集
vector circleRadius(contours.size());//存储半径点集
Mat dst = Mat::zeros(src.size(), CV_8UC3);
for (int i = 0; i < contours.size(); i++) {
//得到最小的圆
minEnclosingCircle(contours[i],circleCenters[i],circleRadius[i] );
circle(dst, circleCenters[i], circleRadius[i], lineColor, 2, 8);
}
imshow("dst", dst);//展示拟合后的轮廓
waitKey(0);
return 0;
}
●Android中
private Bitmap minEnclosingCircle() {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.m01);//引入源图像
Mat src = new Mat();
Utils.bitmapToMat(bitmap, src);//将Bitmap转换为Mat
Imgproc.cvtColor(src,src,Imgproc.COLOR_RGBA2GRAY);//图像灰度化
Imgproc.threshold(src, src, 100, 255, Imgproc.THRESH_BINARY_INV);//图像二值化
Mat dst = Mat.zeros(src.size(), CvType.CV_8UC4);//制作纯黑色图像,大小与源图像一样
Mat hierarchy = new Mat();
ArrayList contours = new ArrayList<>();
Imgproc.findContours(src, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_NONE);//提取图像轮廓
for(int i = 0 ; i