像素重映射"/>
OpenCV基础课程笔记23像素重映射
写在前面
这节内容里面的不管左右反转、上下翻转,还是旋转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;}}}}
运行结果
更多推荐
OpenCV基础课程笔记23像素重映射
发布评论