[转]QT +openCV 实现摄像头采集以及拍照功能

        今天写的QT+openCV实现摄像头拍照功能。

 

在网上收罗了很多资料,QT没有专门操作摄像头的类,这个得自己写。网上也有很多关务openCV和V4l的一些介绍,由于我项目要在window下开发,所以就选择了openCV。由于以前没有用过openCV,所以就只看了关于openCVS摄像头操作的这部分,其他的还没时间去看。

openCV : http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.1/  

刚开始下载的是2.3.1的,安装后发现没有lib库所以后面选择了2.1的

openCV中文学习 pdf  :

 

现在,开始详细的介绍如何在QT中实时的采集摄像头数据。

打开QTcreator (我用的是QT 2.3的 中文版)

新建一个widget工程

 

在界面上放两个label 分别用来显示摄像头采集到的数据和照的照片。

 

 

编辑camaraget.h 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#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中点击打开摄像头,就可以看到自己了。运行后的效果:

 

 

 

后来我发现这个效果不怎么好,就改了一下:改了以后的运行效果也贴出来:

 

就改了一句:

1
QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888); 

  

1
改为了 QImage image = QImage((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped(); 

  

 

posted @   ZYVV  阅读(17148)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示