生活随笔
收集整理的這篇文章主要介紹了
OpenCV学习笔记(十四):重映射:remap( )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OpenCV學習筆記(十四):重映射:remap( )
圖像的坐標映射是通過原圖像與目標圖像之間建立一種映射關系,這種映射關系有兩種,一種是計算原圖像任意像素在映射后圖像的坐標位置,另一種是計算變換后圖像任意像素反映射在原圖像的坐標位置。
opencv中提供重映射等操作,其中重映射就是把一幅圖像中某位置的像素放置到另一個圖片指定位置的過程。為了完成映射過程,需要獲得一些插值為非整數像素的坐標。對于原圖像和目標圖像,滿足下式:
G(x,y)=f(h(x,y))
G()是目標圖像,f()是源圖像,而h(x,y)是作用于(x,y)的映射方法函數。
1、remap()函數
函數remap使用指定的映射轉換源圖像,其公式為:
Void
remap(InputArray src
,
OutputArray dst
,
InputArray map1
,
InputArray map2
,
int interpolation
,
int borderMode
=BORDER_CONSTANT
,
const Scalar
&borderValue
=Scalar()) map1和map2:代表目標圖中的(x
,y)點在原圖像的x坐標和y坐標;
#include
<opencv2
/opencv
.hpp
>using namespace cv
;
using namespace std
;#define WINDOW_NAME
"重映射"
Mat g_srcImage
, g_dstImage
;
Mat g_map_x
, g_map_y
;int main(int argc
, char *argv
[])
{QCoreApplication
a(argc
, argv
);printf( "\n\t按鍵操作說明: \n\n""\t\t鍵盤按鍵【ESC】- 退出程序\n""\t\t鍵盤按鍵【1】- 第一種映射方式:縮放\n""\t\t鍵盤按鍵【2】- 第二種映射方式:上下翻轉\n""\t\t鍵盤按鍵【3】- 第三種映射方式:左右翻轉\n""\t\t鍵盤按鍵【4】- 第四種映射方式:上下左右180度翻轉\n" );g_srcImage
= imread( "F:/C++/2. OPENCV 3.1.0/TEST/2.jpg", 1 );if(!g_srcImage
.data
) { printf("讀取圖片錯誤,請確定目錄下是否有imread函數指定的圖片存在~! \n"); return false; }imshow("原始圖",g_srcImage
);g_dstImage
.create( g_srcImage
.size(), g_srcImage
.type() );g_map_x
.create( g_srcImage
.size(), CV_32FC1
);g_map_y
.create( g_srcImage
.size(), CV_32FC1
);namedWindow( WINDOW_NAME
, CV_WINDOW_AUTOSIZE
);imshow(WINDOW_NAME
,g_srcImage
);while( 1 ){int key
= waitKey(0);if( (key
& 255) == 27 ){cout
<< "程序退出...........\n";break;}update_map(key
);remap( g_srcImage
, g_dstImage
, g_map_x
, g_map_y
, CV_INTER_LINEAR
, BORDER_CONSTANT
, Scalar(0,0, 0) );imshow( WINDOW_NAME
, g_dstImage
);}waitKey(0);return a
.exec();
}
int update_map( int key
)
{for( int j
= 0; j
< g_srcImage
.rows
;j
++){for( int i
= 0; i
< g_srcImage
.cols
;i
++){switch(key
){case '1': if( i
> g_srcImage
.cols
*0.25 && i
< g_srcImage
.cols
*0.75 && j
> g_srcImage
.rows
*0.25 && j
< g_srcImage
.rows
*0.75){g_map_x
.at
<float>(j
,i
) = static_cast
<float>(2*( i
- g_srcImage
.cols
*0.25 ) + 0.5); g_map_y
.at
<float>(j
,i
) = static_cast
<float>(2*( j
- g_srcImage
.rows
*0.25 ) + 0.5); }else{g_map_x
.at
<float>(j
,i
) = 0;g_map_y
.at
<float>(j
,i
) = 0;}break;case '2':// 鍵盤【
2】鍵按下,進行第二種重映射操作g_map_x
.at
<float>(j
,i
) = static_cast
<float>(i
); g_map_y
.at
<float>(j
,i
) = static_cast
<float>(g_srcImage
.rows
- j
); break;case '3':// 鍵盤【
3】鍵按下,進行第三種重映射操作g_map_x
.at
<float>(j
,i
) = static_cast
<float>(g_srcImage
.cols
- i
); g_map_y
.at
<float>(j
,i
) = static_cast
<float>(j
); break;case '4':// 鍵盤【
4】鍵按下,進行第四種重映射操作g_map_x
.at
<float>(j
,i
) = static_cast
<float>(g_srcImage
.cols
- i
); g_map_y
.at
<float>(j
,i
) = static_cast
<float>(g_srcImage
.rows
- j
); break;}}}return 1;
}
1、縮小(XY 縮放)
2、Y方向翻轉(X不變,Y翻轉)
3、X方向翻轉(X翻轉,Y不變)
4、X,Y 方向均翻轉(XY均翻轉)
總結
以上是生活随笔為你收集整理的OpenCV学习笔记(十四):重映射:remap( )的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。