我正在使用Homography扭曲第一张图像,新图像由孔组成。这是什么原因呢?
发布于 2014-03-28 16:31:46
单应性是映射图像像素坐标的变换矩阵(参考wiki。因此,假设图像左上角的均匀坐标为:p0 = [0 0 1]^T。在一些一般的单应性H下,可能是因为p = H * p0不是新扭曲图像的左上角,所以在新图像的左上角将有孔。下面是一个更直观的例子(特别是对于相似性转换,图像大小将会缩小):

发布于 2014-03-28 18:05:21
这取决于洞的形状。
如果这些空洞实际上是散布在输出图像上的空洞,那么这意味着发生了一些不好的事情(某个地方的bug,或者你的单应性可能因为一个糟糕的估计过程而退化)。
您可以尝试将直接调用单应性扭曲的结果与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())。这两个结果应该是相似的(如果不相等,取决于插值和边界设置)。您还可以在映射计算循环中添加额外的健全性检查,以了解哪里出了问题。
https://stackoverflow.com/questions/22705632
复制相似问题