上一篇文章中,在Qt中配置了OpenCV的开发环境,并且添加了所需要的库文件,这篇文章,开始读取摄像头视频,并保存
要注意OpenCV2和OpenCV3的读取保存方法是有区别的,本文是基于OpenCV3的方法进行视频读取与保存
参考:http://blog.csdn.net/sinat_24206709/article/details/53152966
在mainwindow.cpp中添加如下代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
#include
#include
using namespace cv;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
Mat input_image;
VideoCapture cam(0);
if (!cam.isOpened()) exit(0);
namedWindow("摄像头");
while (true)
{
cam >> input_image;
imshow("input image", input_image);
if (27 == waitKey(30))
break;
}
}
MainWindow::~MainWindow()
{
delete ui;
}
运行后即可打开笔记本摄像头,并显示视频数据
如果有别的摄像头,可以插入,然后修改VideoCapture cam(0)中的0为1、2....即可
在UI界面添加打开摄像头、保存视频、关闭摄像头、打开视频的按钮,效果如图所示
为了实现保存视频的功能,添加了定时器,实现隔一段时间来读取一帧,然后保存的效果,代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
#include
#include
#include
using namespace cv;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
timer = new QTimer(this);
cam = NULL;
OPEN = true;
/*信号和槽*/
connect(ui->OpenCameraBtn,SIGNAL(click()),this,SLOT(on_OpenCameraBtn_clicked()));//打开摄像头按钮
connect(ui->TakePicBtn,SIGNAL(click()),this,SLOT(on_TakePicBtn_clicked()));//保存视频按钮
connect(ui->CloseCameraBtn,SIGNAL(click()),this,SLOT(on_CloseCameraBtn_clicked()));//关闭摄像头按钮
connect(ui->OpenVideoBtn,SIGNAL(click()),this,SLOT(on_OpenVideoBtn_clicked()));//打开视频按钮
connect(timer,SIGNAL(timeout()),this,SLOT(getFrame()));
}
/******************************
***********打开摄像头***********
*****************************/
void MainWindow::on_OpenCameraBtn_clicked()
{
// 设置摄像头的拍摄属性为 分辨率640x480,帧率30fps
// cam.set(CAP_PROP_FRAME_HEIGHT, 480);
// cam.set(CAP_PROP_FRAME_WIDTH, 640);
// cam.set(CAP_PROP_FPS, 30.0);
//打开摄像头 从摄像头中获取视频
cam.open(0);
//开启定时器,每隔0.05秒刷新一次
timer->start(50);
}
void MainWindow::getFrame()
{
//读取摄像头信息 将读取回来的帧转换成QImage类型
//从摄像头中抓取并返回每一帧
cam >> frame;
//将抓取到的帧转换成QImage格式
QImage img1 = QImage((const unsigned char*)frame.data, frame.cols, frame.rows, QImage::Format_RGB888).rgbSwapped();//个人测试时可以试试去掉.rgbSwapped()后的效果
//将图片显示到QLabel上
//ui->label->setPixmap(QPixmap::fromImage(img1));
namedWindow("VideoPlay", WINDOW_NORMAL);
imshow("VideoPlay", frame);
waitKey(1000 / 30);
}
/******************************
***********保存视频按钮************
*****************************/
void MainWindow::on_TakePicBtn_clicked()
{
if(!cam.isOpened())
cam.open(0);
//VideoWriter write("D:\\test.avi", VideoWriter::fourcc('M', 'J', 'P', 'G'), 30.0, Size(640, 480), true);
write.open("D:\\test.avi",VideoWriter::fourcc('M', 'J', 'P', 'G'), 30.0, Size(640, 480), true);
while(OPEN)
{
cam >> frame;
//设置保存视频的格式为AVI,编码为MJPG
write.write(frame);
namedWindow("VideoPlay", WINDOW_NORMAL);
imshow("VideoPlay", frame);
waitKey(1000 / 30);
}
}
/******************************
***********关闭摄像头***********
*****************************/
void MainWindow::on_CloseCameraBtn_clicked()
{
timer->stop();
cam.release();
OPEN = false;
write.release();
destroyWindow("VideoPlay");
}
/******************************
***********打开视频***********
*****************************/
void MainWindow::on_OpenVideoBtn_clicked()
{
VideoCapture video;
Mat frame2;
video.open("D:\\test.avi");
while (video.isOpened())
{
video >> frame2;
imshow("video", frame2);
if (cvWaitKey(40) == 27) //cvWaitKey的参数相当于多少ms一帧,现在是40ms一帧,1s25帧
break; //按ESC就退出
}
}
MainWindow::~MainWindow()
{
delete ui;
}
private slots:
void on_OpenCameraBtn_clicked();
void getFrame();
void on_TakePicBtn_clicked();
void on_CloseCameraBtn_clicked();
void on_OpenVideoBtn_clicked();
private:
Ui::MainWindow *ui;
Mat frame;//摄像头每次抓取的图像为一帧,使用该指针指向一帧图像的内存空间
QTimer *timer;//定时器用于定时取帧,上面说的隔一段时间就去取就是用这个实现
VideoCapture cam;
VideoWriter write;
bool OPEN;