1

以下に示すように、ラウンドロビンの画像回転を行いたいです。ここに画像の説明を入力

画像の先頭からの x 垂直線が削除され、画像の末尾に追加されます。

OpenCV、GDI++、および WPF でこれを行う最善の方法は何ですか? これらのプラットフォームごとにソリューションが必要ですが、実装方法が異なる可能性があります。

次のシグネチャを持つ関数に実装する必要があります(opencvの場合)

  Mat CircShift(Mat inputImage, int PixelInXdirectionToShift);

ピクセルを操作することでこれを行う方法は知っていますが、ピクセル操作がそれほど速くない場合にこれを非常に高速に行うソリューションを探しています。

4

2 に答える 2

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 に答える