QT与opencv(二)开启摄像头

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

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

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

主要用到下面两个函数

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

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

MainWindow.cpp

#pragma execution_character_set("utf-8")
#include "MainWindow.h"//#include <QCameraViewfinder>//QCamera:系统摄像设备(摄像头)
//QCameraViewfinder :摄像取景器部件
//QCameraImageCapture:截图部件
using namespace cv;QtGuiApplication1::QtGuiApplication1(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);this->setFixedSize(300, 400);//setWindowState(Qt::WindowMaximized);//maxtimer = 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);              // 灰度级数256for (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,2return 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,3return 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);}//exit
void QtGuiApplication1::bnClose()
{timer->stop();         // 停止读取数据。videocapture->release();//exitQApplication* app;app->exit(0);
}

  MainWindow.h

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_QtGuiApplication1.h"
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "qimage.h"#include <QFileDialog>
#include <QLabel>
#include <QTimer>
#include <QPushButton>
#include <QCamera>
#include <QCameraImageCapture>
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 hyb965149985 阅读(...) 评论(...) 编辑 收藏

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

QT与opencv(二)开启摄像头相关推荐

  1. QT与openCV,与PCL结合!

    (1):详解QT多媒体框架:给予视频播放器 原文链接:http://mobile.51cto.com/symbian-271123.htm 对于使用主框架的QT程序,实现Qimage的转换可借鉴下面程 ...

  2. 二、各模块的基本实现——1. 在Qt界面上显示树莓派摄像头捕获到的图像

    各模块的基本实现--1. 在Qt界面上显示树莓派摄像头捕获到的图像 本专题导航,Click Me 文章目录 各模块的基本实现--1. 在Qt界面上显示树莓派摄像头捕获到的图像 一些废话 一.思路 二. ...

  3. 大疆妙算Manifold刷机换源,cuda,opencv,qt配置以及实现opencv读取usb摄像头,qmake nvcc交叉编译

    大疆妙算Manifold刷机换源,cuda,opencv,qt配置以及实现opencv读取usb摄像头,qmake nvcc交叉编译 一.刷机 1.解压安装包 2.制作镜像 3.然后按照妙算说明书进入 ...

  4. 【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取

    一.学习目标 了解图片的结构属性 了解如何捕获视频 了解waitkey的使用方法 目录 [python opencv 计算机视觉零基础到实战] 一.opencv的helloworld [[python ...

  5. opencv之调用摄像头动态识别二维码

    结合前几篇做的工作,实现一下动态识别二维码 opencv之调用摄像头动态识别二维码

  6. C++/Qt 使用OpenCV打开摄像头,旋转视频,计算fps

    C++/Qt 使用OpenCV打开摄像头,旋转视频,计算fps 设置摄像头参数 不要随意修改,同时也不一样会修改成功,需要根据实际摄像头的参数选择设置 /*设置摄像头参数 不要随意修改capture. ...

  7. opencv 开启摄像头图片是花的

    opencv 开启摄像头图片是花的 cap = cv2.VideoCapture(0 + cv2.CAP_DSHOW) 需要加上 + cv2.CAP_DSHOW,拍摄的图片就清晰了

  8. Python先生,你好!(7)——使用OpenCV开启摄像头

    Python先生,你好!(7)--使用OpenCV开启摄像头 (1)前 言 (2)程序实现 (3)总 结 (1)前 言 如何使用Python打开我们PC的摄像头呢,今天我们来试一试! (2)程序实现 ...

  9. opencv里关于开启摄像头的一点心得

    最进用opencv做东西时经常用到摄像头,发现了开启摄像头有好几个函数可以实现,我感觉可能是因为opencv1.0与2.0的函数不一样导致的(晕死,搞这么多函数还不是实现一个功能),接下来总结我用到的 ...

最新文章

  1. 重磅!革命级AI代码补全工具,这款撸码利器让程序员界沸腾了!
  2. margin负值的理解和应用
  3. 线性代数 第四章 向量组的线性相关性
  4. 任务和特权级保护(五)——《x86汇编语言:从实模式到保护模式》读书笔记36
  5. Linux mysql设置密码
  6. c++ file* 句柄泄漏_C++核心准则?讨论:持有没有被句柄管理的资源时切勿抛出异常...
  7. Intent各种flag解析。
  8. 【牛客网】NC31 第一个只出现一次的字符
  9. cat EOF file
  10. 太原理工大学ICPC队介绍(2021版)
  11. 图像椒盐噪声和高斯噪声
  12. 整合TextBox与Label 创建新控件--EFLabelText
  13. 【数据挖掘】缺失数据
  14. 因程序问题引起的服务器CPU负荷一直保持在90%以上
  15. graphql java中文文档_GraphQL学习指南 PDF 下载
  16. SVN客户端安装与常用操作(超详细)
  17. 记录解决Mac系统升级后三指取词、词典失效问题的过程
  18. Loadrunner11安装
  19. 搜索引擎推荐(可以代替谷歌的搜索引擎)
  20. 倍福plc控制器修改地址

热门文章

  1. UCSD本科数学计算机专业前景如何,2020年UCSD计算机工程排名真该小心来考查
  2. 欧几里得与扩展欧几里得总结
  3. 前端错误捕获终级方案
  4. 360回归A股,周鸿祎来给BAT和小米添堵了
  5. Spring @PostConstruce 和 @PreDestroy 实例化\销毁 bean 时
  6. phpMyAdmin ‘tbl_gis_visualization.php’多个跨站脚本漏洞
  7. Nobody can go back and start a new beginning, but anyone can start now and make a new ending.
  8. Android 2.2 带来全新拍照增强特性
  9. Struts2中Action的动态调用方法
  10. phylip软件_进化树专题(五)| 密码子分区软件介绍