博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenCV学习(34) 点到轮廓的距离
阅读量:5772 次
发布时间:2019-06-18

本文共 2321 字,大约阅读时间需要 7 分钟。

      在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 
#include
#include
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
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
> contours; vector
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
(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
(j,i) < 0 ) { drawing.at
(j,i)[0] = 255 - (int) abs(raw_dist.at
(j,i))*255/minVal; } //在内部 else if( raw_dist.at
(j,i) > 0 ) { drawing.at
(j,i)[2] = 255 - (int) raw_dist.at
(j,i)*255/maxVal; } else // 在边上 { drawing.at
(j,i)[0] = 255; drawing.at
(j,i)[1] = 255; drawing.at
(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

转载于:https://www.cnblogs.com/mikewolf2002/p/3427598.html

你可能感兴趣的文章
WIN10+RTX2070 tensorflow-gpu环境搭建
查看>>
小黑小波比.功能测试登录用户
查看>>
Java enum用法详解
查看>>
去云端的多条途径
查看>>
Docker容器从一知半解到入门
查看>>
关于“方法参数”
查看>>
Redis命令总结
查看>>
unable to write 'random state'错误解决
查看>>
win7 wamp 下安装pear phpunit
查看>>
context:annotation-config vs component-scan
查看>>
HTTP协议理解与应用总结
查看>>
使用Supervisor守护Python进程
查看>>
结构体和类的内存对齐原则-这一次弄清楚了对齐的本质规则
查看>>
Centos编译安装Nginx和PHP
查看>>
XDOC云服务-简单参数报表
查看>>
服务器代理(proxy)
查看>>
Java或Web中解决所有路径问题
查看>>
IntelliJ IDEA 创建 maven web项目慢解决办法
查看>>
日志分析查看——grep,sed,sort,awk运用
查看>>
nginx rtmp handshake过程
查看>>