1

我想做一个循环图像旋转,如下所示。在此处输入图像描述

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

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

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

  Mat CircShift(Mat inputImage, int PixelInXdirectionToShift);

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

4

2 回答 2

4
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)));
于 2013-11-13T15:08:04.410 回答
0

对于 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);

您还可以使用 ROI

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);
于 2013-11-13T14:22:00.157 回答