opencv 摄像头和视频操作的两种方法

2019-07-12 21:06发布

团队 承接嵌入式linux软硬件开发、机器视觉 图像处理、网络流等项目

微信号:hgz1173136060opencv操作摄像头  播放视频带进度条  保存视频注重原创:http://blog.csdn.net/hgz_gs/article/details/50733143/////////////////////////////////#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;
int function1(void)
{
std::string videoFile="tree.avi";//播放视频名称
VideoCapture cap;//创建视频句柄
cap.open(videoFile);//打开视频
if(!cap.isOpened())//判断是否打开
{
fprintf(stderr,"cap flash ");//出错退出
return -1;
}
Mat frame;//Mat --IplImage--cvMat
while(cap.read(frame))//读一帧图片
{
imshow("function1-tree",frame);//显示imshow包含了创建窗口
char c = cvWaitKey(33);//获取键盘输入,也是控制视频的播放速度
if(c==27) //ESC退出
break;
}
destroyAllWindows();//销毁全部窗口---destroyWindow()销毁特定窗口
return 0;
}


int function2(void)
{
cvNamedWindow("function2-tree");//创建窗口,当cvNamedWindow("function2-tree",0);窗口可以改变大小
CvCapture * capture = cvCreateFileCapture("tree.avi");//打开视频文件
IplImage * frame=NULL;
while(1)
{
frame = cvQueryFrame(capture);//从文件中获取一帧图片
if(!frame)break;
cvShowImage("function2-tree",frame);//显示图片
char c = cvWaitKey(33);
if(c==27) 
break;
}
cvReleaseCapture(&capture);
cvDestroyWindow("function2-tree");
return 0;
}


int g_slider_position = 0;
CvCapture * g_capture =NULL;
void onTrackbarSlide(int pos)//再拖动滚动条的时候,滚动条的位置会被作为int数字传入
{  
cvSetCaptureProperty(
g_capture,
CV_CAP_PROP_POS_FRAMES, 
pos 
);
}


int function3(void)//带进度条
{
cvNamedWindow("function3-tree",CV_WINDOW_AUTOSIZE);//申请可以自动调节大小的窗口Example1
g_capture=cvCreateFileCapture("tree.avi");//读取avi格式的影片
int frames = (int) cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);
if(frames != 0)
{
cvCreateTrackbar(//进度条
"Position",
"function3-tree",
&g_slider_position,
frames,onTrackbarSlide);
}
IplImage * frame=NULL;
while(1)
{
frame = cvQueryFrame(g_capture);//读取下一个影片帧率
if(!frame)
break;
cvShowImage("function3-tree",frame);
char c=cvWaitKey(33); //每读取一个视频片度就停止33毫秒,并且会收集键盘的输入
if(c == 27)
break;//27就是对应键盘上的ESC建,如果没有按键盘的话C为-1
}
cvReleaseCapture(&g_capture);
cvDestroyWindow("function3-tree");
return 0;
}
int function4(void)//VideoCapture 打开摄像头
{
//自动打开摄像头,如果知道pc外接摄像头可以查把-1改为摄像头的设备号
VideoCapture cap(-1); 
//linux 在/dev目录下面可查看通常为0,arm通常为3
    if(!cap.isOpened())  
    {  
        printf("cap.isOpened is error ");
        return -1;  
    } 
//set()可以设置摄像头的一些参数,get()获得摄像头配置
    cap.set(CV_CAP_PROP_FPS, 30);//帧率
    cap.set( CV_CAP_PROP_FRAME_WIDTH, 280);//宽
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 40);//高
Mat frame;  
//用来设置需要保存视频的格式;或者使用fourcc=FOURCC(*'xvid')

//用来设置保存的视频名字已经格式,帧率,分辨率
//CvVideoWriter* out=VideoWriter('output.avi',VideoWriter_fourcc(*'XVID'),20,cvSize(640,480));
while(cap.read(frame))//读一帧图片
{
// out->write(frame);//开始保存
imshow("function1-tree",frame);//显示imshow包含了创建窗口
char c = cvWaitKey(33);//获取键盘输入,也是控制视频的播放速度
if(c==27) //ESC退出
break;
}
destroyAllWindows();//销毁全部窗口---destroyWindow()销毁特定窗口
return 0;
}




int function5(void)//CvCapture
{
CvCapture* capture=cvCaptureFromCAM(-1);  //随机打开摄像头
   // CvCapture*capture=cvCreateFileCaptur("555.mp4"); 打开视频
IplImage * frame=NULL;
int n;
frame = cvQueryFrame(capture);//从文件中获取一帧图片
CvVideoWriter* video=cvCreateVideoWriter("camera.avi", CV_FOURCC('X', 'V', 'I', 'D'), 25,cvSize(frame->width,frame->height));
while(1)
{
frame = cvQueryFrame(capture);//从文件中获取一帧图片
if(!frame)
break;
n=cvWriteFrame(video,frame);
cvShowImage("ddd",frame);//显示图片
char c = cvWaitKey(33);
if(c==27) 
break;
}
cvReleaseCapture(&capture);
cvDestroyWindow("ddd");
return 0;
}


int g_Pos=0;//用来标定滚动条当前的位置
//将打开的视频文件作为一个全局变量使用
CvCapture * g_Capture=NULL;
//当拖动滚动条后,会回调这个函数
//同时会将当前滚动条的位置以32 位形式传递过来
void CallBackTrackBarSlide(int pos)
{
//这里便是重新设置视频文件当前播放的帧
cvSetCaptureProperty(g_Capture,CV_CAP_PROP_POS_FRAMES,pos);
g_Pos=pos;
}
int function6(void)
{
//建立一个名字叫做Demo04 的窗体
cvNamedWindow("Demo04",CV_WINDOW_AUTOSIZE);
//根据参数打开指定的视频文件
g_Capture=cvCreateFileCapture("tree.avi");
//获得总的帧数
int totalFrames=(int)cvGetCaptureProperty(g_Capture,CV_CAP_PROP_FRAME_COUNT);
if(totalFrames!=0)
{
//创建滚动条,在这里指定了滚动条拖动后的回调函数
cvCreateTrackbar("TrackBar","Demo04",
&g_Pos,totalFrames,CallBackTrackBarSlide);
}
IplImage * frame;
//循环的顺序的遍历所有的帧
while(1)
{
//获取当前帧的下一个帧
frame=cvQueryFrame(g_Capture);
if(!frame)
{
break;
}
cvShowImage("Demo04",frame);
char chKeyCode=cvWaitKey(30);
if(chKeyCode==27)
{
break;
}
g_Pos++;
//当播放完2个帧的时候才触发滚动条滚动
if(g_Pos%1==0)
{
cvSetTrackbarPos("TrackBar","Demo04", g_Pos);
}
}
cvReleaseCapture(&g_Capture);
cvDestroyWindow("Demo03");
return 0;
}
int main(int argc,const char**argv)
{
//function1();//打开视频1
//function2();//打开视频2
//function3();//带快进快退视频3
//function4();//打开摄像头1
function5();//打开摄像头2
//function6();//带进度条的视频4
return 0;
}

在windows测试时需要把avi视频需与exe文件同文件夹在linux在生成的可执行文件里



vs  源码包下载 http://download.csdn.net/detail/hgz_gs/9443858