文章采集调用(QT+openCV操做的这部分,其余还没时间看 )
优采云 发布时间: 2022-01-24 11:16文章采集调用(QT+openCV操做的这部分,其余还没时间看
)
今天写的QT+openCV实现了拍照拍照功能。应用
我在互联网上采集了很多信息。 QT 没有用于操作相机的特殊类。这个必须自己写。网上也有很多关于openCV和V4l的介绍。因为我的项目要在window下开发,所以选择了openCV。因为之前没用过openCV,所以只看了openCVS*敏*感*词*的操作这部分,剩下的没来得及看。功能
openCV:学习
第一次下载来自 2.3.1。安装后发现没有lib库,所以选择了2.1
的ui
openCV中文学习pdf:这个
现在,我们开始详细介绍如何在QT中直播采集相机数据。温泉
打开QTcreator(我用的是QT中文版2.3).net
创建一个新的小部件项目指针
在界面上放两个标签,显示相机拍摄的数据和照片采集。或者
编辑camaraget.h文件视频
#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
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();