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;
			}
		}
	}

}


运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值