OpenCV - 图像拼接

时间:2011-05-16 13:12:07

标签: image-processing opencv image-stitching

3 个答案:

答案 0 :(得分:7)

我建议您按此顺序尝试:

1)使用CV_RANSAC选项进行单应性。请参阅http://opencv.willowgarage.com/documentation/cpp/calib3d_camera_calibration_and_3d_reconstruction.html

2)尝试其他描述符,特别是OpenCV附带的SIFT或SURF。对于某些图像,FAST或BRIEF描述符不够区分。编辑(2012年8月):ORB描述符基于BRIEF,非常好而且快速!

3)尝试查看Homography矩阵(在调试模式中单步执行或打印它)并查看它是否一致。

4)如果上面没有给你一个线索,试着看看形成的匹配。是否将一个图像中的一个点与另一个图像中的多个点匹配?如果是这样,问题应该再次出现在描述符或探测器上。

我的预感是描述符(如此1)或2)应该修复它。)

答案 1 :(得分:2)

在BruteForceMatcher中也切换到汉明距离而不是L1距离。应该使用汉明距离来比较简要描述符。

答案 2 :(得分:1)

你的单应性,可能是根据错误的匹配计算的,因此代表不良的排列。 我建议通过额外检查矩阵之间的相互依赖来检查矩阵。

您可以使用以下代码:

bool cvExtCheckTransformValid(const Mat& T){

    // Check the shape of the matrix
    if (T.empty())
       return false;
    if (T.rows != 3)
       return false;
    if (T.cols != 3)
       return false;

    // Check for linear dependency.
    Mat tmp;
    T.row(0).copyTo(tmp);
    tmp /= T.row(1);
    Scalar mean;
    Scalar stddev;
    meanStdDev(tmp,mean,stddev);
    double X = abs(stddev[0]/mean[0]);
    printf("std of H:%g\n",X);
    if (X < 0.8)
       return false;

    return true;    
}