//记录一下这两天的实验
// 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;
}