opencv重對映remap( )函式
int main(int argc, char** argv)
{
Mat srcImage, dstImage;
Mat map_x, map_y;
namedWindow("程式視窗");
//載入原始圖
srcImage = imread("test.jpg", 1);
//建立和原始圖一樣的效果圖,x重對映圖,y重對映圖
dstImage.create(srcImage.size(), srcImage.type());
map_x.create(srcImage.size(), CV_32FC1);
map_y.create(srcImage.size(), CV_32FC1);
//雙層迴圈,遍歷每一個畫素點,改變map_x & map_y的值
for (int j = 0; j < srcImage.rows; j++)
{
for (int i = 0; i < srcImage.cols; i++)
{
//改變map_x & map_y的值.
map_x.at<float>(j, i) = static_cast<float>(i);
map_y.at<float>(j, i) = static_cast<float>(srcImage.rows - j);
/////////////////////////////////////////////////////////
//map_x.at<float>(j, i) = static_cast<float>(srcImage.cols-i);
// map_y.at<float>(j, i) = static_cast<float>(j);
///////////////////////////////////////////////////////
//map_x.at<float>(j, i) = static_cast<float>(srcImage.cols-i);
//map_y.at<float>(j, i) = static_cast<float>(srcImage.rows - j);
/////////////////////////////////////////////////////////
//map_x.at<float>(j, i) = static_cast<float>(2*( i - srcImage.cols*0.25 ) + 0.5);
//map_y.at<float>(j, i) = static_cast<float>(2*( j - srcImage.rows*0.25 ) + 0.5);
}
}
//進行重對映操作
remap(srcImage, dstImage, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
imshow("程式視窗", dstImage);
waitKey(30);
return(0);
}
C++: void remap(InputArray src, OutputArraydst, InputArray map1, InputArray map2, int interpolation, intborderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
第一個引數,InputArray型別的src,輸入影象,即源影象,填Mat類的物件即可,且需為單通道8位或者浮點型影象。
第二個引數,OutputArray型別的dst,函式呼叫後的運算結果存在這裡,即這個引數用於存放函式呼叫後的輸出結果,需和源圖片有一樣的尺寸和型別。- 表示點(x,y)的第一個對映。
- 表示CV_16SC2 , CV_32FC1 或CV_32FC2型別的X值。
- 第四個引數,InputArray型別的map2,同樣,它也有兩種可能的表示物件,而且他是根據map1來確定表示那種物件。
- 若map1表示點(x,y)時。這個引數不代表任何值。
- 表示CV_16UC1 , CV_32FC1型別的Y值(第二個值)。
- 第五個引數,int型別的interpolation,插值方式,之前的resize( )函式中有講到,需要注意,resize( )函式中提到的INTER_AREA插值方式在這裡是不支援的,所以可選的插值方式如下:
- INTER_NEAREST - 最近鄰插值
- INTER_LINEAR – 雙線性插值(預設值)
- INTER_CUBIC – 雙三次樣條插值(逾4×4畫素鄰域內的雙三次插值)
- INTER_LANCZOS4 -Lanczos插值(逾8×8畫素鄰域的Lanczos插值)
- 第六個引數,int型別的borderMode,邊界模式,有預設值BORDER_CONSTANT,表示目標影象中“離群點(outliers)”的畫素值不會被此函式修改。
- 第七個引數,const Scalar&型別的borderValue,當有常數邊界時使用的值,其有預設值Scalar( ),即預設值為0。