📄 multicapture.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 + -