日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV学习笔记(十四):重映射:remap( )

發(fā)布時(shí)間:2024/7/23 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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, // 目標(biāo)圖像 InputArray map1, // 第一個(gè)映射 ,x坐標(biāo) InputArray map2, // 第二個(gè)映射 ,y坐標(biāo) int interpolation, // 表示插值方法 int borderMode=BORDER_CONSTANT, // 表示邊界插值類型 const Scalar&borderValue=Scalar()) // 表示插值數(shù)值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 "重映射" //為窗口標(biāo)題定義的宏 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鍵盤按鍵【ESC】- 退出程序\n""\t\t鍵盤按鍵【1】- 第一種映射方式:縮放\n""\t\t鍵盤按鍵【2】- 第二種映射方式:上下翻轉(zhuǎn)\n""\t\t鍵盤按鍵【3】- 第三種映射方式:左右翻轉(zhuǎn)\n""\t\t鍵盤按鍵【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);// 1、創(chuàng)建和原始圖一樣的效果圖,x重映射圖,y重映射圖// map1和map2:代表目標(biāo)圖中的(x,y)點(diǎn)在原圖像的x坐標(biāo)和y坐標(biāo);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 );// 2、創(chuàng)建窗口并顯示namedWindow( WINDOW_NAME, CV_WINDOW_AUTOSIZE );imshow(WINDOW_NAME,g_srcImage);// 3、輪詢按鍵,更新map_x和map_y的值,進(jìn)行重映射操作并顯示效果圖while( 1 ){//獲取鍵盤按鍵int key = waitKey(0);//判斷ESC是否按下,若按下便退出if( (key & 255) == 27 ){cout << "程序退出...........\n";break;}//根據(jù)按下的鍵盤按鍵來(lái)更新 map_x & map_y的值. 然后調(diào)用remap( )進(jìn)行重映射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 ) {//雙層循環(huán),遍歷每一個(gè)像素點(diǎn)for( int j = 0; j < g_srcImage.rows;j++){for( int i = 0; i < g_srcImage.cols;i++){switch(key){case '1': // 鍵盤【1】鍵按下,進(jìn)行第一種重映射操作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】鍵按下,進(jìn)行第二種重映射操作g_map_x.at<float>(j,i) = static_cast<float>(i); // 行不變(X不變)g_map_y.at<float>(j,i) = static_cast<float>(g_srcImage.rows - j); // 列翻轉(zhuǎn)(Y翻轉(zhuǎn)不變)break;case '3':// 鍵盤【3】鍵按下,進(jìn)行第三種重映射操作g_map_x.at<float>(j,i) = static_cast<float>(g_srcImage.cols - i); // 行翻轉(zhuǎn)g_map_y.at<float>(j,i) = static_cast<float>(j); // 列不變break;case '4':// 鍵盤【4】鍵按下,進(jìn)行第四種重映射操作g_map_x.at<float>(j,i) = static_cast<float>(g_srcImage.cols - i); // 行翻轉(zhuǎn)g_map_y.at<float>(j,i) = static_cast<float>(g_srcImage.rows - j); // 列翻轉(zhuǎn)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ò),歡迎將生活随笔推薦給好友。