//记录一下这两天的实验
// ZouStrereo.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "ZouStrereo.h" #include "opencv2/contrib/contrib.hpp" #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <opencv2\opencv.hpp> #include <iostream> #include <string> #include "CameraDS.h" #include "Stereo.h" #include "CvvImage.h" //#include "MainWindow.h" using namespace cv; #ifdef _DEBUG #define new DEBUG_NEW #endif // The one and only application object CWinApp theApp; using namespace std; int Calibrate( int xC, int yC,double RectMM,int GroupImg) { printf("标定开始\n\n"); CStereo Stereo; int iXPtCount; int iYPtCount; float fSquareSize; FILE* file; file = fopen("初始化文件.txt","r"); int temp=0; if(file!=NULL) { fscanf(file,"%d\n",&iXPtCount); fscanf(file,"%d\n",&iYPtCount); fscanf(file,"%d\n",&temp); fscanf(file,"%f\n",&fSquareSize); Stereo.SetPtCount(iXPtCount,iYPtCount); Stereo.SetSquareSize(fSquareSize); fclose(file); }else { iXPtCount = xC; iYPtCount = yC; temp = 0; fSquareSize = RectMM; Stereo.SetPtCount(iXPtCount,iYPtCount); Stereo.SetSquareSize(fSquareSize); } //int found = 0; //BOOL bInit = FALSE; IplImage* iplDst1 = NULL; IplImage* iplDst2 = NULL; CvSize imgSize; //CvvImage img1; //CvvImage img2; //HDC hDC = ::GetDC(hWnd); //CRect rect1; //CRect rect2; //::GetClientRect(hWnd,&rect1); //rect1.right = rect1.right/2; //::GetClientRect(hWnd,&rect2); //rect2.left = rect2.right/2; char* names_L[] = { "./L/LCameraCapture_1.jpg", "./L/LCameraCapture_2.jpg", "./L/LCameraCapture_3.jpg", "./L/LCameraCapture_4.jpg", "./L/LCameraCapture_5.jpg", "./L/LCameraCapture_6.jpg"}; char* names_R[] = { "./R/RCameraCapture_1.jpg", "./R/RCameraCapture_2.jpg", "./R/RCameraCapture_3.jpg", "./R/RCameraCapture_4.jpg", "./R/RCameraCapture_5.jpg", "./R/RCameraCapture_6.jpg"}; //CvSize ImageSize={640,480}; //CvSize CornerSize={5,7}; //棋盘角点的大小 //int nbLines=CornerSize.height; //行 //int nbClos=CornerSize.width; //列 //int nbPoints=nbLines*nbClos; //角点数量 //int CornersFound; //找到的角点数 cvNamedWindow("L"); cvNamedWindow("R"); int PicNum = 6; for (int i=0;i<PicNum;i++) { //img=cvLoadImage(names_L[i]); //img1=cvCloneImage(img); printf("start--->image [%d]\n",i); Stereo.LoadImage(names_L[i],names_R[i]); if(Stereo.GetImageSize(imgSize)) { iplDst1 = cvCreateImage(imgSize,8,3); iplDst2 = cvCreateImage(imgSize,8,3); //bInit = TRUE; } if(Stereo.FindChessboardCorners(iplDst1, iplDst2)) { //img1.CopyOf(iplDst1); //img2.CopyOf(iplDst2); cvShowImage("L", iplDst1); cvShowImage("R", iplDst2); cvWaitKey(1000); } printf("end--->image [%d]\n \n",i); } if(Stereo.GetFound()==0) return -1; Stereo.StereoCalibrate( ); Stereo.UndistortRectifyMap( temp ); Stereo.StereoBMState( ); Stereo.CalDistance( ); Stereo.CalAccuracy(); Stereo.Save( ); cvReleaseImage(&iplDst1); cvReleaseImage(&iplDst2); cvDestroyAllWindows(); printf("标定结束\n"); return 0; } int CalDistance() { int cam_count; cam_count = CCameraDS::CameraCount();//获取摄像头数目 printf("There are %d cameras.\n", cam_count);//输出摄像头数目 for(int i=0; i < cam_count; i++) //获取所有摄像头名称并显示出来 { char camera_name[1024];//声明1024个字符空间,1024字节 int retval= CCameraDS::CameraName(i,camera_name,sizeof(camera_name) ); //根据摄像头编号返回摄像头名字 if(retval >0) printf("Camera #%d's Name is '%s'.\n", i, camera_name); else printf("Can not get Camera #%d's name.\n", i); } if(cam_count==0)//如果没有摄像头,返回-1 return -1; CCameraDS camera0;//产生对象,打开第一个摄像头 CCameraDS camera1;//产生对象,打开第二个摄像头 //if(! camera.OpenCamera(0, true)) //打开摄像头,指定摄像头0开始,参数2指示是否自动弹出摄像头属性页。 if(! camera0.OpenCamera(0,false,640, 480 )) //false不弹出属性窗,用代码制定宽和高 { fprintf(stderr, "Can not open camera 0.\n");//不成功,if(!0),执行代码 return -1; } if(! camera1.OpenCamera(1,false,640, 480 )) { fprintf(stderr, "Can not open camera 1.\n");//不成功,if(!0),执行代码 return -1; } cvNamedWindow("camera1-Left");//创建窗口1 cvNamedWindow("camera2-Right");//创建窗口2 CStereo Stereo; Stereo.Load( ); CvSize imgSize; BOOL bInit = FALSE; IplImage* temp1 = NULL; IplImage* temp2 = NULL; IplImage* iplDst1 = NULL; IplImage* iplDst2 = NULL; //BOOL bInit = FALSE; while(1) { //获取一帧 temp1 = camera0.QueryFrame(); //cvWaitKey(1000); temp2 = camera1.QueryFrame(); Stereo.LoadImage(temp1,temp2); if(!bInit) { Stereo.GetImageSize(imgSize); iplDst1 = cvCreateImage(imgSize,8,3); iplDst2 = cvCreateImage(imgSize,8,3); bInit =TRUE; } Stereo.StereoBMState(iplDst1,iplDst2 ); //img1.CopyOf(iplDst1); //img2.CopyOf(iplDst2); //img1.DrawToHDC(hDC,Rect1); //img2.DrawToHDC(hDC,Rect2); Stereo.CalDistance( ); //显示 cvShowImage("camera2-Right", iplDst1); cvShowImage("camera1-Left", iplDst2); if (cvWaitKey(30) == 'q')//输入按键为q,break break; } camera0.CloseCamera();//可不调用此函数,CCameraDS析构时会自动关闭摄像头 camera1.CloseCamera();//可不调用此函数,CCameraDS析构时会自动关闭摄像头 //cvDestroyWindow("camera1"); //cvDestroyWindow("camera2"); cvDestroyAllWindows(); return 0; } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // initialize MFC and print and error on failure if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: change error code to suit your needs _tprintf(_T("Fatal Error: MFC initialization failed\n")); nRetCode = 1; } else { // TODO: code your application's behavior here. /////////////////////////////////////////////////////////////////////////////////// int xchoose = 0; switch(xchoose) { case 0: { Calibrate( 5,7,40.0,6); } break; case 1: { int cam_count; cam_count = CCameraDS::CameraCount();//获取摄像头数目 printf("There are %d cameras.\n", cam_count);//输出摄像头数目 for(int i=0; i < cam_count; i++) //获取所有摄像头名称并显示出来 { char camera_name[1024];//声明1024个字符空间,1024字节 int retval= CCameraDS::CameraName(i,camera_name,sizeof(camera_name) ); //根据摄像头编号返回摄像头名字 if(retval >0) printf("Camera #%d's Name is '%s'.\n", i, camera_name); else printf("Can not get Camera #%d's name.\n", i); } if(cam_count==0)//如果没有摄像头,返回-1 return -1; CCameraDS camera0;//产生对象,打开第一个摄像头 CCameraDS camera1;//产生对象,打开第二个摄像头 //if(! camera.OpenCamera(0, true)) //打开摄像头,指定摄像头0开始,参数2指示是否自动弹出摄像头属性页。 if(! camera0.OpenCamera(0,false,640, 480 )) //false不弹出属性窗,用代码制定宽和高 { fprintf(stderr, "Can not open camera 0.\n");//不成功,if(!0),执行代码 return -1; } if(! camera1.OpenCamera(1,false,640, 480 )) { fprintf(stderr, "Can not open camera 1.\n");//不成功,if(!0),执行代码 return -1; } cvNamedWindow("camera1-Left");//创建窗口1 cvNamedWindow("camera2-Right");//创建窗口2 while(1) { //获取一帧 IplImage *pFrame0 = camera0.QueryFrame(); //cvWaitKey(1000); IplImage *pFrame1 = camera1.QueryFrame(); //显示 cvShowImage("camera2-Right", pFrame0); cvShowImage("camera1-Left", pFrame1); if (cvWaitKey(20) == 'q')//输入按键为q,break break; } camera0.CloseCamera();//可不调用此函数,CCameraDS析构时会自动关闭摄像头 camera1.CloseCamera();//可不调用此函数,CCameraDS析构时会自动关闭摄像头 cvDestroyWindow("camera1"); cvDestroyWindow("camera2"); //return 0; } break; case 3: { CalDistance(); } break; default: break; } } system("pause"); return nRetCode; }