美文网首页
minEnclosingCircle(取最小圆)

minEnclosingCircle(取最小圆)

作者: itfitness | 来源:发表于2019-08-22 11:52 被阅读0次

概念

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

效果图

●图像原轮廓



●取到的最小圆


函数讲解

●函数原型(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<opencv2/opencv.hpp>
#include<iostream>

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<vector<Point>> 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<Point2f> circleCenters(contours.size());//存储圆心点集
    vector<float> 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<MatOfPoint> contours = new ArrayList<>();
        Imgproc.findContours(src, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_NONE);//提取图像轮廓
        for(int i = 0 ; i<contours.size();i++){
            MatOfPoint2f point2f = new MatOfPoint2f(contours.get(i).toArray());//将MatOfPoint转换为MatOfPoint2f
            Point center = new Point();
            float[] radius = new float[1];
            Imgproc.minEnclosingCircle(point2f,center,radius);//获取点集最小圆
            Imgproc.circle(dst,center, (int) radius[0],new Scalar(255,255,0),2,8);//绘制圆
        }
        Utils.matToBitmap(dst,bitmap);//将Mat转为Bitmap
        return bitmap;
    }

相关文章

  • minEnclosingCircle(取最小圆)

    概念 得到包含二维点集的最小圆。 效果图 ●图像原轮廓 ●取到的最小圆 函数讲解 ●函数原型(findContou...

  • “圆”——永远不要忘记出发的地方

    我想给自己取个笔名,想了很久,最后我决定取“小圆”这个笔名。很普通的一个笔名,但是,它有一定的意义。 在心中画一个...

  • 小圆

    妻闷闷不乐已是第八天了。 不,与其说是闷闷不乐,不如说是呆若木鸡。每日只沉默的坐着,问她什么,全然不答。 她若有所...

  • 小圆

    刚刷完魔法少女小圆,心情难以平静啊!光是奇思妙想或许只是一时让人眼前一亮,可当想象中带入深刻的思考或是在某种世界观...

  • 第一百一十三章 谁说老神仙不浪漫?

    凤九觉得自己一定是最幸福的狐狸娘亲,因为小圆满她爹实在是太贴心了。两个月的修养期,凤九仅仅起夜了两次。小圆满睡沉...

  • 取最值函数

    讲解对象:取最值函数作者:融水公子 rsgz

  • 少女小圆

    01 小圆从记事起就是个圆溜溜的小朋友,圆圆的脸蛋,圆滚滚的两条小腿,经常跟在背着差半岁表弟的姥姥后面跑。 乡里乡...

  • 小圆搬家

    2018年7月1日 星期日 晴 我们一家人后天都要到广西北海的涠洲岛度假了,因此,家里的猫咪小圆只有寄到爷爷奶...

  • 小圆患病

    2018年7月31日 星期二 雨 前段时间我们带着父母一起到北海旅游,就把我家猫咪小圆寄在爷爷奶奶家。回来后听...

  • 小圆饼

    晚上下班回到家,见到女儿正拿着锅铲在电饼铛里翻着小圆饼。桌子上放着一盘小圆饼,黄澄澄的,小圆饼大小均匀,饼下铺着一...

网友评论

      本文标题:minEnclosingCircle(取最小圆)

      本文链接:https://www.haomeiwen.com/subject/qmfnsctx.html