写在前面
这节内容里面的不管左右反转、上下翻转,还是旋转180度,都比较好理解,最难理解的是做小微原图的二分之一,这个我到现在仍有点蒙圈。
贾志刚老师调程序调出来的右下是有夹缝的,然后弹幕里面有人说他这个写的有问题,于是我到处去搜博客。
贾志刚老师在第一节课加上的0.5,博客里面有减去0.5,也有不加不减(贾志刚老师下节课认为不加不减才对)。
我自己尝试发现减去0.25之后,能消掉夹缝,但是,也只是对于女友大粗腿下采样.jpg这一张图来说的,画了半天图,大致明白了,这个和像素有很大关系,加不加,加多少,这得看像素多少,没有一个普遍性的加减方式(目前没有在网上找到)。
代码
#include<iostream>
#include<opencv2/opencv.hpp>
#include<cmath>
using namespace std;
using namespace cv;
int index = 0;
void updateMap();
Mat map_x, map_y;
Mat src = imread("A:\\专用\\TestForTheCV\\代替女友出境.jpg");
Mat dst;
int main() {
imshow("图片", src);
map_x.create(src.size(), CV_32FC1);
map_y.create(src.size(), CV_32FC1);
int c = 0;
while (true) {
c = waitKey(500);
if ((char)c == 27)break;
index = (char)c - '0';
updateMap();
remap(src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(255, 0, 0));
imshow("srcToDst", dst);
}
waitKey(0);
return 0;
}
void updateMap() {
for (int row = 0; row < src.rows; row++) {
for (int col = 0; col < src.cols; col++) {
switch (index) {
case 0://图片缩小为原来的二分之一
if (col > src.cols*0.25&&col<=src.cols*0.75&&row>src.rows*0.25&&row <= src.rows*0.75) {
//贾志刚老师源代码
// map_x.at<float>(row, col) = 2 * (col - src.cols*0.25 + 0.5 );
// map_y.at<float>(row, col) = 2 * (row - src.rows*0.25 + 0.5 );
下面的处理方式还是会留着一圈像素,不知道为什么,暂时没想明白。
//map_x.at<float>(row, col) = 2 * (col - src.cols*0.25f -0.25);
//map_y.at<float>(row, col) = 2 * (row - src.rows*0.25f -0.25);
//下一节课解决问题,但是我用女友性感大粗腿下采样仍然有蓝边
map_x.at<float>(row, col) = 2 * (col - src.cols*0.25f);
map_y.at<float>(row, col) = 2 * (row - src.rows*0.25f);
//后来搞懂一点,这个和输入图片的像素有关系,不是都要-0.5,也不是都不减,但是还有一点蒙圈
}
else {
map_x.at<float>(row, col) = 0;
map_y.at<float>(row, col) = 0;
}
break;
case 1:
map_x.at<float>(row, col) = (src.cols - 1 - col);
map_y.at<float>(row, col) = row;
break;
case 2:
map_x.at<float>(row, col) = col;
map_y.at<float>(row, col) = (src.rows - 1 - row);
break;
case 3:
map_x.at<float>(row, col) = (src.cols - 1 - col);
map_y.at<float>(row, col) = (src.rows - 1 - row);
break;
}
}
}
}
运行结果