I am currently working on stitching images using OpenCV 2.3.1 on Visual Studio 2010, but I am having problems.
Description of the problem I am trying to write a code for stitching several images obtained from several cameras (about 3 ~ 4), i, e, the code should continue to stitch images until I ask him to stop.
The following is what I have done so far: (For simplicity, I replaced part of the code with just a few words)
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.
For step 5. I followed the answer in the following thread and simply changed some parameters: Stitching 2 images in opencv
However, the result is terrible. I just uploaded the result to youtube, and, of course, only those with a link can see it.
http://youtu.be/Oy5z_7LeaMk
My code is shown below: (Only important parts are shown)
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 (ie 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);
What else should I do to make stitching better?
Furthermore, is it wise to make the homography matrix motionless instead of calculating it? I mean specifying the angle and offset between the two cameras on my own in order to get a homography matrix that satisfies what I want.
Thanks.:)