#define window "[結果圖]"
//
Mat mapx;
Mat mapy;
Mat src;
void get_mapxy(int ch);
int main()
{
//1.原圖像。
src = imread("馬車2.jpg");
resize(src, src, Size(), 0.2, 0.2);
imshow("效果圖",src);
//2.準備參數。
//3.wasd四個按鍵對應四種重映射。
namedWindow(window);
//3.根據按鍵對mapx和mapy進行賦值。
mapx.create(src.size(),CV_32FC1);
mapy.create(src.size(),CV_32FC1);//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy一定初始化否則會報錯map參數爲空。
while (1)
{
int ch = waitKey(0);
if (ch == 27)
break;
get_mapxy(ch);
Mat dst(src.size(),src.type());
remap(src, dst, mapx, mapy, CV_INTER_LINEAR);
//5.show
imshow(window,dst);
}
waitKey(0);
return 0;
}
void get_mapxy(int ch)
{
switch (ch)
{
case 'w':
for (int i = 0; i < src.rows; ++i)
{
for (int j = 0; j < src.cols; ++j)
{
mapy.at<float>(i, j) = static_cast<float>(src.rows - i);//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx浮點數。
mapx.at<float>(i, j) = static_cast<float>(j);//xxxxxxxxxxxxxxxxxxxxxxxxxxx注意x,y的的對應關係,點的座標和圖像的at(x,y)是相反的。
}
}
break;
case 's':
for (int i = 0; i < src.rows; ++i)
{
for (int j = 0; j < src.cols; ++j)
{
mapy.at<float>(i, j) = static_cast<float>(src.rows - i);//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx浮點數。
mapx.at<float>(i, j) = static_cast<float>(src.cols-j);//xxxxxxxxxxxxxxxxxxxxxxxxxxx注意x,y的的對應關係,點的座標和圖像的at(x,y)是相反的。
}
}
break;
case 'd':
for (int i = 0; i < src.rows; ++i)
{
for (int j = 0; j < src.cols; ++j)
{
mapy.at<float>(i, j) = static_cast<float>(i);//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx浮點數。
mapx.at<float>(i, j) = static_cast<float>(src.cols-j);//xxxxxxxxxxxxxxxxxxxxxxxxxxx注意x,y的的對應關係,點的座標和圖像的at(x,y)是相反的。
}
}
break;
case 'a'://其實就是縮小原圖,左邊爲現在的座標,右邊爲原圖的座標。結果圖像值顯示0.25到0.75範圍,而右邊的座標卻可以顯示全部範圍。(0.5-(src.rows-0.5))
//這樣更容易理解remap函數中兩個map參數的意義了。
for (int i = 0; i < src.rows; ++i)
{
for (int j = 0; j < src.cols; ++j)
{
if (i > src.rows*0.25 && i < src.rows * 0.75&&j>src.cols*0.25&&j<src.cols*0.75)
{
mapy.at<float>(i, j) = static_cast<float>(2*(i-src.rows*0.25)+0.5);//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx浮點數。
mapx.at<float>(i, j) = static_cast<float>(2*(j-src.cols*0.25)+0.5);//xxxxxxxxxxxxxxxxxxxxxxxxxxx注意x,y的的對應關係,點的座標和圖像的at(x,y)是相反的。
}
else
{
mapy.at<float>(i, j) = 0;
mapx.at<float>(i, j) = 0;
}
}
}
break;
}
}
w:
a:
s:
d: