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

/*******************************************************************
    测试程序 【多边形阴影绘制】
    时间: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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值