立体匹配源代码:
#include "cv.h"
#include "cxmisc.h"
#include "highgui.h"
//#include "cvaux.h"
#include <vector>
#include <string>
#include <algorithm>
#include <stdio.h>
#include <ctype.h>
using namespace std;
static void StereoCalib(const char* imageList, int nx, int ny, int useUncalibrated)
{
int displayCorners = 0;
int showUndistorted = 1;
bool isVerticalStereo = false;//OpenCV can handle left-right
//or up-down camera arrangements
const int maxScale = 1;
const float squareSize = 1.f; //棋盘每个方格的大小,以实际为准,这里为1
FILE* f = fopen(imageList, "rt"); //读取棋盘的路径文件
int i, j, lr, nframes, n = nx*ny, N = 0;
vector<string> imageNames[2];//保存左右图像的路径,imageName[0]保存左图像的路径,imageName[1]保存右图像的路径
vector<CvPoint3D32f> objectPoints; //保存nframes幅棋盘图像的角点坐标
vector<CvPoint2D32f> points[2]; //保存左右图像的总角点坐标,points[0]保存左图像总角点坐标,points[1]保存右图像的
vector<int> npoints;
vector<uchar> active[2]; //保存左右每幅图像角点检测的返回结果
vector<CvPoint2D32f> temp(n); //保存每个棋盘角点坐标
CvSize imageSize = { 0, 0 };
double M1[3][3], M2[3][3], D1[5], D2[5];
double R[3][3], T[3], E[3][3], F[3][3];
CvMat _M1 = cvMat(3, 3, CV_64F, M1);
CvMat _M2 = cvMat(3, 3, CV_64F, M2);
CvMat _D1 = cvMat(1, 5, CV_64F, D1);
CvMat _D2 = cvMat(1, 5, CV_64F, D2);
CvMat _R = cvMat(3, 3, CV_64F, R);
CvMat _T = cvMat(3, 1, CV_64F, T);
CvMat _E = cvMat(3, 3, CV_64F, E);
CvMat _F = cvMat(3, 3, CV_64F, F);
if (displayCorners)
cvNamedWindow("corners", 1);
if (!f)
{
fprintf(stderr, "can not open file %s\n", imageList);
return;
}
for (i = 0;; i++) //循环,每次在buf中读取一幅图像,左右图像交替的读取
{
char buf[1024];
int count = 0, result = 0;
lr = i % 2;
vector<CvPoint2D32f>& pts = points[lr];
if (!fgets(buf, sizeof(buf)-3, f)) //从f所指文件结构中读取一行存入buf中
break;
size_t len = strlen(buf);
while (len > 0 && isspace(buf[len - 1]))
buf[--len] = '\0';
if (buf[0] == '#')
continue;
IplImage* img = cvLoadImage(buf, 0);//加载图像
if (!img)
break;
imageSize = cvGetSize(img);
imageNames[lr].push_back(buf);