在OpenCV中移动图像的最快方法

时间:2014-05-05 03:50:03

标签: c++ image opencv correlation

我开发了一种简单的稳定器,我对图像的移动有困难。示例 - 我有两个图像(A和B)相对于彼此移动几个像素。我使用相位相关计算偏移量。下一步我需要通过图像的偏移来移动第二个图像。图像上显示了一个示例。我该如何解决这个问题?

有预览图片的链接:

illustration

3 个答案:

答案 0 :(得分:6)

cv :: Rect和cv :: Mat :: copyTo

cv::Mat img=cv::imread("image.jpg");
cv::Mat imgTranslated(img.size(),img.type(),cv::Scalar::all(0));
img(cv::Rect(50,30,img.cols-50,img.rows-30)).copyTo(imgTranslated(cv::Rect(0,0,img.cols-50,img.rows-30)));

答案 1 :(得分:2)

setTo(0)目标图像,然后使用cv :: Mat的operator()创建输入图像和输出图像的子图像(你将使用2 cv :: Rect,大小相同和不同的位移;大小取决于位移,即更大的位移意味着您可以在输出中复制的图像的较小部分)。然后使用方法copyTo。

这样说:通常在提问时你会看到一些代码,显示你到目前为止所尝试的内容。

答案 2 :(得分:1)

我的实施允许转移到任何方向......

using namespace cv;
//and whatever header 'abs' requires...

Mat offsetImageWithPadding(Const Mat& originalImage, int offsetX, int offsetY, Scalar backgroundColour){
        padded = Mat(originalImage.rows + 2 * abs(offsetY), originalImage.cols + 2 * abs(offsetX), CV_8UC3, backgroundColour);
        originalImage.copyTo(padded(Rect(abs(offsetX), abs(offsetY), originalImage.cols, originalImage.rows)));
        return Mat(padded,Rect(abs(offsetX) + offsetX, abs(offsetY) + offsetY, originalImage.cols, originalImage.rows));
}

//example use with black borders along the right hand side and top:
Mat offsetImage = offsetImageWithPadding(originalImage, -10, 6, Scalar(0,0,0));

它取自我自己的工作代码,但是一些变量发生了变化,如果它没有编译,很可能只是一件小事需要改变 - 但你得到了这个想法。 abs函数......