[转]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(); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架