下面是完整代码
#include "widget.h"
#include "ui_widget.h"
#include "qdebug.h"
#include "stdio.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
cam = NULL;
timer = new QTimer(this);
imag = new QImage(); // 初始化
/*信号和槽*/
connect(timer, SIGNAL(timeout()), this, SLOT(readFarme())); // 时间到,读取当前摄像头信息
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(openCamara()));//打开摄像头
connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(takingPictures()));//抓取 画面帧
connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(closeCamara()));//关闭摄像头
connect(ui->pushButton_4,SIGNAL(clicked()),this,SLOT(Video()));//进行录像存储
connect(ui->pushButton_5,SIGNAL(clicked()),this,SLOT(videoDoms()));//录像播放
connect(ui->pushButton_6,SIGNAL(clicked()),this,SLOT(stopVideo()));
}
void Widget::openCamara()
{
cam = cvCreateCameraCapture(0);//打开摄像头,从摄像头中获取视频
timer->start(33); // 开始计时,超时则发出timeout()信号
}
void Widget::readFarme()
{
frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧
// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
// QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);
QImage image = QImage((const uchar*)frame->imageData, frame->width, frame->height,
QImage::Format_RGB888).rgbSwapped();
ui->label->setPixmap(QPixmap::fromImage(image)); // 将图片显示到label上
}
void Widget::takingPictures()
{
frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧
// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
// QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);
QImage image = QImage((const uchar*)frame->imageData, frame->width, frame->height,
QImage::Format_RGB888).rgbSwapped();
ui->label_2->setPixmap(QPixmap::fromImage(image)); // 将图片显示到label上
}
void Widget::closeCamara()
{
timer->stop(); // 停止读取数据。
cvReleaseCapture(&cam);//释放内存;
ui->label->setAlignment(Qt::AlignCenter);
ui->label->setText(tr("摄像头已关闭!"));
}
void Widget::Video()
{
// CvCapture* capture = cvCaptureFromCAM(-1);
CvVideoWriter* video = NULL;
frame = NULL;
int n;
if(!cam) //如果不能打开摄像头给出警告
{
qDebug()<<"Can not open the camera.";
}
else
{
frame = cvQueryFrame(cam); //首先取得摄像头中的一帧
video = cvCreateVideoWriter("k:\\camera.avi", CV_FOURCC('X', 'V', 'I', 'D'),
8,cvSize(frame->width,frame->height)); //创建CvVideoWriter对象并分配空间
//保存的文件名为camera.avi,编码要在运行程序时选择,大小就是摄像头视频的大小,帧频率是32
if (video) //如果能创建CvVideoWriter对象则表明成功
{
qDebug()<<"VideoWriter has created.";
}
cvNamedWindow("Camera Video",1); //新建一个窗口
// int i = 0;
// int x = 200;// 让它循环200次自动停止录取
while(1)
{
frame = cvQueryFrame(cam); //从CvCapture中获得一帧
if(!frame)
{
qDebug()<<"Can not get frame from the capture.";
break;
}
n = cvWriteFrame(video,frame); //判断是否写入成功,如果返回的是1,表示写入成功
cvShowImage("Camera Video",frame); //显示视频内容的图片
// i++;
if (cvWaitKey(2)>0)
break; //有其他键盘响应,则退出
//if (i > x) break;
}
cvReleaseVideoWriter(&video);
cvDestroyWindow("Camera Video");
}
}
void Widget::videoDoms()
{
capture = 0;
capture = cvCaptureFromFile("k:\\camera.avi");
cvNamedWindow("src", 0);
IplImage *frame2 = 0;
int key;
for(;;){
frame2 = cvQueryFrame(capture);
if(!frame) break;
cvShowImage ("src",frame2);
key = cvWaitKey(10);
if((char)key == 'e') break;
}
cvDestroyAllWindows();
cvReleaseCapture(&capture);
}
void Widget::stopVideo()
{
// cvDestroyAllWindows();
// cvDestroyWindow("src");
// cvReleaseCapture(&capture);
}
Widget::~Widget()
{
delete ui;
timer->stop(); // 停止读取数据。
cvReleaseCapture(&cam);//释放内存;
}