【问题标题】:round robin image rotation what is the best way to do in opencv循环图像旋转在opencv中最好的方法是什么
【发布时间】:2013-11-13 14:15:35
【问题描述】:

我想做一个循环图像旋转,如下所示。

从图像开头的 x 垂直线被移除并添加到图像的末尾。

在 OpenCV、GDI++ 和 WPF 中执行此操作的最佳方法是什么?我需要为每个平台提供一个解决方案,但它们的实现方式可能不同。

我需要在具有以下签名的函数中实现它(对于opencv)

  Mat CircShift(Mat inputImage, int PixelInXdirectionToShift);

我知道如何通过操作像素来做到这一点,但我正在寻找一种解决方案,当像素操作不是那么快时,它可以非常快速地完成此操作。

【问题讨论】:

    标签: wpf opencv image-processing gdi+


    【解决方案1】:
    Mat outImg(inputImg.size(),inputImg.type());
    inputImg(Rect(0, 0, shiftX, height)).copyTo(outImg(Rect(width-shiftX, 0, shiftX, height)));
    inputImg(Rect(shiftX, 0, width-shiftX, height)).copyTo(outImg(Rect(0, 0, width-shiftX, height)));
    

    【讨论】:

      【解决方案2】:

      对于 OpenCV,请查看 remap

      编辑: 轻松/快速创建地图(使用矢量):

      //Create vector of what the rows/cols look like
      std::vector<int> t_X,t_Y;
      for (int i = 0; i < img.cols(); i++) t_X.push_back(i);
      for (int i = 0; i < img.rows(); i++) t_Y.push_back(i);
      
      //circular shift t_X vector
      std::vector<int>::iterator it;
      int zeroPixel = 50; //This x-pixel to bring to 0 (shifting to the left)
      
      it = std::find(t_X.begin(), t_X.end(), zeroPixel);
      std::rotate(t_X.begin(), it, t_X.end());
      
      //Create Maps
       //Turn vectors in cv::Mat
       cv::Mat xRange = cv::Mat(t_X);
       cv::Mat yRange = cv::Mat(t_Y);
       //Maps
       cv::Mat xMap;
       cv::Mat yMap;
      
       cv::repeat(xRange.reshape(1,1), yRange.total(), 1, xMap);
       cv::repeat(yRange.reshape(1,1).t(), 1, xRange.total(), yMap);
      

      你也可以使用 ROIs

      int zeroPixel = 50;
      cv::Mat newMat;
      cv::Mat rightHalf = img(cv::Rect(0,0,zeroPixel,img.rows()));
      cv::Mat leftHalf = img(cv::Rect(0,zeroPixel+1,img.cols()-zeroPixel-1,img.rows());
      cv::hconcat(leftHalf , rightHalf , newMat);
      

      【讨论】:

      • 谢谢,但我认为这并不快,因为我需要先创建地图,然后再进行轮班。创建地图很慢,如果我通过操作像素来完成此操作,我可能会得到与创建地图相同的开销。
      • 您必须以某种方式移动像素,您可以尝试通过手动移动像素或尝试移动数组数据本身来实现。到那时,您可能已经创建了一个简化版本的重映射。我添加了一种简单快捷的方法来创建移动地图到我的答案。由于您只是沿列移动,因此您可以使用 INTER_NEAREST 作为插值方法而不会降低图像质量,并且它会快速重新映射。
      • 好吧,我不知道为什么我对这个问题如此感兴趣,但我添加了另一种使用 ROI 的方法(基本上是剪切和粘贴),可能会更快。
      猜你喜欢
      • 1970-01-01
      • 2018-07-06
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多