【opencv练习25 - remap重映射】

/*****************************************************
    测试程序 【remap重映射】
    时间:2016年8月30日
    【创建重映射矩阵,重映射】
    参数:src,dst,map1,map2,插值方式,边缘类型,边缘初始化
    remap( src, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0) );

******************************************************/


//【全局变量】
Mat src, dst;
Mat map_x, map_y;
const char* remap_window = "Remap demo";
int ind = 0;

//
void update_map( void );

int main(void)
{
  /// Load the image
  src = imread("FC2.jpg", 1 );

  /// Create dst, map_x and map_y with the same size as src:
  dst.create( src.size(), src.type() );
  map_x.create( src.size(), CV_32FC1 );
  map_y.create( src.size(), CV_32FC1 );

  /// Create window
  namedWindow( remap_window, WINDOW_AUTOSIZE );

  /// Loop
  for(;;)
  {
    //每2秒更新
    int c = waitKey( 2000 );

    if( (char)c == 27 )
      { break; }

    //更新重映射参数
    update_map();
    //重映射
    //参数:src,dst,map1,map2,插值方式,边缘类型,边缘初始化
    remap( src, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0) );
    imshow( remap_window, dst );
  }
  return 0;
}

// * @function update_map
// * @【简单填充Map_x,map_y 通过4种类型的映射】
void update_map( void )
{
  ind = ind%4;

    for( int j = 0; j < src.rows; j++ )
    { 
        for( int i = 0; i < src.cols; i++ )
        {
         //根据ind切换重映射效果
         switch( ind )
         {
            case 0:                                     //半尺寸
                if( i > src.cols*0.25 && i < src.cols*0.75 && j > src.rows*0.25 && j < src.rows*0.75 )
                {
                    map_x.at<float>(j,i) = 2*( i - src.cols*0.25f ) + 0.5f ;            //设置X映射矩阵
                    map_y.at<float>(j,i) = 2*( j - src.rows*0.25f ) + 0.5f ;            //设置Y映射矩阵
                }
                else
                { 
                    map_x.at<float>(j,i) = 0 ;
                    map_y.at<float>(j,i) = 0 ;
                }
                break;
            case 1:                                     //上下翻转
                map_x.at<float>(j,i) = (float)i ;
                map_y.at<float>(j,i) = (float)(src.rows - j) ;
                break;
            case 2:                                 //左右反转
                map_x.at<float>(j,i) = (float)(src.cols - i) ;
                map_y.at<float>(j,i) = (float)j ;
                break;
            case 3:                                 //上下左右
                map_x.at<float>(j,i) = (float)(src.cols - i) ;
                map_y.at<float>(j,i) = (float)(src.rows - j) ;
                break;
          } 
        }
    }
  ind++;    //更改随机状态
}

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值