.. _point_polygon_test: 多边形测试 ******************* 目的 ===== 本教程指导用户: .. container:: enumeratevisibleitemswithsquare * 使用OpenCV函数 :point_polygon_test:`pointPolygonTest <>` 理论 ====== 代码 ==== 本教程代码如下所示. 用户也可以点击 `这里下载 `_ .. code-block:: cpp #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 ) { /// 创建一个图形 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 ); /// 在src内部绘制 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; } } } /// 创建窗口显示结果 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); } 解释 ============ 结果 ====== #. 输出如下: ========== ========== |PPT_0| |PPT_1| ========== ========== .. |PPT_0| image:: images/Point_Polygon_Test_Source_Image.png :align: middle .. |PPT_1| image:: images/Point_Polygon_Test_Result.jpg :align: middle 翻译者 ================= leebigmouth@ `OpenCV中文网站 `_