OpenCV學習(34) 點到輪廓的距離

      在OpenCV中,能夠很方便的計算一個像素點到輪廓的距離,計算距離的函數爲:ios

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

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,用白色表示。ui

程序執行後效果:spa

imageimage

 

程序代碼:工程FirstOpenCV30code

相關文章
相關標籤/搜索