生活随笔
收集整理的這篇文章主要介紹了
OpenCV中重映射
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OpenCV中圖像重映射
重映射的意思是:把一個圖像中一個位置的像素放置到另一個圖片指定位置的過程。新圖像g(x,y)g(x,y)g(x,y)與原圖像f(x,y)f(x,y)f(x,y)存在一個映射的關系。
例如:
f(x,y)→g(x,y)f(x,y)\to g(x,y)f(x,y)→g(x,y)
假設對應法則為:h(x,y)=(I.cols?x,y)\color{#f00}h(x,y) = (I.cols-x,y)h(x,y)=(I.cols?x,y)
那么變換后的圖像就是原圖像的左右反轉。從對應法則可以看出,y值是保持不變的,即圖像的行保持不變,列逆序排列。
remap(輸入圖像,輸出圖像,Mat x方向的映射矩陣Mat y方向的映射矩陣CV_INTER_LINEAR非整數像素坐標的插值標志BORDER_CONSTANT
);
關于兩個映射矩陣:
假設原圖相為:
[123456789]\begin{bmatrix} 1&2&3\\4&5&6\\7&8&9 \end{bmatrix}???147?258?369????
?左右反轉\Downarrow左右反轉?左右反轉
mapx[321321321]andmapy[000111222]map_x\begin{bmatrix}3&2&1\\3&2&1\\3&2&1\end{bmatrix} and\ map_y \begin{bmatrix}0&0&0\\1&1&1\\2&2&2 \end{bmatrix}mapx????333?222?111????and?mapy????012?012?012????
[123456789]\begin{bmatrix} 1&2&3\\4&5&6\\7&8&9 \end{bmatrix}???147?258?369????
?上下反轉\Downarrow上下反轉?上下反轉
mapx[012012012]andmapy[333222111]map_x\begin{bmatrix}0&1&2\\0&1&2\\0&1&2\end{bmatrix} and\ map_y \begin{bmatrix}3&3&3\\2&2&2\\1&1&1 \end{bmatrix}mapx????000?111?222????and?mapy????321?321?321????
可以對照著代碼,體會一下:
#include "opencv2/opencv.hpp"
#include <math.h>using namespace cv;
using namespace std;Mat Remap_hand(const Mat src);
void Remap_api(const Mat src);Mat map_x,map_y;int main(int argc, char *argv[])
{Mat src,dst;src = imread("/home/dynamicw/Project/C++_Project/opencvtest/src/day03/dog.jpg");imshow("src",src);map_x.create(src.size(),CV_32FC1);map_y.create(src.size(),CV_32FC1);imshow("hand",Remap_hand(src));while(true){int c = waitKey(1000);//提供一個1000毫秒循環一次的循環cout << "hello" << endl;Remap_api(src);remap(src,dst,map_x,map_y,CV_INTER_LINEAR,BORDER_CONSTANT,Scalar(0,0,0));imshow("api",dst);}return 0;
}Mat Remap_hand(const Mat src)
{Mat temp;src.copyTo(temp);for(int row = 0;row < src.rows;row++){for(int col = 0;col < src.cols;col++){temp.at<Vec3b>(row,col) = src.at<Vec3b>(row,abs(col-src.cols));}}return temp;
}void Remap_api(const Mat src)
{ for(int row = 0;row < src.rows;row++){for(int col = 0;col < src.cols;col++){//左右反轉// map_x.at<float>(row,col) = src.cols - col;// map_y.at<float>(row,col) = row;//上下反轉//map_x.at<float>(row,col) = col;//map_y.at<float>(row,col) = src.rows - row;//上下左右反轉map_x.at<float>(row,col) = src.cols - col;map_y.at<float>(row,col) = src.rows - row;}}
}
總結
以上是生活随笔為你收集整理的OpenCV中重映射的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。