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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/7/23 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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, // 第一個映射 ,x坐標 InputArray map2, // 第二個映射 ,y坐標 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);// 1、創建和原始圖一樣的效果圖,x重映射圖,y重映射圖// map1和map2:代表目標圖中的(x,y)點在原圖像的x坐標和y坐標;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、創建窗口并顯示namedWindow( WINDOW_NAME, CV_WINDOW_AUTOSIZE );imshow(WINDOW_NAME,g_srcImage);// 3、輪詢按鍵,更新map_x和map_y的值,進行重映射操作并顯示效果圖while( 1 ){//獲取鍵盤按鍵int key = waitKey(0);//判斷ESC是否按下,若按下便退出if( (key & 255) == 27 ){cout << "程序退出...........\n";break;}//根據按下的鍵盤按鍵來更新 map_x & map_y的值. 然后調用remap( )進行重映射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': // 鍵盤【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); // 行不變(X不變)g_map_y.at<float>(j,i) = static_cast<float>(g_srcImage.rows - j); // 列翻轉(Y翻轉不變)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( )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。