【opencv练习37 - 多边形阴影绘制】

来源:互联网 发布:算法导论第四章答案 编辑:程序博客网 时间:2024/06/05 05:11
/*******************************************************************    测试程序 【多边形阴影绘制】    时间:2016年9月3日********************************************************************/int main( void ){ //【0、创建图像】  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<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) );  //【0,绘制源文件】   for( int j = 0; j < 6; j++ )  {         line( src, vert[j],  vert[(j+1)%6], Scalar( 255 ), 3, 8 );   }  //【0,获取轮廓】 Get the contours  vector<vector<Point> > contours; vector<Vec4i> hierarchy;  Mat src_copy = src.clone();                                   //备份src   findContours( src_copy, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);  // 【1、计算每一点到轮廓的距离检查点是否在轮廓内】  // 有选择的计算某一点到contour轮廓边界的【正负距离】  Mat raw_dist( src.size(), CV_32FC1 );         //原始距离【Mat】存储计算得到的距离  for( int j = 0; j < src.rows; j++ )  {     for( int i = 0; i < src.cols; i++ )    {         raw_dist.at<float>(j,i) = (float)pointPolygonTest( contours[0], Point2f((float)i,(float)j), true );     }  }  double minVal; double maxVal;  minMaxLoc( raw_dist, &minVal, &maxVal, 0, 0, Mat() );  minVal = abs(minVal); maxVal = abs(maxVal);  //【2、描绘,描画,距离图像化】  //【raw_dist ——> drawing 】  Mat drawing = Mat::zeros( src.size(), CV_8UC3 );      //初始化Mat  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] = (uchar)(255 - abs(raw_dist.at<float>(j,i))*255 / minVal);             }            else if( raw_dist.at<float>(j,i) > 0 )            {                 drawing.at<Vec3b>(j,i)[2] = (uchar)(255 - 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;             }        }    }  //【显示】  imshow( "Source", src );  imshow( "Distance", drawing );  waitKey(0);  return(0);}

这里写图片描述

0 0