使用QT+OpenCV打开摄像头
Posted 西伯利亚鹰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用QT+OpenCV打开摄像头相关的知识,希望对你有一定的参考价值。
下载地址:https://download.csdn.net/download/sinat_35845281/11264826
注:包里面提供了本博客的全部资料
第一步:安装好opencv的库
1.双击opencv-2.1-2008.exe安装到你想要的地址
第二步:创建好一个QT Widget 项目
2.在项目的.pro文件中配置好的你opencv库
例如:
第三步:按照项目编辑你的代码
1.头文件设置 Widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QImage>
#include <QTimer> // 设置采集数据的间隔时间
#include <highgui.h> //包含opencv库头文件
#include <cv.h>
namespace Ui
class Widget;
class Widget : public QWidget
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void openCamara(); // 打开摄像头
void readFarme(); // 读取当前帧信息
void closeCamara(); // 关闭摄像头。
void takingPictures(); // 拍照
private:
Ui::Widget *ui;
QTimer *timer;
QImage *imag;
CvCapture *cam;// 视频获取结构, 用来作为视频获取函数的一个参数
IplImage *frame;//申请IplImage类型指针,就是申请内存空间来存放每一帧图像
;
#endif // WIDGET_H
2. 实现.h中的方法在 Widget.cpp中
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#define cout qDebug() << "[ "<<__FILE__<<" : "<<__LINE__<<" ]"
#define camerawidth 1280
#define cameraheight 720
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
ui->setupUi(this);
cam = NULL;
timer = new QTimer(this);
imag = new QImage(); // 初始化
/*信号和槽*/
connect(timer,&QTimer::timeout,this,&Widget::readFarme);// 时间到,读取当前摄像头信息
connect(ui->pushButton_open,&QPushButton::clicked,this,&Widget::openCamara); //打开摄像头
connect(ui->pushButton_photo,&QPushButton::clicked,this,&Widget::takingPictures);//照相
connect(ui->pushButton_close,&QPushButton::clicked,this,&Widget::closeCamara); //关闭摄像头
Widget::~Widget()
closeCamara();
delete ui;
/******************************
********* 打开摄像头 ***********
*******************************/
void Widget::openCamara()
cam = cvCreateCameraCapture(0);//打开摄像头,从摄像头中获取视频
timer->start(33); // 开始计时,超时则发出timeout()信号
cout << "打开摄像头";
/*********************************
********* 读取摄像头信息 ***********
**********************************/
void Widget::readFarme()
frame = cvQueryFrame(cam); // 从摄像头中抓取并返回每一帧
// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
QImage image = QImage((const uchar *)frame->imageData,
camerawidth,
cameraheight,
QImage::Format_RGB888).rgbSwapped();
//因为 frame 取出来的是镜像图片,水平方向上是左右颠倒的,
//所以使用 mirrored 将 水平方向的图片 再次镜像回来,显示就正确了
ui->label_camera->setPixmap(QPixmap::fromImage(image.mirrored(true,false)));
cout << "读取摄像头信息";
/*************************
********* 拍照 ***********
**************************/
void Widget::takingPictures()
frame = cvQueryFrame(cam); // 从摄像头中抓取并返回每一帧
// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
QImage image = QImage((const uchar *)frame->imageData,
camerawidth,
cameraheight,
QImage::Format_RGB888).rgbSwapped();
ui->label_image->setPixmap(QPixmap::fromImage(image.mirrored(true,false)));
cout << "拍照";
/*******************************
***关闭摄像头,释放资源,必须释放***
********************************/
void Widget::closeCamara()
timer->stop(); // 停止读取数据。
cvReleaseCapture(&cam);//释放内存;
cout << "关闭摄像头,释放资源,必须释放";
最后就是编译运行了。谢谢大家,有问题可以在下方提问,看到了就会及时的回复。
以上是关于使用QT+OpenCV打开摄像头的主要内容,如果未能解决你的问题,请参考以下文章