博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
视觉里程计06 Qt界面显示摄像头
阅读量:4544 次
发布时间:2019-06-08

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

界面主体

783913-20171022233334568-314770852.png

显示图像通过定时器定时调用信号槽里的更新函数实现

编写信号槽函数前需要先编译,这样才能更新界面的.h文件

具体实现

qtcameratest01.h修改如下:

#pragma once#include 
#include "ui_qtcameratest01.h"#include
#include
#include
// for camerausing namespace cv;class qtcameratest01 : public QMainWindow{ Q_OBJECTpublic: qtcameratest01(QWidget *parent = Q_NULLPTR);private: Ui::qtcameratest01Class ui; QTimer *timer; Mat frame; QImage image; VideoCapture cap1; private slots: void opencam(); void nextFrame(); void closeCamara(); void camshot();};static QImage Mat2QImage(Mat& image);

qtcameratest01.cpp文件修改如下:

#include "qtcameratest01.h"#include 
#include
#include
#include
#include
// for camera#include
using namespace cv;qtcameratest01::qtcameratest01(QWidget *parent) : QMainWindow(parent){ // 初始化 timer = new QTimer(this); timer->stop(); ui.setupUi(this); connect(ui.OpenCamBtn, SIGNAL(clicked()), this, SLOT(opencam())); connect(timer, SIGNAL(timeout()), this, SLOT(nextFrame())); connect(ui.CloseCamBtn, SIGNAL(clicked()), this, SLOT(closeCamara())); connect(ui.CamshotBtn, SIGNAL(clicked()), this, SLOT(camshot()));}void qtcameratest01::opencam(){ if (cap1.isOpened()) cap1.release(); double rate = cap1.get(CV_CAP_PROP_FPS); try { cap1.open(0); cap1 >> frame; if (!frame.empty()) { timer->setInterval(rate); timer->start(); } } catch (const std::exception&) { QMessageBox::critical(NULL, "ERROR", "打开失败",QMessageBox::Close); }}static QImage Mat2QImage(Mat& image){ QImage img; if (image.channels() == 3) { cvtColor(image, image, CV_BGR2RGB); img = QImage((const unsigned char *)(image.data), image.cols, image.rows, image.cols*image.channels(), QImage::Format_RGB888); } else if (image.channels() == 1) { img = QImage((const unsigned char *)(image.data), image.cols, image.rows, image.cols*image.channels(), QImage::Format_ARGB32); } else { img = QImage((const unsigned char *)(image.data), image.cols, image.rows, image.cols*image.channels(), QImage::Format_RGB888); } return img;}void qtcameratest01::nextFrame(){ cap1 >> frame; if (!frame.empty()) { image = Mat2QImage(frame); QImage* imgScaled = new QImage; QImage* imgc = ℑ *imgScaled = imgc->scaled(ui.campicreal->width(), ui.campicreal->height(), Qt::KeepAspectRatio); ui.campicreal->setPixmap(QPixmap::fromImage(*imgScaled)); }}void qtcameratest01::closeCamara(){ timer->stop();//停止读取数据。 cap1.release();//释放内存; }void qtcameratest01::camshot(){ QImage* imgScaled = new QImage; QImage* imgc = ℑ *imgScaled = imgc->scaled(ui.campicreal->width(), ui.campicreal->height(), Qt::KeepAspectRatio); ui.campicshot->setPixmap(QPixmap::fromImage(*imgScaled));}

注意事项

  • 界面中用到的资源需要在ui setup时同时初始化,否则会出现内存错误
  • 界面更新方式通过定时器访问,摄像头资源需要释放
  • debug的话需要CDB,否则无法调试

转载于:https://www.cnblogs.com/RegressionWorldLine/p/7712709.html

你可能感兴趣的文章
wire [7:0] regAddr; 理解
查看>>
云存储的那些事(1)——数据冗余
查看>>
android状态机机制StateMachine
查看>>
滚动条自适应宽度的问题
查看>>
第二次作业——个人项目实战
查看>>
HighCharts图表控件在ASP.NET WebForm中的使用
查看>>
C#汉字转拼音
查看>>
Remote Service 和 Local App的交互
查看>>
用python实现最长公共子序列算法(找到所有最长公共子串)
查看>>
正则表达式
查看>>
tensorflow models flags 初步使用
查看>>
[.NET] SQL数据分页查询
查看>>
[转]Ext自定义vtype动态验证
查看>>
Java - Java Web - Listener
查看>>
K3Cloud 后台修改账户密码策略
查看>>
Python内置函数
查看>>
第15章 面向对象程序设计
查看>>
C#读写socket的常用方式
查看>>
c语言链表fwrite二进制保存,读取时出现 屯 的问题
查看>>
谷歌Cartographer学习(1)-快速安装测试(转载)
查看>>