diff --git a/samples/cpp/tutorial_code/ShapeDescriptors/pointPolygonTest_demo.cpp b/samples/cpp/tutorial_code/ShapeDescriptors/pointPolygonTest_demo.cpp new file mode 100644 index 0000000000..08f0eac534 --- /dev/null +++ b/samples/cpp/tutorial_code/ShapeDescriptors/pointPolygonTest_demo.cpp @@ -0,0 +1,83 @@ +/** + * @function pointPolygonTest_demo.cpp + * @brief Demo code to use the pointPolygonTest function...fairly easy + * @author OpenCV team + */ + +#include "opencv2/highgui/highgui.hpp" +#include "opencv2/imgproc/imgproc.hpp" +#include +#include +#include + +using namespace cv; +using namespace std; + +/** + * @function main + */ +int main( int argc, char** argv ) +{ + /// Create an image + const int r = 100; + Mat src = Mat::zeros( Size( 4*r, 4*r ), CV_8UC1 ); + + /// Create a sequence of points to make a contour: + 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 ); + + /// Draw it in src + for( int j = 0; j < 6; j++ ) + { line( src, vert[j], vert[(j+1)%6], Scalar( 255 ), 3, 8 ); } + + /// Get the contours + vector > contours; vector hierarchy; + Mat src_copy = src.clone(); + + findContours( src_copy, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE); + + /// Calculate the distances to the contour + 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); + + /// Depicting the distances graphically + 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; } + } + } + + /// Create Window and show your results + char* source_window = "Source"; + namedWindow( source_window, CV_WINDOW_AUTOSIZE ); + imshow( source_window, src ); + namedWindow( "Distance", CV_WINDOW_AUTOSIZE ); + imshow( "Distance", drawing ); + + waitKey(0); + return(0); +} + +