天天看點

openv-remap,圖像縮小,上下翻轉,左右翻轉,上下左右翻轉

如題所示,本篇文章主要用opencv自帶remap函數實作圖像的縮小一倍居中顯示,上下翻轉,左右翻轉,上下左右翻轉等功能。

具體實作代碼如下所示:(附圖有原始圖像,程式運作結果截圖四張,配置檔案截圖)

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>

using namespace cv;

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

//函數頭聲明
void update_map( void );

int main( int argc, char** argv )
{
  //加載彩色圖像
  src = imread( argv[1], 1 );

  //建立和輸入圖像大小的dst,map_x,map_y
  dst.create( src.size(), src.type() );
  map_x.create( src.size(), CV_32FC1 );
  map_y.create( src.size(), CV_32FC1 );

  //建立視窗
  namedWindow( remap_window, CV_WINDOW_AUTOSIZE );

  //函數循環
  while( true )
  {
    //每個一秒,按鍵ESC退出程式
    int c = waitKey( 1000 );

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

    //更新map_x,map_y,然後應用remap函數
    update_map();
    remap( src, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0) );

    //顯示輸出結果
    imshow( remap_window, dst );
  }
  return 0;
}
//四種類型的mappings
void update_map( void )
{
  ind = ind%4;//索引值,用于case選擇

  for( int j = 0; j < src.rows; j++ )
    { for( int i = 0; i < src.cols; i++ )
     {
           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.25 ) + 0.5 ;
               map_y.at<float>(j,i) = 2*( j - src.rows*0.25 ) + 0.5 ;
              }
           else
         { map_x.at<float>(j,i) = 0 ;
               map_y.at<float>(j,i) = 0 ;
                 }
                   break;
         case 1://上下翻轉圖像
               map_x.at<float>(j,i) = i ;
               map_y.at<float>(j,i) = src.rows - j ;
           break;
             case 2://左右翻轉圖像
               map_x.at<float>(j,i) = src.cols - i ;
               map_y.at<float>(j,i) = j ;
           break;
             case 3://上下左右翻轉圖像
               map_x.at<float>(j,i) = src.cols - i ;
               map_y.at<float>(j,i) = src.rows - j ;
           break;
             } //選擇結束
     }
    }
  ind++;
}      
openv-remap,圖像縮小,上下翻轉,左右翻轉,上下左右翻轉
openv-remap,圖像縮小,上下翻轉,左右翻轉,上下左右翻轉
openv-remap,圖像縮小,上下翻轉,左右翻轉,上下左右翻轉
openv-remap,圖像縮小,上下翻轉,左右翻轉,上下左右翻轉
openv-remap,圖像縮小,上下翻轉,左右翻轉,上下左右翻轉