手撕image resize

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 功能: 采用双线性插值对图像进行尺寸变换
// 参数: cv::Mat srcImg 输入图像
// cv::Mat dstImg 输出图像
// 说明:
// 这里需要借助opencv读图像,所以函数的两个参数是opencv的格式
void warpAffine(cv::Mat srcImg, cv::Mat dstImg){
// apply transform
Eigen::Matrix<float, 3, 1> srcP;
Eigen::Matrix<float, 3, 1> dstP;
float x, y, tl, tr, dl, dr;
int x_, y_;
for(int row=0; row<dstImg.rows; row++){
for(int col=0; col<dstImg.cols; col++){
dstP << row, col, 1;
srcP = translation * dstP;
x = srcP[0];
y = srcP[1];
x_ = int(x);
y_ = int(y);

cv::Vec3b val = (1-(x-x_))*(1-(y-y_))*srcImg.at<cv::Vec3b>(row, col) +
(1-(x-x_))*(y-y_)*srcImg.at<cv::Vec3b>(row, col+1) +
(x-x_)*(1-(y-y_))*srcImg.at<cv::Vec3b>(row+1, col) +
(x-x_)*(y-y_)*srcImg.at<cv::Vec3b>(row+1, col+1);

dstImg.at<cv::Vec3b>(row, col) = val;

}
}
}
0%