前言

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上相关推荐

  1. 关于QT下配置OpenCV3.4.0后出现 error: undefined reference to ‘cv::xxx‘的问题及解决方案,直接使用编译好的opencv库

    按照网上的办法,在QT中pro文件末尾添加以下代码来引入OpenCV的库和头文件: INCLUDEPATH += D:\OpenCV3.4\opencv\build_mingw\install\x64 ...

  2. QT下使用QAxObject打开word文档,文档路径含有空格open出错的解决方法

    将要打开的文档转换为本地路径即可,缺省状态下QT路径的分割符为"/",而windows下路径的分隔符为"\",大多数场景下使用QT默认的就行,但是在操作QAxO ...

  3. win7计算机摄像头怎么打开,Win7笔记本摄像头怎么打开?Win7笔记本打开摄像头的方法...

    最近有刚从WinXP升级到Win7的笔记本用户反映,"计算机"里没有摄像头快捷方式,因此不知道要怎么打开摄像头,虽然摄像头在系统软件需要的时候还是会自动调用,可就是不能手动开启摄像 ...

  4. Ubuntu系统下安装opencv3.x并打开图片和视频文件以及打开摄像头录制视频

    目录 一.安装opencv 1.前置安装条件 2.安装环境 3.下载opencv3.4.11 4.解压安装包 5.开始安装 6.检查是否安装成功 二.显示图片和播放视频 1.显示图片 2.播放视频 三 ...

  5. buildroot+qt+qcamrea+opencv打开摄像头进行拍照录像保存功能

    相关参考 如何用FFmpeg API采集摄像头视频和麦克风音频,并实现录制文件的功能_爱写代码的自由人-CSDN博客_ffmpeg 摄像头 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术. ...

  6. qt ffmpeg camera 打开摄像头

    最近项目需求,研究了下ffmpeg操作摄像头,主要是参考了雷神的博客,博主用的ffmpeg版本有点低,但是还是很有参考价值,对于初学者来说是一个很不错的选择. 准备工作,ffmpeg官网下载SDK,我 ...

  7. qml+opencv3.1简单打开摄像头,关闭摄像头

    借鉴前人经验 http://blog.csdn.net/luoyayun361/article/details/61936032 利用 继承QQuickImageProvider类的方法来完成open ...

  8. 打开摄像头java程序_在Windows下使用java语言打开摄像头【JMF版】

    由于需要做一个自动拍照系统,所以在网上学习了使用java打开摄像头,很多人推荐javaCV,但是我不小心使用了JFM,所以先这样吧~~ 在oracle网站下载window平台的JMF,如下图 从图中I ...

  9. Linux命令模式下打开摄像头,Linux下利用Opencv打开笔记本摄像头问题

    新建test文件夹,文件夹存在test.cpp和CMakeLists.txttest.cpp#include #include #include #include #include #include ...

最新文章

  1. 为什么indexOf在数组IE8上不起作用?
  2. hibernate annotations和hbm.xml配置文件在spring中的并存配置
  3. 深入理解分布式技术 - 服务注册与发现背后的逻辑
  4. android提交服务器,Android向WEB服务器提交数据
  5. VTK:图表之GraphToPolyData
  6. python 中的爬虫· scrapy框架 重要的组件的介绍
  7. CRM产品主数据介绍
  8. linux 特殊shell变量
  9. TensorFlow神经网络(四)手写数字识别
  10. spark提交到yarn_如何理解Spark应用的执行过程
  11. MOSS 2010:Visual Studio 2010开发体验(32)——工作流开发最佳实践(四):可重用工作流...
  12. Linux下mySQL数据库斥地手艺-1
  13. 26_多易教育之《yiee数据运营系统》数据治理-atlas介绍篇
  14. 数学作图工具_推荐工作学习中用到的三款在线作图神器!
  15. php养老院管理系统论文,养老院一卡通管理
  16. 2014年软件评测师真题精选
  17. Java SE 八大基本类型
  18. 音视频编解码基础知识
  19. 微信小程序自动回复用户消息
  20. TOTP 介绍及基于C#的简单实现

热门文章

  1. 学计算机科学与技术的专业特长,计算机科学与技术专业简历范文介绍
  2. MSB6006: “cmd.exe”已退出,代码为 3.
  3. faster rcnn源码理解(二)之AnchorTargetLayer(网络中的rpn_data)
  4. 我的2013-从GIS学生到GIS职业人的飞跃
  5. 从古希腊神话说起,讲讲英语里的偏旁部首
  6. 计算机视觉研究群体及专家主页汇总
  7. 使用脚本编写 Vim 编辑器,第 4 部分: 字典
  8. 信息系统项目管理师一些重要问题和知识点
  9. P2221 [HAOI2012]高速公路
  10. 磁金融宣布完成1.2亿元B轮融资,宽带资本领投