这里只显示了两个,其实还可以将这个显示多视频函数封装成一个子函数。
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <iostream>
using namespace std;
using namespace cv;
int main( int argc, char** argv ) {
//int i=0;
cvNamedWindow( "Example2_9", CV_WINDOW_AUTOSIZE );
CvCapture* capture2,* capture1;
capture1 = cvCreateCameraCapture(2);
capture2 = cvCreateCameraCapture(1);
int w = 320, h = 240;
cvSetCaptureProperty ( capture1, CV_CAP_PROP_FRAME_WIDTH, w );
cvSetCaptureProperty ( capture1, CV_CAP_PROP_FRAME_HEIGHT, h );
cvSetCaptureProperty ( capture2, CV_CAP_PROP_FRAME_WIDTH, w );
cvSetCaptureProperty ( capture2, CV_CAP_PROP_FRAME_HEIGHT, h );
IplImage* frame2,*frame1;
frame1 = cvQueryFrame( capture1 );
frame2 = cvQueryFrame( capture2 );
/*******************为了在一个窗口显示两幅图************************/
IplImage* frame_all = cvCreateImage(
cvSize(w *3,h*2), //设置窗口的大小便于显示多个视频,这里可显示2行3列6个视频,需要将下面的+20去掉才能显示6个
IPL_DEPTH_8U,
frame1->nChannels);
cvZero(frame_all);
CvRect rect1=cvRect(0,0,frame1->width,frame1->height);
CvRect rect2=cvRect(frame1->width+20,0,frame1->width,frame1->height);//修改cvrect中的x,y值可以更改图像的左上角位置。这里+20是为了演示将两个视频间隔
while(1) { //如果要间隔需要将上面窗口的大小设置的>=视频大小+间隔大小
frame2 = cvQueryFrame( capture2 );
frame1 = cvQueryFrame( capture1 );
if( !frame2||!frame1 ) break; //如果程序不能读取摄像头,那么将此句删除或加个判断即采用注释掉的i语句又或者在while前读一次
cvSetImageROI( frame_all, rect1);//设置ROI
cvCopy(frame1,frame_all);//把frame1图copy进ROI
cvSetImageROI( frame_all, rect2 );//设置ROI
cvCopy(frame2,frame_all);//把frame2图copy进ROI
cvResetImageROI( frame_all);//释放ROI
cvShowImage( "Example2_9", frame_all );
char c = cvWaitKey(10);
if( c == 27 ) break;
}
cvReleaseCapture( &capture2);
cvReleaseCapture( &capture1 );
cvDestroyWindow( "Example2_9" );
return 0;
}