我正在使用以下代码来缝合输入图像。由于未知的原因,输出结果是垃圾!看起来单应矩阵是错误的(或被错误地影响),因为转换后的图像就像一个“被利用的星”!我已经评论了我猜是问题的根源,但我不能意识到这一点。任何帮助或要点都是有价值的!
祝你今天愉快,艾丽
void Stitch2Image(IplImage *mImage1, IplImage *mImage2)
{
// Convert input images to gray
IplImage* gray1 = cvCreateImage(cvSize(mImage1->width, mImage1->height), 8, 1);
cvCvtColor(mImage1, gray1, CV_BGR2GRAY);
IplImage* gray2 = cvCreateImage(cvSize(mImage2->width, mImage2->height), 8, 1);
cvCvtColor(mImage2, gray2, CV_BGR2GRAY);
// Convert gray images to Mat
Mat img1(gray1);
Mat img2(gray2);
// Detect FAST keypoints and BRIEF features in the first image
FastFeatureDetector detector(50);
BriefDescriptorExtractor descriptorExtractor;
BruteForceMatcher<L1<uchar> > descriptorMatcher;
vector<KeyPoint> keypoints1;
detector.detect( img1, keypoints1 );
Mat descriptors1;
descriptorExtractor.compute( img1, keypoints1, descriptors1 );
/* Detect FAST keypoints and BRIEF features in the second image*/
vector<KeyPoint> keypoints2;
detector.detect( img1, keypoints2 );
Mat descriptors2;
descriptorExtractor.compute( img2, keypoints2, descriptors2 );
vector<DMatch> matches;
descriptorMatcher.match(descriptors1, descriptors2, matches);
if (matches.size()==0)
return;
vector<Point2f> points1, points2;
for(size_t q = 0; q < matches.size(); q++)
{
points1.push_back(keypoints1[matches[q].queryIdx].pt);
points2.push_back(keypoints2[matches[q].trainIdx].pt);
}
// Create the result image
result = cvCreateImage(cvSize(mImage2->width * 2, mImage2->height), 8, 3);
cvZero(result);
// Copy the second image in the result image
cvSetImageROI(result, cvRect(mImage2->width, 0, mImage2->width, mImage2->height));
cvCopy(mImage2, result);
cvResetImageROI(result);
// Create warp image
IplImage* warpImage = cvCloneImage(result);
cvZero(warpImage);
/************************** Is there anything wrong here!? *******************/
// Find homography matrix
Mat H = findHomography(Mat(points1), Mat(points2), 8, 3.0);
CvMat HH = H; // Is this line converted correctly?
// Transform warp image
cvWarpPerspective(mImage1, warpImage, &HH);
// Blend
blend(result, warpImage);
/*******************************************************************************/
cvReleaseImage(&gray1);
cvReleaseImage(&gray2);
cvReleaseImage(&warpImage);
}发布于 2011-05-17 13:28:34
这是我建议你尝试的,按如下顺序进行:
1)对单应性使用CV_RANSAC选项。参考http://opencv.willowgarage.com/documentation/cpp/calib3d_camera_calibration_and_3d_reconstruction.html
2)尝试其他描述符,特别是OpenCV附带的SIFT或SURF。对于某些图像,快速或简短的描述符不足以区分。编辑(8月12日):基于简要的ORB描述符,非常好并且很快!
3)尝试查看单应性矩阵(在调试模式下逐步执行或打印),并查看其是否一致。
4)如果上面没有给你一个线索,试着看看形成的匹配。它是否将一个图像中的一个点与另一个图像中的多个点进行匹配?如果是这样,那么问题应该再次出现在描述符或检测器上。
我的直觉是它是描述符(所以1)或2)应该修复它)。
发布于 2011-06-17 03:14:14
在BruteForceMatcher中也切换到Hamming距离而不是L1距离。简要描述符应使用汉明距离进行比较。
发布于 2011-05-20 01:07:30
你的单应性,可能是基于错误的匹配而计算出来的,因此表示错误的对齐。我建议通过额外检查矩阵的行之间的相互依赖性来确定矩阵的路径。
您可以使用以下代码:
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;
}https://stackoverflow.com/questions/6017943
复制相似问题