現在、Visual Studio 2010 で OpenCV 2.3.1 を使用して画像のスティッチングに取り組んでいますが、問題が発生しています。
問題の説明 数台のカメラ (約 3 ~ 4 台) から取得した複数の画像をスティッチングするためのコードを作成しようとしています。
これまでに行ったことは次のとおりです: (簡単にするために、コードの一部をいくつかの単語に置き換えます)
1.Reading frames(images) from 2 cameras (Currently I'm just working on 2 cameras.)
2.Feature detection, descriptor calculation (SURF)
3.Feature matching using FlannBasedMatcher
4.Removing outliers and calculate the Homography with inliers using RANSAC.
5.Warp one of both images.
ステップ 5. では、次のスレッドの回答に従い、いくつかのパラメーターを変更しました: Opencv で 2 つの画像をステッチする
しかし、結果はひどいものです。結果を youtube にアップロードしました。もちろん、リンクを知っている人だけが見ることができます。
私のコードを以下に示します:(重要な部分のみが表示されます)
VideoCapture cam1, cam2;
cam1.open(0);
cam2.open(1);
while(1)
{
Mat frm1, frm2;
cam1 >> frm1;
cam2 >> frm2;
//(SURF detection, descriptor calculation
//and matching using FlannBasedMatcher)
double max_dist = 0; double min_dist = 100;
//-- Quick calculation of max and min distances between keypoints
for( int i = 0; i < descriptors_1.rows; i++ )
{
double dist = matches[i].distance;
if( dist < min_dist ) min_dist = dist;
if( dist > max_dist ) max_dist = dist;
}
(Draw only "good" matches
(i.e. whose distance is less than 3*min_dist ))
vector<Point2f> frame1;
vector<Point2f> frame2;
for( int i = 0; i < good_matches.size(); i++ )
{
//-- Get the keypoints from the good matches
frame1.push_back( keypoints_1[ good_matches[i].queryIdx ].pt );
frame2.push_back( keypoints_2[ good_matches[i].trainIdx ].pt );
}
Mat H = findHomography( Mat(frame1), Mat(frame2), CV_RANSAC );
cout << "Homography: " << H << endl;
/* warp the image */
Mat warpImage2;
warpPerspective(frm2, warpImage2,
H, Size(frm2.cols, frm2.rows), INTER_CUBIC);
Mat final(Size(frm2.cols*3 + frm1.cols, frm2.rows),CV_8UC3);
Mat roi1(final, Rect(frm1.cols, 0, frm1.cols, frm1.rows));
Mat roi2(final, Rect(2*frm1.cols, 0, frm2.cols, frm2.rows));
warpImage2.copyTo(roi2);
frm1.copyTo(roi1);
imshow("final", final);
縫製を良くするために他に何をすればよいですか?
また、ホモグラフィ行列を計算し続けるのではなく固定することは合理的ですか? つまり、2 台のカメラ間の角度と変位を自分で指定して、希望を満たすホモグラフィ行列を導き出すということです。
ありがとう。:)