1/** 2 * @function pointPolygonTest_demo.cpp 3 * @brief Demo code to use the pointPolygonTest function...fairly easy 4 * @author OpenCV team 5 */ 6 7#include "opencv2/highgui/highgui.hpp" 8#include "opencv2/imgproc/imgproc.hpp" 9#include <iostream> 10#include <stdio.h> 11#include <stdlib.h> 12 13using namespace cv; 14using namespace std; 15 16/** 17 * @function main 18 */ 19int main( void ) 20{ 21 /// Create an image 22 const int r = 100; 23 Mat src = Mat::zeros( Size( 4*r, 4*r ), CV_8UC1 ); 24 25 /// Create a sequence of points to make a contour: 26 vector<Point2f> vert(6); 27 28 vert[0] = Point( 3*r/2, static_cast<int>(1.34*r) ); 29 vert[1] = Point( 1*r, 2*r ); 30 vert[2] = Point( 3*r/2, static_cast<int>(2.866*r) ); 31 vert[3] = Point( 5*r/2, static_cast<int>(2.866*r) ); 32 vert[4] = Point( 3*r, 2*r ); 33 vert[5] = Point( 5*r/2, static_cast<int>(1.34*r) ); 34 35 /// Draw it in src 36 for( int j = 0; j < 6; j++ ) 37 { line( src, vert[j], vert[(j+1)%6], Scalar( 255 ), 3, 8 ); } 38 39 /// Get the contours 40 vector<vector<Point> > contours; vector<Vec4i> hierarchy; 41 Mat src_copy = src.clone(); 42 43 findContours( src_copy, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE); 44 45 /// Calculate the distances to the contour 46 Mat raw_dist( src.size(), CV_32FC1 ); 47 48 for( int j = 0; j < src.rows; j++ ) 49 { for( int i = 0; i < src.cols; i++ ) 50 { raw_dist.at<float>(j,i) = (float)pointPolygonTest( contours[0], Point2f((float)i,(float)j), true ); } 51 } 52 53 double minVal; double maxVal; 54 minMaxLoc( raw_dist, &minVal, &maxVal, 0, 0, Mat() ); 55 minVal = abs(minVal); maxVal = abs(maxVal); 56 57 /// Depicting the distances graphically 58 Mat drawing = Mat::zeros( src.size(), CV_8UC3 ); 59 60 for( int j = 0; j < src.rows; j++ ) 61 { for( int i = 0; i < src.cols; i++ ) 62 { 63 if( raw_dist.at<float>(j,i) < 0 ) 64 { drawing.at<Vec3b>(j,i)[0] = (uchar)(255 - abs(raw_dist.at<float>(j,i))*255/minVal); } 65 else if( raw_dist.at<float>(j,i) > 0 ) 66 { drawing.at<Vec3b>(j,i)[2] = (uchar)(255 - raw_dist.at<float>(j,i)*255/maxVal); } 67 else 68 { drawing.at<Vec3b>(j,i)[0] = 255; drawing.at<Vec3b>(j,i)[1] = 255; drawing.at<Vec3b>(j,i)[2] = 255; } 69 } 70 } 71 72 /// Create Window and show your results 73 const char* source_window = "Source"; 74 namedWindow( source_window, WINDOW_AUTOSIZE ); 75 imshow( source_window, src ); 76 namedWindow( "Distance", WINDOW_AUTOSIZE ); 77 imshow( "Distance", drawing ); 78 79 waitKey(0); 80 return(0); 81} 82