OpenCV学习(34) 点到轮廓的距离

      在OpenCV中,可以很方便的计算一个像素点到轮廓的距离,计算距离的函数为:

double pointPolygonTest(InputArray contour, Point2f pt, bool measureDist)


Parameters:

  • contour – 输入参数轮廓。
  • pt – 测试的点。
  • measureDist – 如果为false的话,则函数计算符号,在轮廓外部在为-1,在轮廓内为1,在轮廓上,则为0。如果为ture,则计算实际的像素符号距离,在轮廓外的点像素距离为负值,在内的点,像素距离为正值。

 

下面的是计算一副图像中各个像素到轮廓距离的代码:

#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/highgui/highgui.hpp"#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace cv;using namespace std;

using namespace cv;using namespace std;

int main( int argc, char** argv )    {//创建一副图像const int r = 100;    Mat src = Mat::zeros( Size( 4*r, 4*r ), CV_8UC1 );

//创建一个轮廓序列    vector<Point2f> vert(6);

vert[0] = Point( 1.5*r, 1.34*r );    vert[1] = Point( 1*r, 2*r );    vert[2] = Point( 1.5*r, 2.866*r );    vert[3] = Point( 2.5*r, 2.866*r );    vert[4] = Point( 3*r, 2*r );    vert[5] = Point( 2.5*r, 1.34*r );

//画轮廓for( int j = 0; j < 6; j++ )        { line( src, vert[j],  vert[(j+1)%6], Scalar( 255 ), 3, 8 ); }

//得到轮廓    vector<vector<Point> > contours; vector<Vec4i> hierarchy;    Mat src_copy = src.clone();

findContours( src_copy, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);

//计算顶点到轮廓的距离    Mat raw_dist( src.size(), CV_32FC1 );

for( int j = 0; j < src.rows; j++ )        {for( int i = 0; i < src.cols; i++ )        {         raw_dist.at<float>(j,i) = pointPolygonTest( contours[0], Point2f(i,j), true ); }        }

double minVal; double maxVal;    minMaxLoc( raw_dist, &minVal, &maxVal, 0, 0, Mat() );    minVal = abs(minVal); maxVal = abs(maxVal);

//用户型化的方式显示距离    Mat drawing = Mat::zeros( src.size(), CV_8UC3 );

for( int j = 0; j < src.rows; j++ )        { for( int i = 0; i < src.cols; i++ )        {//在外部if( raw_dist.at<float>(j,i) < 0 )            { drawing.at<Vec3b>(j,i)[0] = 255 - (int) abs(raw_dist.at<float>(j,i))*255/minVal; }//在内部else if( raw_dist.at<float>(j,i) > 0 )            { drawing.at<Vec3b>(j,i)[2] = 255 - (int) raw_dist.at<float>(j,i)*255/maxVal; }else// 在边上            { drawing.at<Vec3b>(j,i)[0] = 255; drawing.at<Vec3b>(j,i)[1] = 255; drawing.at<Vec3b>(j,i)[2] = 255; }        }        }

namedWindow( "image", CV_WINDOW_AUTOSIZE );    imshow( "image", src );    namedWindow( "Distance", CV_WINDOW_AUTOSIZE );    imshow( "Distance", drawing );

waitKey(0);return(0);    }

对于轮廓外的点,越是蓝色,则距离轮廓越近,轮廓内的点,越是红色距离轮廓越近,轮廓上点距离为0,用白色表示。

程序执行后效果:

 

程序代码:工程FirstOpenCV30

时间: 2024-07-31 05:56:03

OpenCV学习(34) 点到轮廓的距离的相关文章

OpenCV学习(32) 求轮廓的包围盒

      在OpenCV中,能够很方便的求轮廓包围盒.包括矩形,圆形,椭圆形以及倾斜的矩形(包围面积最小)集中包围盒.用到的四个函数是: Rect boundingRect(InputArray points) void minEnclosingCircle(InputArray points, Point2f& center, float& radius) RotatedRect minAreaRect(InputArray points) RotatedRect fitEllipse

OpenCV学习(30) 轮廓defects

     上一篇教程中,我们学习了如何计算轮廓的凸包,其实对一个轮廓而言,可能它的凸包和它本身是重合的,也有可能不是重合的.比如下面左边图像的轮廓本身就是凸包,而右边图像的轮廓则不是.我们可以通过函数bool isContourConvex(InputArray contour),来判定一个轮廓是否是凸包,是的话返回true,否则false[注意测试的轮廓必须是简单轮廓,没有自交叉之类的].       对一个非凸包的轮廓而言,它包括一系列的凹陷区域,这些区域称作defect,比如下面手轮廓中,

OpenCV学习(31) 基于defects的简单手势

      前几年在做毕业设计时候曾用opencv1.0中defects做过简单的手势识别,这几天看OpenCV2.46中的轮廓函数,发现和以前差别挺大,函数调用完全不一样,重新实现了简单手势的代码.   1.首先用简单的肤色检测算法,得到手的区域.     Mat img = cv::imread("../hand2.jpg");     namedWindow("image");     imshow("image", img);     M

指针-opencv学习灰度图锐化的两个函数的差别不理解

问题描述 opencv学习灰度图锐化的两个函数的差别不理解 下面是一个灰度图锐化的函数,我有两种方式实现,方式1,和方式2,居然得到的结果不一样,图片数据也不一样,请高手看一下,可能是C语言的知识掌握的不好. void my_sharpen(const cv::Mat &image, cv::Mat &result) { result.create (image.size(), image.type ()); for(int j=1; j<image.rows-1; j++) { u

一个ACM竞赛题,关于凸多边形内某点到各顶点距离最远的问题,想求代码。

问题描述 一个ACM竞赛题,关于凸多边形内某点到各顶点距离最远的问题,想求代码. 选址 问题描述 很久以前,在世界的某处有一个形状为凸多边形的小岛,岛上的居民们决定建一个祭坛,居民们认为祭坛的位置离岛的顶点处越远越好.你的任务是求凸多边形内一点,使其与各顶点的距离中最短的距离最远,点在边上也可以.这样的点可能有多个,你只需输出这些点与各顶点的最短距离. 要求 数据输入:第一行是一个整数N(3≤N≤100). 接下来N行按逆时针顺序给出每个顶点的坐标,每行包含2个实数,表示顶点的横坐标和纵坐标(坐

c++-运行不成功,这是求点到直线的 距离

问题描述 运行不成功,这是求点到直线的 距离 #include"iostream.h" #include"math.h" class line; class point() { private: double x,y; public: point (double x1,double y1) { x=x1; y=y1; } friend double dist(point,line); }; class line() { private: double a,b,c;

opencv-请问OpenCV怎么判断一个轮廓包含在另一个轮廓中呢

问题描述 请问OpenCV怎么判断一个轮廓包含在另一个轮廓中呢 Opencv可以比较容易的找到轮廓,但是如何判断某个轮廓包含在另一个轮廓中呢

(转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU

      首页 视界智尚 算法技术 每日技术 来打我呀 注册     OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址:http://blog.csdn.net/column/details/opencv-manual.html 2:部分OpenCV的函数解读和原理解读 作者:梦想腾飞数量:20篇博文网址:http:/

OpenCV学习(28) 轮廓

      OpenCV中可以方便的在一副图像中检测到轮廓,并把这些轮廓画出来.主要用到两个函数:一个是findContours( img, contours0, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);另一个是drawContours( cnt_img, contours, idx, color, 1, 8, hierarchy ); int main( int argc, char**) { Mat img = Mat::zeros(w, w,