文章采集调用(QT+openCV操做的这部分,其余还没时间看 )
优采云 发布时间: 2021-09-04 19:14文章采集调用(QT+openCV操做的这部分,其余还没时间看
)
今天写的QT+openCV实现了拍照的拍照功能。应用
网上搜集了很多资料。 QT没有专门的camera类,所以这个就得自己写了。网上也有很多关于海关openCV和V4l的介绍,因为我的项目是在window下开发的,所以选择了openCV。因为之前没用过openCV,所以只看了openCVS*敏*感*词*的操作部分,其他的没时间看。功能
openCV:学习
第一次下载是2.3.1。安装后发现没有lib库,所以选择2.1的ui
openCV中文学习pdf:这个
现在,我开始详细介绍如何在QT中实时采集camera数据。温泉
打开QTcreator(我用的是QT中文版2.3).net
创建一个新的小部件项目指针
在界面上贴两个标签,显示采集相机拍摄的数据和照片。代码
编辑camaraget.h文件orm
#ifndef CAMARAGET_H
#define CAMARAGET_H
#include
#include
#include // 设置采集数据的间隔时间
#include //包含opencv库头文件
#include
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
好的,你完成了。运行后,在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();