minEnclosingCircle(取最小圆)

概念

得到包含二维点集的最小圆。

效果图

●图像原轮廓


minEnclosingCircle(取最小圆)_第1张图片

●取到的最小圆


minEnclosingCircle(取最小圆)_第2张图片

函数讲解

●函数原型(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

你可能感兴趣的:(minEnclosingCircle(取最小圆))