I am trying to fix and build a mismatch displayed for a pair of images using OpenCV stereoRectifyUncalibrated, but I am not getting very good results. My code is:
template<class T> T convertNumber(string& number) { istringstream ss(number); T t; ss >> t; return t; } void readPoints(vector<Point2f>& points, string filename) { fstream filest(filename.c_str(), ios::in); string line; assert(filest != NULL); getline(filest, line); do{ int posEsp = line.find_first_of(' '); string posX = line.substr(0, posEsp); string posY = line.substr(posEsp+1, line.size() - posEsp); float X = convertNumber<float>(posX); float Y = convertNumber<float>(posY); Point2f pnt = Point2f(X, Y); points.push_back(pnt); getline(filest, line); }while(!filest.eof()); filest.close(); } void drawKeypointSequence(Mat lFrame, Mat rFrame, vector<KeyPoint>& lKeyp, vector<KeyPoint>& rKeyp) { namedWindow("prevFrame", WINDOW_AUTOSIZE); namedWindow("currFrame", WINDOW_AUTOSIZE); moveWindow("prevFrame", 0, 300); moveWindow("currFrame", 650, 300); Mat rFrameAux; rFrame.copyTo(rFrameAux); Mat lFrameAux; lFrame.copyTo(lFrameAux); int size = rKeyp.size(); for(int i=0; i<size; i++) { vector<KeyPoint> drawRightKeyp; vector<KeyPoint> drawleftKeyp; drawRightKeyp.push_back(rKeyp[i]); drawleftKeyp.push_back(lKeyp[i]); cout << rKeyp[i].pt << " <<<>>> " << lKeyp[i].pt << endl; drawKeypoints(rFrameAux, drawRightKeyp, rFrameAux, Scalar::all(255), DrawMatchesFlags::DRAW_OVER_OUTIMG); drawKeypoints(lFrameAux, drawleftKeyp, lFrameAux, Scalar::all(255), DrawMatchesFlags::DRAW_OVER_OUTIMG); imshow("currFrame", rFrameAux); imshow("prevFrame", lFrameAux); waitKey(0); } imwrite("RightKeypFrame.jpg", rFrameAux); imwrite("LeftKeypFrame.jpg", lFrameAux); } int main(int argc, char* argv[]) { StereoBM stereo(StereoBM::BASIC_PRESET, 16*5, 21); double ndisp = 16*4; assert(argc == 5); string rightImgFilename(argv[1]);
The drawKeyPoint sequence is how I visually check the consistency of the points that I have for both images. By choosing each of my key points in sequence, I can be sure that the key point i in image A is the key point i in image B.
I also tried playing with the ndisp parameter, but that didn't help much.
I tried it for the following two images:
Leftimage
RightImage
got the following fixed pair:
Rectifiedleft
Rectifiedright
and finally the following mismatch display
DisparityMap
Which, as you can see, is pretty bad. I also tried the same pair of images with the following stereogram pattern example: "http://programmingexamples.net/wiki/OpenCV/WishList/StereoRectifyUncalibrated and SBM_Sample.cpp from the sample opencv instructional code for building the mismatch map, and got a very similar result .
I am using opencv 2.4
Thanks in advance!