Qt开发 — 基于openCV 实现摄像头采集以及拍照功能

基于openCV 实现摄像头采集以及拍照功能

首先安装OpenCV编译库

关于OpenCV的编译安装,参考本人之前博客,这里不做介绍

创建工程界面

打开 Qt Create 创建桌面应用;
在这里插入图片描述

编辑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 

编译cameraget.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; 
} 

把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(); 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值