今天写的QT+openCV实现摄像头拍照功能。
在网上收罗了很多资料,QT没有专门操作摄像头的类,这个得自己写。网上也有很多关务openCV和V4l的一些介绍,由于我项目要在window下开发,所以就选择了openCV。http:///projects/opencvlibrary/files/opencv-win/2.1/ 刚开始下载的是2.3.1的,安装后发现没有lib库所以后面选择了2.1的。
现在,开始详细的介绍如何在QT中实时的采集摄像头数据。
打开QTcreator (我用的是QT 2.3的 中文版)
新建一个widget工程
在界面上放两个label 分别用来显示摄像头采集到的数据和照的照片。
编辑camaraget.h 文件
-
#ifndef CAMARAGET_H
-
#define CAMARAGET_H
-
-
#include <QWidget>
-
#include <QImage>
-
#include <QTimer> // 设置采集数据的间隔时间
-
-
#include <highgui.h> //包含opencv库头文件
-
#include <cv.h>
-
-
namespace Ui {
-
class camaraGet;
-
}
-
-
class camaraGet : public QWidget
-
{
-
Q_OBJECT
-
-
public:
-
explicit camaraGet(QWidget *parent = 0);
-
~camaraGet();
-
-
private slots:
-
void openCamara(); // 打开摄像头
-
void readFarme(); // 读取当前帧信息
-
void closeCamara(); // 关闭摄像头。
-
void takingPictures(); // 拍照
-
-
private:
-
Ui::camaraGet *ui;
-
QTimer *timer;
-
QImage *imag;
-
CvCapture *cam;// 视频获取结构, 用来作为视频获取函数的一个参数
-
IplImage *frame;//申请IplImage类型指针,就是申请内存空间来存放每一帧图像
-
};
-
-
#endif // CAMARAGET_H
编辑camaraget.cpp
-
#include "camaraget.h"
-
#include "ui_camaraget.h"
-
-
camaraGet::camaraGet(QWidget *parent) :
-
QWidget(parent),
-
ui(new Ui::camaraGet)
-
{
-
ui->setupUi(this);
-
-
cam = NULL;
-
timer = new QTimer(this);
-
imag = new QImage(); // 初始化
-
-
/*信号和槽*/
-
connect(timer, SIGNAL(timeout()), this, SLOT(readFarme())); // 时间到,读取当前摄像头信息
-
connect(ui->open, SIGNAL(clicked()), this, SLOT(openCamara()));
-
connect(ui->pic, SIGNAL(clicked()), this, SLOT(takingPictures()));
-
connect(ui->closeCam, SIGNAL(clicked()), this, SLOT(closeCamara()));
-
}
-
-
/******************************
-
********* 打开摄像头 ***********
-
*******************************/
-
void camaraGet::openCamara()
-
{
-
cam = cvCreateCameraCapture(0);//打开摄像头,从摄像头中获取视频
-
-
timer->start(33); // 开始计时,超时则发出timeout()信号
-
}
-
-
/*********************************
-
********* 读取摄像头信息 ***********
-
**********************************/
-
void camaraGet::readFarme()
-
{
-
frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧
-
// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
-
QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);
-
ui->label->setPixmap(QPixmap::fromImage(image)); // 将图片显示到label上
-
}
-
-
/*************************
-
********* 拍照 ***********
-
**************************/
-
void camaraGet::takingPictures()
-
{
-
frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧
-
-
// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
-
QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);
-
-
ui->label_2->setPixmap(QPixmap::fromImage(image)); // 将图片显示到label上
-
}
-
-
/*******************************
-
***关闭摄像头,释放资源,必须释放***
-
********************************/
-
void camaraGet::closeCamara()
-
{
-
timer->stop(); // 停止读取数据。
-
-
cvReleaseCapture(&cam);//释放内存;
-
}
-
-
camaraGet::~camaraGet()
-
{
-
delete ui;
-
}
好了,全部代码都OK了(当然,创建工程时,会生成main.cpp,不必去改动它),但现在你点运行,依然会产生错误,为什么呢?因为还没有把openCV的库包含进去。
在*.pro 文件中 加入:
INCLUDEPATH+=C:\OpenCV2.1\include\opencv
LIBS += C:\OpenCV2.1\lib\highgui210.lib \
C:\OpenCV2.1\lib\cxcore210.lib \
C:\OpenCV2.1\lib\cv210.lib
OK,大功告成,运行后,在widget中点击打开摄像头,就可以看到自己了。运行后的效果:
后来我发现这个效果不怎么好,就改了一下:改了以后的运行效果也贴出来:
就改了一句:
-
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();
|