We唯有自己强大 2021-05-22 08:57 采纳率: 50%
浏览 43
已采纳

请大神们帮忙解释有关图像处理remap代码的问题

#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条回答 默认 最新

  • 关注

    假设对一张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博客

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置