在OpenCV中将每个像素移动到右边(1px)而不使用重映射?

ken*_*yzx 2 opencv image-processing remap

我想将图像中的每个像素向右移动1px,下面是我用来进行重映射转换的地图.

这种方法需要比进行这种简单转换所需的时间更多的时间.我可以使用cv功能吗?或者我只是将图像分成2个图像,一个是src.cols-1像素宽,另一个是1像素宽,然后将它们复制到新图像?

void update_map()
{
    for( int j = 0; j < src.cols; j++ ){
       for( int i = 0; i < src.rows; i++ ){
         if (j == src.cols-1)
             mat_x_Rotate.at<float>(i,j) = 0;
         else
            mat_x_Rotate.at<float>(i,j) = j + 1;
            mat_y_Rotate.at<float>(i,j) = i;
         }
     }
}
Run Code Online (Sandbox Code Playgroud)

com*_*orm 8

您可以采取哪些措施来改善绩效:

  • 为此目的,重新映射是过度的.直接复制像素比定义整个重映射转换然后使用它更有效.
  • 切换循环顺序:遍历行,然后遍历列.(OpenCV Mat以行主顺序存储,因此首先迭代列非常缓存不友好)
  • 用于Mat::ptr()直接访问同一行中的像素,作为C风格的数组.(这是一个很大的性能赢得使用at<>(),这可能会像每次访问的检查索引一样)
  • 将您的if语句从内循环中取出,并0单独处理列.

作为替代方案:是的,将图像分成几部分并复制到新图像可能与直接复制一样有效,如上所述.