我使用Homography扭曲第一张图像,新图像由孔组成。这是什么原因?
答案 0 :(得分:0)
Homography是一个映射图像像素坐标(ref wiki)的变换矩阵。因此,假设图像左上角的同质坐标为:p0 = [0 0 1]^T
。在一些一般的单应性H
下,p = H * p0
可能不是新变形图像的左上角,因此新图像的左上角会有孔。下面显示了一个更直观的示例(特别是对于相似性转换,图像大小会缩小):
答案 1 :(得分:0)
这取决于孔的形状。
如果通过 hole 你的意思是黑色区域(大概是三角形或梯形形状),那么它就是一个神器,它来自于单应性将矩形映射到空中(参见{{3回答,特别是里面的绘图。)
如果 hole 真的是遍布输出图像的漏洞,那么就意味着发生了一些不好的事情(某处出现错误,或者由于估算过程不佳,你的单应性可能会退化)。 / p>
您可以尝试将直接调用与单应变形的结果与cv::remap()
函数的输出进行比较,并使用从单应矩阵中获取的映射:
/* Assuming the input image is not empty */
cv::Mat originalImage; // Not empty!
/* Our outputs */
cv::Mat homographyOutput, remapOutput;
cv::Mat H; // This is our homography
cv::Mat map_x, map_y; // These matrices are needed for cv::remap()
/* Compute mappings from homography */
map_x.create(originalImage.size(), CV_32FC1);
map_y.create(originalImage.size(), CV_32FC1);
for (int y = 0; y < originalImage.size().height; ++y)
for (int x = 0; x < originalImage.size().width; ++x)
{
double x_mapped = H.at<double>(0,0)*x + H.at<double>(0,1)*y +
H.at<double>(0,2);
double y_mapped = H.at<double>(1,0)*x + H.at<double>(1,1)*y +
H.at<double>(1,2);
double w = H.at<double>(2,0)*x + H.at<double>(2,1)*y +
H.at<double>(2,2);
x_mapped /= w;
y_mapped /= w;
map_x.at<float>(y,x) = (float)x_mapped;
map_y.at<float>(y,x) = (float)y_mapped;
}
/* Now call remap */
cv::remap(originalImage, remapOutput, map_x, map_y);
我留给你的单应性映射部分(使用cv::warpPerspective()
)。两个结果应该相似(如果不相等,则在插值和边框设置上进行处理)。您还可以在映射计算循环中添加其他健全性检查,以了解错误。