⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 multicapture.cpp

📁 利用opencv开发包进行双摄像头的视频采集
💻 CPP
字号:
// cvcam2.cpp : Defines the entry point for the console application.
//

#include <cvcam.h>
#include <cv.h>
#include <windows.h>
#include <highgui.h>

#include <stdio.h>

//定义全局变量yuvframe,用于管理采集到的帧
struct
{
	FILE *leftyuv,*rightyuv;
	IplImage *yuv,*y,*u,*v,*uv420;
	CvSize size;
}yuvframe;


int iframe=0;
int cntframe;

#define CNT 30

int Histogram(int nCamera)
{

    IplImage * src = 0;
    IplImage *histimg = 0;
    CvHistogram *hist = 0;
    
    int hdims = 50;     // 划分HIST的个数,越高越精确
    float hranges_arr[] = {0,255};
    float* hranges = hranges_arr;
    int bin_w;  
    float max_val;
    int i;
    
	switch(nCamera)
	{
		case 1:
			{
				src=cvLoadImage("captureLeftImage.jpg", 0);  // force to gray image
				break;
			}
		case 2:
			{
				src=cvLoadImage("captureRightImage.jpg", 0);  // force to gray image
				break;
			}
		default : return 0;
	}

    hist = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, &hranges, 1 );  // 计算直方图
    histimg = cvCreateImage( cvSize(320,200), 8, 3 );

    cvZero( histimg );
    
    cvCalcHist( &src, hist, 0, 0 ); // 计算直方图
    cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 );  // 只找最大值
    cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 ); // 缩放 bin 到区间 [0,255] 
    
    cvZero( histimg );
    bin_w = histimg->width / hdims;  // hdims: 条的个数,则 bin_w 为条的宽度
    
    // 画直方图
    for( i = 0; i < hdims; i++ )
    {
        double val = ( cvGetReal1D(hist->bins,i)*histimg->height/255 );
        CvScalar color = CV_RGB(0,255,255); //(hsv2rgb(i*180.f/hdims);
        cvRectangle( histimg, cvPoint(i*bin_w,histimg->height),cvPoint((i+1)*bin_w,
			(int)(histimg->height - val)),color,1,8,0);
    }

        
	switch(nCamera)
	{
		case 1:cvShowImage( "HistogramLeft", histimg );break;
		case 2:cvShowImage( "HistogramRight", histimg );break;
		default : break;
	}

    return 0;
}


void callbackStereo(IplImage* image1,IplImage* image2) 
{ 
	iframe++;
	if(iframe%CNT==0)
	{
		// 写入左图像
		cvShowImage("CaptureLeftFrame", image1);
		cvSaveImage("captureLeftImage.jpg",image1);
		Histogram(1);
		// 写入右图像
		cvSaveImage("captureRightImage.jpg",image2);
		cvShowImage("CaptureRightFrame",image2);
		Histogram(2);
		printf("采集%d\n",iframe/CNT);
	}
	
} 


//设置全局文件指针变量,用于保存左右两路视频,格式YUV

int main(int argc, char* argv[]) 
{ 
	int cvCamleft,cvCamright; 
	
	if (argc>1)
	{
		int i=0;
		cntframe=0;
		while(argv[1][i]<='9'&&argv[1][i]>='0')
		{
			cntframe=cntframe*10+argv[1][i]-'0';
			i++;
		}
	}
	else
		cntframe=30;
	
	if (cntframe<=0||cntframe>5000)
		cntframe=30;
	
	//设置视频帧大小和帧率
	//qcif 176x144; cif 352x288 
	VidFormat vidfmt={352,288,30.0};
	yuvframe.size=cvSize(vidfmt.width,vidfmt.height);
	//	cvNamedWindow("test",CV_WINDOW_AUTOSIZE);

	if ((yuvframe.leftyuv=fopen("left.yuv","wb"))==NULL)
	{
		printf("can't open left.yuv\n");
		exit(-1);
	}
	if ((yuvframe.rightyuv=fopen("right.yuv","wb"))==NULL)
	{
		printf("can't open right.yuv\n");
		fclose(yuvframe.leftyuv);
		exit(-1);
	}

	//初始化yuvframe结果成员
	yuvframe.size=cvSize(vidfmt.width,vidfmt.height);
	yuvframe.yuv=cvCreateImage(yuvframe.size,IPL_DEPTH_8U,3);
	yuvframe.y=cvCreateImage(yuvframe.size,IPL_DEPTH_8U,1);
	yuvframe.u=cvCreateImage(yuvframe.size,IPL_DEPTH_8U,1);
	yuvframe.v=cvCreateImage(yuvframe.size,IPL_DEPTH_8U,1);
	yuvframe.uv420=cvCreateImage(cvSize(yuvframe.size.width/2,yuvframe.size.height/2),IPL_DEPTH_8U,1);	
	
	cvNamedWindow("cvCamleft",1); 
	cvNamedWindow("cvCamright",1); 
	HWND hwnd1 = (HWND)cvGetWindowHandle("cvCamleft"); 
	HWND hwnd2 = (HWND)cvGetWindowHandle("cvCamright"); 

	cvNamedWindow("CaptureLeftFrame",1); 
	cvNamedWindow("CaptureRightFrame",1); 
	cvNamedWindow( "HistogramLeft", 1 );
	cvNamedWindow( "HistogramRight", 1 );

	int numCams = cvcamGetCamerasCount(); 
	if (numCams!=2)
	{
		printf("error, numCams=%d\n",numCams);
		exit(-1);
	}

	//YUV视频设置
	//设置左路视频
	cvcamSetProperty(0,CVCAM_PROP_ENABLE,&cvCamleft); 
	cvcamSetProperty(0,CVCAM_PROP_RENDER,&cvCamleft); 
	cvcamSetProperty(0,CVCAM_PROP_WINDOW,&hwnd1); 
	cvcamSetProperty(0,CVCAM_STEREO_CALLBACK,callbackStereo); 
	cvcamSetProperty(0,CVCAM_RNDWIDTH,&(vidfmt.width)); 
	cvcamSetProperty(0,CVCAM_RNDHEIGHT,&(vidfmt.height)); 
	cvcamSetProperty(0, CVCAM_PROP_SETFORMAT, &vidfmt);
	//设置右路视频
	cvcamSetProperty(1,CVCAM_PROP_ENABLE,&cvCamright); 
	cvcamSetProperty(1,CVCAM_PROP_RENDER,&cvCamright); 
	cvcamSetProperty(1,CVCAM_PROP_WINDOW,&hwnd2); 
	cvcamSetProperty(1,CVCAM_STEREO_CALLBACK,callbackStereo); 
	cvcamSetProperty(1,CVCAM_RNDWIDTH,&(vidfmt.width)); 
	cvcamSetProperty(1,CVCAM_RNDHEIGHT,&(vidfmt.height));
	cvcamSetProperty(1,CVCAM_PROP_SETFORMAT, &vidfmt);
	
	//开启视频采集
	
	cvcamInit(); 
	cvcamStart(); 
	//运行中...
	//可以指定采集时间,毫秒
	cvWaitKey(0);
	//运行结束退出
	cvcamStop(); 
	cvcamExit();
	
	fclose(yuvframe.leftyuv);
	fclose(yuvframe.rightyuv);
	//释放图像单元
	cvReleaseImage(&yuvframe.yuv);
	cvReleaseImage(&yuvframe.y);
	cvReleaseImage(&yuvframe.u);
	cvReleaseImage(&yuvframe.v);
	cvReleaseImage(&yuvframe.uv420);
	
	return 0; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -