#include #include using namespace std; using namespace cv; int main() { Mat src, dst,map_x, map_y; src = imread("D:\\sof\\img\\123.jpg"); imshow("原图", src); //flip(src, dst, 1); /*remap(src,dst,)*/ /*dst.create(src.size(), src.type()); map_x.create(src.size(), CV_32FC1); map_y.create(src.size(), CV_32FC1); for (int j = 0; j < src.rows; j++) { for (int i = 0; i < src.cols; i++) { map_x.at(j, i) = float(i); map_y.at(j, i) = float(src.rows - j); } } remap(src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));*/ imshow("效果图", dst); waitKey(0); return 0; } 上面代码是用opencv库中的remap实现,对图像的垂直翻转。但是for循环内的那两行代码小弟怎么想都不理解啥意思,正常做垂直翻转的话,不应该是将原矩阵第一列第一行的标量数值移动到目标矩阵第一列最后一行的位置吗,然后第二行移动到倒数第二行……直至行和列全部遍历完。而代码中 map_x.at(j, i) = float(i); map_y.at(j, i) = float(src.rows - j); 这两行的意思则将当前行和列的值转化为浮点数依次去填充到目标矩阵的相反位置,为什么要将行数和列数去赋给像素标量值呢,但是最后程序运行结果确实是使图像垂直翻转了。小弟实在想不明白。 还有remap与flip()函数有什么区别呢,功能基本上都是相同的啊?有flip这么简单高效率的api为什么还要做remap这个复杂低效率的api呢?请大神给小弟解惑,谢谢!
2条回答 默认 最新
- CSDN专家-深度学习进阶 2021-05-22 09:01关注
假设对一张10*10的图片进行上下重映射,map_x作用是记录列坐标,map_y作用是记录行坐标。
输出map_x,map_y:
map_x:
map_y:
我们可以看到,在x方向从左到右逐渐增大排列,在y方向上到下减小排列,
将map_y,map_x组合,以坐标形式输出,则结果为
而原图的坐标为:
对比发现,原图坐标和map_y,map_x组合坐标发生了上下翻转。
然后根据坐标,把原图坐标对应的像素点一一映射到转换图上,就是上下翻转变换后的图像,这也是图片重映射的原理。参考OpenCV关于重映射map_x,map_y的疑惑_ganwenbo2011的博客-CSDN博客
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
- ¥15 用visualstudio2022创建vue项目后无法启动
- ¥15 x趋于0时tanx-sinx极限可以拆开算吗
- ¥500 把面具戴到人脸上,请大家贡献智慧
- ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
- ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
- ¥30 c#打开word开启修订并实时显示批注
- ¥15 如何解决ldsc的这条报错/index error
- ¥15 VS2022+WDK驱动开发环境
- ¥30 关于#java#的问题,请各位专家解答!