答案 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;
}