生活随笔
收集整理的這篇文章主要介紹了
OpenCV学习笔记(十四):重映射:remap( )
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
OpenCV學(xué)習(xí)筆記(十四):重映射:remap( )
圖像的坐標(biāo)映射是通過(guò)原圖像與目標(biāo)圖像之間建立一種映射關(guān)系,這種映射關(guān)系有兩種,一種是計(jì)算原圖像任意像素在映射后圖像的坐標(biāo)位置,另一種是計(jì)算變換后圖像任意像素反映射在原圖像的坐標(biāo)位置。
opencv中提供重映射等操作,其中重映射就是把一幅圖像中某位置的像素放置到另一個(gè)圖片指定位置的過(guò)程。為了完成映射過(guò)程,需要獲得一些插值為非整數(shù)像素的坐標(biāo)。對(duì)于原圖像和目標(biāo)圖像,滿足下式:
G(x,y)=f(h(x,y))
G()是目標(biāo)圖像,f()是源圖像,而h(x,y)是作用于(x,y)的映射方法函數(shù)。
1、remap()函數(shù)
函數(shù)remap使用指定的映射轉(zhuǎn)換源圖像,其公式為:
Void
remap(InputArray src
,
OutputArray dst
,
InputArray map1
,
InputArray map2
,
int interpolation
,
int borderMode
=BORDER_CONSTANT
,
const Scalar
&borderValue
=Scalar()) map1和map2:代表目標(biāo)圖中的(x
,y)點(diǎn)在原圖像的x坐標(biāo)和y坐標(biāo);
#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按鍵操作說(shuō)明: \n\n""\t\t鍵盤(pán)按鍵【ESC】- 退出程序\n""\t\t鍵盤(pán)按鍵【1】- 第一種映射方式:縮放\n""\t\t鍵盤(pán)按鍵【2】- 第二種映射方式:上下翻轉(zhuǎn)\n""\t\t鍵盤(pán)按鍵【3】- 第三種映射方式:左右翻轉(zhuǎn)\n""\t\t鍵盤(pán)按鍵【4】- 第四種映射方式:上下左右180度翻轉(zhuǎn)\n" );g_srcImage
= imread( "F:/C++/2. OPENCV 3.1.0/TEST/2.jpg", 1 );if(!g_srcImage
.data
) { printf("讀取圖片錯(cuò)誤,請(qǐng)確定目錄下是否有imread函數(shù)指定的圖片存在~! \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':// 鍵盤(pán)【
2】鍵按下,進(jìn)行第二種重映射操作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':// 鍵盤(pán)【
3】鍵按下,進(jìn)行第三種重映射操作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':// 鍵盤(pán)【
4】鍵按下,進(jìn)行第四種重映射操作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方向翻轉(zhuǎn)(X不變,Y翻轉(zhuǎn))
3、X方向翻轉(zhuǎn)(X翻轉(zhuǎn),Y不變)
4、X,Y 方向均翻轉(zhuǎn)(XY均翻轉(zhuǎn))
總結(jié)
以上是生活随笔為你收集整理的OpenCV学习笔记(十四):重映射:remap( )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。