8

次のコードを使用して、入力画像にステッチしています。理由は不明ですが、出力結果はがらくたです! 変換された画像が「悪用された星」のようなものであるため、ホモグラフィ行列が間違っている (または誤って影響を受けている) ようです。問題の原因と思われる部分をコメントしましたが、認識できません。任意のヘルプまたはポイントが適用されます!

良い一日を、アリ

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); 
}
4

3 に答える 3

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 月): BRIEF に基づく ORB 記述子は、非常に優れており、高速です。

3) ホモグラフィ行列を調べて (デバッグ モードでステップスルーするか印刷して)、一貫性があるかどうかを確認します。

4) 上記で手がかりが得られない場合は、形成された一致を調べてみてください。1 つの画像の 1 つの点と他の画像の多数の点が一致していますか? その場合、問題は記述子または検出器にあるはずです。

私の推測では、それは記述子です(したがって、1)または2)で修正する必要があります)。

于 2011-05-17T05:28:33.680 に答える
2

また、BruteForceMatcher で L1 距離の代わりにハミング距離に切り替えます。簡単な記述子は、ハミング距離を使用して比較されることになっています。

于 2011-06-16T19:14:14.293 に答える
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;    
}
于 2011-05-19T17:07:30.283 に答える