点多边形测试
pointPolygonTest
pointPolygonTest (
InputArray contour,
Point2f pt,
bool measureDist
) 返回数据是double 类型
示例
# include <opencv2/opencv.hpp>
# include <iostream>
# include <math.h> using namespace std;
using namespace cv; int main ( int argc, char * * argv) { const int r = 100 ; Mat src = Mat:: zeros ( r * 4 , r * 4 , CV_8UC1) ; vector< Point2f> vert ( 6 ) ; vert[ 0 ] = Point ( 3 * r / 2 , static_cast< int > ( 1.34 * r) ) ; vert[ 1 ] = Point ( 1 * r, 2 * r) ; vert[ 2 ] = Point ( 3 * r / 2 , static_cast< int > ( 2.866 * r) ) ; vert[ 3 ] = Point ( 5 * r / 2 , static_cast< int > ( 2.866 * r) ) ; vert[ 4 ] = Point ( 3 * r, 2 * r) ; vert[ 5 ] = Point ( 5 * r / 2 , static_cast< int > ( 1.34 * r) ) ; for ( int i = 0 ; i < 6 ; i++ ) { line ( src, vert[ i] , vert[ ( i + 1 ) % 6 ] , Scalar ( 255 ) , 3 , 8 , 0 ) ; } vector< vector< Point>> contours; vector< Vec4i> hierachy; Mat csrc; src. copyTo ( csrc) ; findContours ( csrc, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point ( 0 , 0 ) ) ; Mat raw_dist = Mat:: zeros ( csrc. size ( ) , CV_32FC1) ; for ( int row = 0 ; row < raw_dist. rows; row++ ) { for ( int col = 0 ; col < raw_dist. cols; col++ ) { double dist = pointPolygonTest ( contours[ 0 ] , Point2f ( static_cast< float > ( col) , static_cast< float > ( row) ) , true) ; raw_dist. at< float > ( row, col) = static_cast< float > ( dist) ; } } double minValue, maxValue; minMaxLoc ( raw_dist, & minValue, & maxValue, 0 , 0 , Mat ( ) ) ; Mat drawImg = Mat:: zeros ( src. size ( ) , CV_8UC3) ; for ( int row = 0 ; row < drawImg. rows; row++ ) { for ( int col = 0 ; col < drawImg. cols; col++ ) { float dist = raw_dist. at< float > ( row, col) ; if ( dist > 0 ) { drawImg. at< Vec3b> ( row, col) [ 0 ] = ( uchar) ( abs ( 1.0 - ( dist / maxValue) ) * 255 ) ; } else if ( dist < 0 ) { drawImg. at< Vec3b> ( row, col) [ 2 ] = ( uchar) ( abs ( 1.0 - ( dist / minValue) ) * 255 ) ; } else { drawImg. at< Vec3b> ( row, col) [ 0 ] = ( uchar) ( abs ( 255 - dist) ) ; drawImg. at< Vec3b> ( row, col) [ 1 ] = ( uchar) ( abs ( 255 - dist) ) ; drawImg. at< Vec3b> ( row, col) [ 2 ] = ( uchar) ( abs ( 255 - dist) ) ; } } } const char * output_win = "point polygon test demo" ; char input_win[ ] = "input image" ; namedWindow ( input_win, CV_WINDOW_AUTOSIZE) ; namedWindow ( output_win, CV_WINDOW_AUTOSIZE) ; imshow ( input_win, src) ; imshow ( output_win, drawImg) ; waitKey ( 0 ) ; return 0 ;
}