0003-OpenCV中重對映函式remap的使用,以影象在x和y方向的翻轉為例!
阿新 • • 發佈:2018-11-14
首先介紹一下remap函式!
remap就是用來做重對映的,重對映的含義這裡先不講,大家看完這篇文章就知道了!
函式原型如下:
C++: void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
引數src:輸入影象,即源影象。
引數dst:目標影象,需和源圖片有一樣的尺寸和型別。
引數map1:裡面儲存著源影象中各畫素點的x座標在目標影象中的x座標,x座標其實就是畫素點列號。
引數map2
引數interpolation:插值方式,可選的插值方式如下:
INTER_NEAREST - 最近鄰插值
INTER_LINEAR – 雙線性插值(預設值)
INTER_CUBIC – 雙三次樣條插值(4×4畫素鄰域內的雙三次插值)
INTER_LANCZOS4 -Lanczos插值(8×8畫素鄰域的Lanczos插值)
引數borderMode:int型別:borderMode,邊界模式,有預設值BORDER_CONSTANT,表示目標影象中“離群點(outliers)”的畫素值不會被此函式修改,此時這些點的值由borderValue決定。離群點我猜應該是沒有被對映的點。
引數borderValue
程式碼流程如下:
讀取源影象→利用remap函式做重沿x和y方向的翻轉操作→顯示源影象和翻轉後的影象
影象處理開發資料、影象處理開發需求、影象處理接私活掙零花錢,可以搜尋公眾號"qxsf321",並關注!
使用示例程式碼如下:
原始碼中所需的圖片下載連結:http://pan.baidu.com/s/1i5mU66D 密碼:czyx
//opencv版本:OpenCV3.0 //VS版本:VS2013 //Author:qxsf321.net #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/types_c.h> #include <iostream> int main(){ cv::Mat src = cv::imread("remap_pic.jpg"); cv::Mat map_x_1, map_y_1, map_x_2, map_y_2, map_x_3, map_y_3; map_x_1.create(src.size(), CV_32FC1); map_y_1.create(src.size(), CV_32FC1); map_x_2.create(src.size(), CV_32FC1); map_y_2.create(src.size(), CV_32FC1); map_x_3.create(src.size(), CV_32FC1); map_y_3.create(src.size(), CV_32FC1); for (int iH = 0; iH<src.rows; iH++){ for (int iW = 0; iW<src.cols; iW++){ map_x_1.at<float>(iH, iW) = iW; map_y_1.at<float>(iH, iW) = src.rows - iH; map_x_2.at<float>(iH, iW) = src.cols - iW; map_y_2.at<float>(iH, iW) = iH; map_x_3.at<float>(iH, iW) = src.cols - iW; map_y_3.at<float>(iH, iW) = src.rows - iH; } } cv::Mat dst1, dst2, dst3; remap(src, dst1, map_x_1, map_y_1, CV_INTER_LINEAR); remap(src, dst2, map_x_2, map_y_2, CV_INTER_LINEAR); remap(src, dst3, map_x_3, map_y_3, CV_INTER_LINEAR); cv::imshow("origin", src); cv::imshow("remap_1", dst1); cv::imshow("remap_2", dst2); cv::imshow("remap_3", dst3); cv::waitKey(0); return 0; }
執行結果如下圖所示: