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

5
我正在开发一个简单的稳像器,但是我在图像的平移方面遇到了困难。例如,我有两幅图像(A和B),它们相对于彼此平移了几个像素。我使用相位相关计算偏移量。接下来,我需要将第二张图像移动到图像的偏移位置。下面是一个示例图像。我该如何解决这个问题?
以下是预览图像链接: https://istack.dev59.com/nRIEw.webp

3
你能展示一下你迄今为止尝试过的代码吗? - James King
如果您可以从一开始就将图像嵌入到更大的图像中(并且如果您可以通过边框的最大大小限制移位),则可以使用子图像而不是移动任何内容。 - Micka
3个回答

7

cv::Rect and 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)));

2

使用setTo(0)方法将目标图像初始化为黑色,然后使用cv::Mat的operator()方法创建输入图像和输出图像的子图像(你需要使用2个相同大小但不同位移的cv::Rect对象;大小取决于位移量,即位移量越大表示可以复制到输出中的图像部分越小)。然后使用copyTo方法进行复制。

一般而言,在提问时通常会展示一些已尝试的代码。


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 函数的用法...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接