我开发了一种简单的稳定器,我对图像的移动有困难。示例 - 我有两个图像(A和B)相对于彼此移动几个像素。我使用相位相关计算偏移量。下一步我需要通过图像的偏移来移动第二个图像。图像上显示了一个示例。我该如何解决这个问题?
有预览图片的链接:
答案 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函数......