【opencv学习之三十六】轮廓特征应用:计算点与轮廓距离

opencv实现了Contours与point的距离关系的计算使用起来很方便,不用自己再进行坐标转换计算了;示例代码如下:

void imgContoursPoint()//26轮廓与点的距离计算
{
    //1.查找轮廓前的预处理
    Mat srcImg = imread("D:/ImageTest/11.png");
    Mat copyImg = srcImg.clone();
    cvtColor(srcImg,srcImg,CV_BGR2GRAY);
    threshold(srcImg,srcImg,100,255,CV_THRESH_BINARY_INV );//
    imshow("thresh",srcImg);
    //2.查找轮廓
    vector<vector<Point>> contours;
    findContours(srcImg,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);//最外层轮廓
    drawContours(copyImg, contours, -1, Scalar(0, 255, 0), 2, 8);
    //3.计算点到轮廓的距离与位置关系
    Point2f point1(230, 200);
    circle(copyImg,point1,3,Scalar(255,0,0),-1,8);
    double a0 = pointPolygonTest(contours[0], point1, true);//true表示点到轮廓的距离
    double b0 = pointPolygonTest(contours[0], point1, false);//false表示计算点与轮廓的位置关系-1表示外部,0在轮廓上,1在轮廓内
    cout << "a0=" << a0 << endl;
    cout << "b0=" << b0 << endl;

    Point2f point2(150, 200);
    circle(copyImg,point2,3,Scalar(0,0,255),-1,8);
    double a1 = pointPolygonTest(contours[0], point2, true);//true表示点到轮廓的距离
    double b1 = pointPolygonTest(contours[0], point2, false);//false表示计算点与轮廓的位置关系-1表示外部,0在轮廓上,1在轮廓内
    cout << "a1=" << a1 << endl;
    cout << "b1=" << b1 << endl;

    //    //添加文字
    QString strg1=QString::number(a0,10,3);
    QString str1=QString("a0=%1").arg(strg1);
    QByteArray cStr1 = str1.toLocal8Bit(); // 注意,这个QByteArray 对象一定要建立
    char *p1 = cStr1.data();
    putText(copyImg,p1, Point(30, 30),CV_FONT_HERSHEY_COMPLEX, 0.8, Scalar(255, 0, 0), 1, 8);

    QString strg2=QString::number(b0,10,3);
    QString str2=QString("b0=%1").arg(strg2);
    QByteArray cStr2 = str2.toLocal8Bit(); // 注意,这个QByteArray 对象一定要建立
    char *p2 = cStr2.data();
    putText(copyImg,p2, Point(30, 30*2),CV_FONT_HERSHEY_COMPLEX,0.8, Scalar(255, 0, 0), 1, 8);

    QString strg3=QString::number(a1,10,3);
    QString str3=QString("a1=%1").arg(strg3);
    QByteArray cStr3 = str3.toLocal8Bit(); // 注意,这个QByteArray 对象一定要建立
    char *p3 = cStr3.data();
    putText(copyImg,p3, Point(30, 30*3),CV_FONT_HERSHEY_COMPLEX, 0.8, Scalar(0, 0, 255), 1, 8);

    QString strg4=QString::number(b1,10,3);
    QString str4=QString("b1=%1").arg(strg4);
    QByteArray cStr4 = str4.toLocal8Bit(); // 注意,这个QByteArray 对象一定要建立
    char *p4 = cStr4.data();
    putText(copyImg,p4, Point(30, 30*4),CV_FONT_HERSHEY_COMPLEX, 0.8, Scalar(0, 0, 255), 1, 8);

    imshow("contours",copyImg);
    waitKey(0);
}
效果如下:



版权声明:本文为abcvincent原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/abcvincent/article/details/79275615

智能推荐

【opencv学习之三十二】轮廓查找并统计2

关于opencv在图像中查找轮廓并统计的方法基本这样几个步骤:1、读取图像——2、前期处理滤波平滑等——3、分割图像,一般阈值分割——4、FindContours查找轮廓——5、统计轮廓——6、根据连通域面积大小过滤轮廓——7、染色需要显示的轮廓&mdas...

Opencv笔记(十六)——认识轮廓

什么是轮廓?   轮廓可以简单认为成连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用。谈起轮廓不免想到边缘,它们确实很像。简单的说,轮廓是连续的,边缘并不全都连续(下图)。其实边缘主要是作为图像的特征使用,比如可以用边缘特征可以区分脸和手,而轮廓主要用来分析物体的形态,比如物体的周长和面积等,可以说边缘包括轮廓。 为了准确,要使用二值化...

OpenCV - 轮廓特征(Python实现)

矩 图像的矩可以帮助我们计算图像的质心,面积等。 {‘m00’: 358.0, ‘m10’: 71958.0, ‘m01’: 37590.0, ‘m20’: 14463677.0, ‘m11’: 7555590.0, ‘m02’: 4902869.6666...

opencv 9 -- 轮廓 特征 三

1 最小外接圆 函数 cv2.minEnclosingCircle() 可以帮我们找到一个对象的外切圆。 它是所有能够包括对象的圆中面积最小的一个 2 椭圆拟合 使用的函数为 cv2.ellipse(),返回值其实就是旋转边界矩形的内切圆(椭圆) 3 直线拟合 我们可以根据一组点拟合出一条直线,同样我们也可以为图像中的白色点 拟合出一条直线...

opencv 9 -- 轮廓 特征 二

1 凸包 凸包与轮廓近似相似,但不同,虽然有些情况下它们给出的结果是一样的。 函数 cv2.convexHull() 可以用来检测一个曲线是否具有凸性缺陷,并能纠 正缺陷。一般来说,凸性曲线总是凸出来的,至少是平的。如果有地方凹进去 了就被叫做凸性缺陷。例如下图中的手。红色曲线显示了手的凸包,凸性缺陷 被双箭头标出来了 参数: • points 我们要传入的轮廓 • hull ...

猜你喜欢

opencv 9 -- 轮廓 特征 一

查找轮廓的不同特征,例如面积,周长,重心,边界框 1 矩 图像的矩可以帮助我们计算图像的质心,面积等 函数 cv2.moments() 会将计算得到的矩以一个字典的形式返回 结果: 根据这些矩的值,我们可以计算出对象的重心: 2 轮廓面积 轮廓的面积可以使用函数 cv2.contourArea() 计算得到, 也可以使用矩 (0 阶矩),M[‘m00’] 3 轮廓周长 也被...

OpenCV教程(27)-- 轮廓特征

目录 Goal 1. Moments 2. Contour Area 轮廓面积 3. Contour Perimeter 轮廓周长 4. Contour Approximation 轮廓近似 5. Convex Hull 凸包 6. Checking Convexity 凸性检验 7. Bounding Rectangle 边界矩形 7.a. Straight Bounding Rectangle...

VUE给动态生成的el-checkbox添加v-model

需求描述:根据返回的数据,页面动态for循环添加el-checkbox,动态绑定v-model; html代码: tabList数据格式: 之前的错误做法: 开始以为这样就可以了,毕竟在el-checkbox上用item.status绑定v-model,后面发现checkbox点击的时候并没有更新; 解决方案: 官方文档...

[UE4]蓝图和C++调用自定义函数

1、C++自定义方法,蓝图调用 UFUNCTION宏是处理将C++函数暴露给反射系统的一些事情,参数BlueprintCallable意味着这个函数可以在蓝图中调用,而后面的目录是必须有的,这样在蓝图中右键点击的时候,我们就可以根据这个目录找到我们需要的函数。 2、蓝图定义方法,C++调用 当我们在蓝图中定义了一系列操作后,我们也想用C++调用,我们利用BlueprintImplementable...

Redis--2.Jedis的介绍和使用

一.概念 Jedis是Redis官方推荐使用的的一个Java连接开发的工具(中间件)。 Jedis主要是集成了redis的一些命令操作,封装了redis的java客户端。 使用Jedis操作Redis数据库,就相当于使用JDBC操作sql_server、Mysql数据库。 二.两种连接方式 1.Jedis对象直连Redis Jedis对象直连方式可以分为五个步骤: 1、导入Jedis的jar包 2...