Qt下使用OpenCV3打开摄像头并把图像显示到QLabel上
前言
1.Qt5有自己摄像头的类QCamera,但是图像处理相关还是要使用OpenCV来做,这里我演示在Qt下使用OpenCV打开摄像头。
2.Qt的版本是5.9,Qt Creator 4.4.1,OpenCV是3.42这个版本,Qt是跨平台的IDE,所以代码换个平台,改动不大。
一、代码
1.打开Qt,新建一个项目窗口项目。
2.在pro文件导入OpenCV的头文件和lib文件。
3.显示界面
(1)打开mainwindow.ui
(2)拖入一个label控件到当前主窗口,点铺满整个窗口,然后更改对象名cameraView,保存。
(3)添加打开摄像头和关闭摄像头的按键,更改类名为Open和Stop
(4)右键Open转到槽,然后现对Stop做相同的动作。
这时代码中多了两个槽函数,声明部分:
实现部分
3.代码实现
(1)mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <QTimer>using namespace cv;
using namespace std;namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);//Mat转QLabelQImage MatImageToQt(const Mat &src);~MainWindow();private slots:void readFarme();void on_Open_triggered();void on_Stop_triggered();private:Ui::MainWindow *ui;VideoCapture cap;Mat src_image;QTimer *timer;QImage *image;
};#endif // MAINWINDOW_H
(2)mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);timer = new QTimer(this);image = new QImage();connect(timer,SIGNAL(timeout()),this,SLOT(readFarme()));connect(ui->Open,SIGNAL(clicked()),this,SLOT(on_Open_triggered()));connect(ui->Stop,SIGNAL(clicked()),this,SLOT(on_Stop_triggered()));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_Open_triggered()
{cap.open(0);timer->start(33);
}void MainWindow::on_Stop_triggered()
{// 停止读取数据。timer->stop();cap.release();ui->cameraView->clear();
}void MainWindow::readFarme()
{cap.read(src_image);QImage imag = MatImageToQt(src_image);ui->cameraView->setPixmap(QPixmap::fromImage(imag));
}//Mat转成QImage
QImage MainWindow::MatImageToQt(const Mat &src)
{//CV_8UC1 8位无符号的单通道---灰度图片if(src.type() == CV_8UC1){//使用给定的大小和格式构造图像//QImage(int width, int height, Format format)QImage qImage(src.cols,src.rows,QImage::Format_Indexed8);//扩展颜色表的颜色数目qImage.setColorCount(256);//在给定的索引设置颜色for(int i = 0; i < 256; i ++){//得到一个黑白图qImage.setColor(i,qRgb(i,i,i));}//复制输入图像,data数据段的首地址uchar *pSrc = src.data;//for(int row = 0; row < src.rows; row ++){//遍历像素指针uchar *pDest = qImage.scanLine(row);//从源src所指的内存地址的起始位置开始拷贝n个//字节到目标dest所指的内存地址的起始位置中memcmp(pDest,pSrc,src.cols);//图像层像素地址pSrc += src.step;}return qImage;}//为3通道的彩色图片else if(src.type() == CV_8UC3){//得到图像的的首地址const uchar *pSrc = (const uchar*)src.data;//以src构造图片QImage qImage(pSrc,src.cols,src.rows,src.step,QImage::Format_RGB888);//在不改变实际图像数据的条件下,交换红蓝通道return qImage.rgbSwapped();}//四通道图片,带Alpha通道的RGB彩色图像else if(src.type() == CV_8UC4){const uchar *pSrc = (const uchar*)src.data;QImage qImage(pSrc, src.cols, src.rows, src.step, QImage::Format_ARGB32);//返回图像的子区域作为一个新图像return qImage.copy();}else{return QImage();}
}
二、测试结果
1.运行,打开摄像头
2.关闭摄像头
总结
1.这个只是一个简单的显示摄像头小demo,这个demo是有局限性的,如果要应用到项目上去的话,最好的办法还是开多一个打开摄像头的线程。
2.OpenCV要编成Qt能用的lib,有些烦琐和耗时,如果不想自己编译的,可以下载我编译好的库:https://download.csdn.net/download/matt45m/11084467
3.关于Qt下使用OpenCV库的,如果有兴趣的可以加群:487350510互相讨论学习。
Qt下使用OpenCV3打开摄像头并把图像显示到QLabel上相关推荐
- 关于QT下配置OpenCV3.4.0后出现 error: undefined reference to ‘cv::xxx‘的问题及解决方案,直接使用编译好的opencv库
按照网上的办法,在QT中pro文件末尾添加以下代码来引入OpenCV的库和头文件: INCLUDEPATH += D:\OpenCV3.4\opencv\build_mingw\install\x64 ...
- QT下使用QAxObject打开word文档,文档路径含有空格open出错的解决方法
将要打开的文档转换为本地路径即可,缺省状态下QT路径的分割符为"/",而windows下路径的分隔符为"\",大多数场景下使用QT默认的就行,但是在操作QAxO ...
- win7计算机摄像头怎么打开,Win7笔记本摄像头怎么打开?Win7笔记本打开摄像头的方法...
最近有刚从WinXP升级到Win7的笔记本用户反映,"计算机"里没有摄像头快捷方式,因此不知道要怎么打开摄像头,虽然摄像头在系统软件需要的时候还是会自动调用,可就是不能手动开启摄像 ...
- Ubuntu系统下安装opencv3.x并打开图片和视频文件以及打开摄像头录制视频
目录 一.安装opencv 1.前置安装条件 2.安装环境 3.下载opencv3.4.11 4.解压安装包 5.开始安装 6.检查是否安装成功 二.显示图片和播放视频 1.显示图片 2.播放视频 三 ...
- buildroot+qt+qcamrea+opencv打开摄像头进行拍照录像保存功能
相关参考 如何用FFmpeg API采集摄像头视频和麦克风音频,并实现录制文件的功能_爱写代码的自由人-CSDN博客_ffmpeg 摄像头 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术. ...
- qt ffmpeg camera 打开摄像头
最近项目需求,研究了下ffmpeg操作摄像头,主要是参考了雷神的博客,博主用的ffmpeg版本有点低,但是还是很有参考价值,对于初学者来说是一个很不错的选择. 准备工作,ffmpeg官网下载SDK,我 ...
- qml+opencv3.1简单打开摄像头,关闭摄像头
借鉴前人经验 http://blog.csdn.net/luoyayun361/article/details/61936032 利用 继承QQuickImageProvider类的方法来完成open ...
- 打开摄像头java程序_在Windows下使用java语言打开摄像头【JMF版】
由于需要做一个自动拍照系统,所以在网上学习了使用java打开摄像头,很多人推荐javaCV,但是我不小心使用了JFM,所以先这样吧~~ 在oracle网站下载window平台的JMF,如下图 从图中I ...
- Linux命令模式下打开摄像头,Linux下利用Opencv打开笔记本摄像头问题
新建test文件夹,文件夹存在test.cpp和CMakeLists.txttest.cpp#include #include #include #include #include #include ...
最新文章
- 为什么indexOf在数组IE8上不起作用?
- hibernate annotations和hbm.xml配置文件在spring中的并存配置
- 深入理解分布式技术 - 服务注册与发现背后的逻辑
- android提交服务器,Android向WEB服务器提交数据
- VTK:图表之GraphToPolyData
- python 中的爬虫· scrapy框架 重要的组件的介绍
- CRM产品主数据介绍
- linux 特殊shell变量
- TensorFlow神经网络(四)手写数字识别
- spark提交到yarn_如何理解Spark应用的执行过程
- MOSS 2010:Visual Studio 2010开发体验(32)——工作流开发最佳实践(四):可重用工作流...
- Linux下mySQL数据库斥地手艺-1
- 26_多易教育之《yiee数据运营系统》数据治理-atlas介绍篇
- 数学作图工具_推荐工作学习中用到的三款在线作图神器!
- php养老院管理系统论文,养老院一卡通管理
- 2014年软件评测师真题精选
- Java SE 八大基本类型
- 音视频编解码基础知识
- 微信小程序自动回复用户消息
- TOTP 介绍及基于C#的简单实现
热门文章
- 学计算机科学与技术的专业特长,计算机科学与技术专业简历范文介绍
- MSB6006: “cmd.exe”已退出,代码为 3.
- faster rcnn源码理解(二)之AnchorTargetLayer(网络中的rpn_data)
- 我的2013-从GIS学生到GIS职业人的飞跃
- 从古希腊神话说起,讲讲英语里的偏旁部首
- 计算机视觉研究群体及专家主页汇总
- 使用脚本编写 Vim 编辑器,第 4 部分: 字典
- 信息系统项目管理师一些重要问题和知识点
- P2221 [HAOI2012]高速公路
- 磁金融宣布完成1.2亿元B轮融资,宽带资本领投