博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QT与opencv(二)开启摄像头
阅读量:6449 次
发布时间:2019-06-23

本文共 4306 字,大约阅读时间需要 14 分钟。

OpenCV中的VideoCapture不仅可以打开视频、usb摄像头,还可以做很多事,例如读取流媒体文件,网络摄像头,图像序列等。

下面我简单介绍一个在Qt中用VideoCapture类打开笔记本电脑自带摄像头。

(我用的是VS2015+QT5.8+Opencv3.2)

主要用到下面两个函数

//获取默认摄像头videocapture = new VideoCapture(0);//把摄像头获取到的某一帧图像传给 Mat matFramevideocapture->read(matFrame);  

然后 我们用Qt里面的Qtimer类定时获取图像,实现连续的每一帧图像的获取,再把Mat显示在界面里面就好啦。

MainWindow.cpp

#pragma execution_character_set("utf-8")#include "MainWindow.h"//#include 
//QCamera:系统摄像设备(摄像头)//QCameraViewfinder :摄像取景器部件//QCameraImageCapture:截图部件using namespace cv;QtGuiApplication1::QtGuiApplication1(QWidget *parent) : QMainWindow(parent){ ui.setupUi(this); this->setFixedSize(300, 400); //setWindowState(Qt::WindowMaximized);//max timer = new QTimer(this); timer->stop(); connect(timer, SIGNAL(timeout()), this, SLOT(readFarme())); // 时间到,读取当前摄像头信息 ok = true; pushButton = new QPushButton(tr("开始/暂停"),this); pushButton->setGeometry(QRect(0, 0, 300, 100)); pushButton->setFont(QFont("Times", 32, QFont::Bold)); connect(pushButton, SIGNAL(clicked()),this, SLOT(on_pushButton_clicked())); clickLabel = new QLabel(this); clickLabel->setGeometry(0, 100, 300, 300); //打开摄像头,从摄像头中获取视频 videocapture = new VideoCapture(0); //videocapture = new VideoCapture(0); //timer->start(33); }QImage QtGuiApplication1::cvMat2QImage(const Mat& mat) // Mat 改成 QImage{ if (mat.type() == CV_8UC1) // 单通道 { QImage image(mat.cols, mat.rows, QImage::Format_Indexed8); image.setColorCount(256); // 灰度级数256 for (int i = 0; i < 256; i++) { image.setColor(i, qRgb(i, i, i)); } uchar *pSrc = mat.data; // 复制mat数据 for (int row = 0; row < mat.rows; row++) { uchar *pDest = image.scanLine(row); memcpy(pDest, pSrc, mat.cols); pSrc += mat.step; } return image; } else if (mat.type() == CV_8UC3) // 3通道 { const uchar *pSrc = (const uchar*)mat.data; // 复制像素 QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888); // R, G, B 对应 0,1,2 return image.rgbSwapped(); // rgbSwapped是为了显示效果色彩好一些。 } else if (mat.type() == CV_8UC4) { const uchar *pSrc = (const uchar*)mat.data; // 复制像素 // Create QImage with same dimensions as input Mat QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32); // B,G,R,A 对应 0,1,2,3 return image.copy(); } else { return QImage(); }}Mat QtGuiApplication1::QImage2cvMat(QImage image) // QImage改成Mat{ Mat mat; switch (image.format()) { case QImage::Format_ARGB32: case QImage::Format_RGB32: case QImage::Format_ARGB32_Premultiplied: mat = Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine()); break; case QImage::Format_RGB888: mat = Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine()); cv::cvtColor(mat, mat, CV_BGR2RGB); break; case QImage::Format_Indexed8: mat = Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine()); break; } return mat;}事件驱动/////打开摄像头void QtGuiApplication1::on_pushButton_clicked(){ // 开始计时,超时则发出timeout()信号 if(ok)timer->start(33); else timer->stop(); ok = !ok;}//读取Frame图像 when timeout()void QtGuiApplication1::readFarme(){ videocapture->read(matFrame); QImage imgg = cvMat2QImage(matFrame); QPixmap qpixmap = QPixmap::fromImage(imgg); // 将图片显示到label上 clickLabel->setPixmap(qpixmap); }//exitvoid QtGuiApplication1::bnClose(){ timer->stop(); // 停止读取数据。 videocapture->release(); //exit QApplication* app; app->exit(0);}

  MainWindow.h

#pragma once#include 
#include "ui_QtGuiApplication1.h"#include
#include
#include
#include
#include "qimage.h"#include
#include
#include
#include
#include
#include
using namespace cv; //OpenCV命名空间class QtGuiApplication1 : public QMainWindow{ Q_OBJECTpublic: QtGuiApplication1(QWidget *parent = Q_NULLPTR);private: Ui::QtGuiApplication1Class ui; QImage cvMat2QImage(const Mat & mat); Mat QImage2cvMat(QImage image); QTimer *timer; bool ok; VideoCapture *videocapture; Mat matFrame; QLabel *clickLabel; QPushButton *pushButton;private slots: void on_pushButton_clicked(); void readFarme(); void bnClose();};

  

 

posted on
2018-12-15 15:13 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/hyb965149985/p/10123453.html

你可能感兴趣的文章
git代码冲突
查看>>
lnmp1.3 配置pathinfo---thinkphp3.2 亲测有效
查看>>
查看Linux 系统的配置和增减用户/增减组/增减权限
查看>>
利用android studio 生成 JNI需要的动态库so文件
查看>>
poll
查看>>
衡量优秀的卓越的前端工程师
查看>>
解析查询 queryString 请求参数的函数
查看>>
学生选课系统数据存文件
查看>>
flutter进行自动编译操作步骤
查看>>
4.6 直接插入排序法
查看>>
我的毕设总结所用的技术和只是要点 基于stm32F4的AGV嵌入式控制系统的设计
查看>>
盘点国内外那些有野心的BI公司
查看>>
JMeter—断言
查看>>
C++的新类创建:继承与组合
查看>>
m5-第9周作业
查看>>
odoo 权限设置
查看>>
asp操作access提示“无法从指定的数据表中删除”
查看>>
git bash 风格调整
查看>>
997D Cycles in product
查看>>
bzoj4589 Hard Nim
查看>>