借鉴前人经验 http://blog.csdn.net/luoyayun361/article/details/61936032

利用

继承QQuickImageProvider类的方法来完成opencv读取摄像头每一帧,并利用QImage绘制并发送给qml端的Image 

直接上代码

#ifndef IMAGEPROVIDER_H
#define IMAGEPROVIDER_H
#include<QImage>
#include<QQuickImageProvider>
class ImageProvider : public QQuickImageProvider
{
public:
    ImageProvider();
    QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize);
    QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize);
    QImage img;
};
#endif // IMAGEPROVIDER_H
#include "imageprovider.h"
#include<QDebug>
ImageProvider::ImageProvider()
    : QQuickImageProvider(QQuickImageProvider::Image)
/本例中未使用Pixmap来绘制图像,若要使用其,只需要将Image替换为Pixmap
{
}
QImage ImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
{
    qDebug()<<"requestImage";
    return this->img;
}
QPixmap ImageProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize)
{
    qDebug()<<"requestPixmap";
    return QPixmap::fromImage(this->img);
}
#ifndef IMAGESHOW_H
#define IMAGESHOW_H
#include<imageprovider.h>
#include<opencv.hpp>
using namespace cv;
class ShowImage : public QObject
{
    Q_OBJECT
public:
    explicit ShowImage(QObject *parent = 0);
    ImageProvider *m_pImgProvider;
    QImage  MattoQImage(Mat cvImg);
public slots:
    void setImage();
    void closeCamera();
signals:
    void callQmlRefeshImg();
private:
    Mat src_frame;
   // QImage image;
    VideoCapture capture;
};
#endif // IMAGESHOW_H
#include<imageshow.h>
#include<QDebug>
ShowImage::ShowImage(QObject *parent) :
    QObject(parent)
{
    m_pImgProvider = new ImageProvider();
    capture=VideoCapture(0);
}
void ShowImage::closeCamera()
{
   capture.release();
}
void ShowImage::setImage()
{
     capture>>src_frame;
    m_pImgProvider->img = MattoQImage(src_frame);
    emit callQmlRefeshImg();
    qDebug()<<"setImage";
}
QImage ShowImage::MattoQImage(Mat cvImg)
{
    QImage qImg;
    if(cvImg.channels()==3)               
    {
      cvtColor(cvImg,cvImg,CV_BGR2RGB);
        qImg =QImage((const unsigned char*)(cvImg.data),
                    cvImg.cols, cvImg.rows,
                    cvImg.cols*cvImg.channels(),
                    QImage::Format_RGB888);
    }
    else if(cvImg.channels()==1) {     
         qImg =QImage((const unsigned char*)(cvImg.data),
                    cvImg.cols,cvImg.rows,
                    cvImg.cols*cvImg.channels(),
                    QImage::Format_Indexed8);
    
    }
    else
    {
        qImg =QImage((const unsigned char*)(cvImg.data),
                     
                    cvImg.cols,cvImg.rows,
                    cvImg.cols*cvImg.channels(),
                    QImage::Format_RGB888);
    }
    return qImg;
}
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include<QQmlContext>
#include<QDebug>
#include<imageshow.h>
#include<opencv.hpp>
using namespace cv;
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    ShowImage *CodeImage = new ShowImage();
    QQmlApplicationEngine W;
    W.rootContext()->setContextProperty("CodeImage",CodeImage);
    W.addImageProvider(QLatin1String("CodeImg"), CodeImage->m_pImgProvider);
    W.load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}
import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 2.0
Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World");
   Timer{
      id:count;
      interval: 25;
      running: false;
      repeat: true
      onTriggered: {
      CodeImage.setImage();
}
   }
Button{
    id:open;
    text:"打开摄像头"
    width:100;
    height:30;
    anchors.left: parent.left;
    anchors.top:parent.top;
    anchors.leftMargin: 10;
    anchors.topMargin: 10;
    onClicked:{
        count.running=true;
    }
}
Button{
    id:quit;
    text:"关闭摄像头"
    width:100;
    height:30;
    anchors.left: parent.left;
    anchors.top:open.bottom;
    anchors.leftMargin: 10;
    anchors.topMargin: 10;
    onClicked:{
        count.running=false;
        CodeImage.closeCamera();
        Qt.quit();
    }
}
    Image{
            id:img;
            width:400;
            height:400;
            anchors.centerIn: parent;
            cache:false;
        }
      Connections{
            target: CodeImage
            onCallQmlRefeshImg:{
                img.source = "";
                img.source = "image://CodeImg";
                console.log("no");
            }
        }
}

qml+opencv3.1简单打开摄像头,关闭摄像头相关推荐

  1. 调用摄像头_摄像头 | 浏览器调用摄像头并实现截图保存的效果

    ​为了在QT上实现打开摄像头,拍照等操作.就写了这个. 1. 写一个vue组件 先写一个vue的组件,其内容基本如下: <el-button type="primary" @ ...

  2. OpenCV+VS2019打开和关闭电脑摄像头

    关于OpenCV和VS2019的配置,请参考博客以前的连接. OpenCV中主要使用videocapture来打开和关闭摄像头 https://docs.opencv.org/master/d8/df ...

  3. MFC+opencv实现摄像头的打开与关闭

    下面以vs2013+opencv2.4.9的实验环境做出演示: 首先建立对话框工程对话框,界面如下: 设置定时器来更新picture显示框 在CMFCdisplayDlg.h中添加以下变量 priva ...

  4. RTSP安防网络摄像头/海康大华硬盘录像机网页无插件直播流媒体服务器EasyNVR证书配置页面按钮无法正常打开和关闭的问题解析

    进入移动互联网时代以来,企业微信公众号已成为除官网以外非常重要的宣传渠道,当3.2亿直播用户与9亿微信用户的势能累加,在微信上开启直播已成为越来越多企业的必然选择. 安防视频流媒体服务器EasyNVR ...

  5. 如何用openvr api打开vive前置摄像头

    随着越来越多的开发者开始他们的VR开发工作,他们看到了这项技术的巨大潜力,像是Valve这样的公司正在想办法保证他们的软件开发包(SDK)能够提供尽量多的功能.今天这家公司发布了其针对SteamVR的 ...

  6. 用python打开多个摄像头_了解使用python和OpenCV与VideoCaptu进行多个网络摄像头捕获...

    我正在尝试同时(或几乎同时)从多个网络摄像头捕捉图像.我一直在玩OpenCV.VideoCapture和python编程.但有些困惑,希望有人能帮忙解释... 首先,我尝试了视频捕捉(Markus G ...

  7. js调用(前/后)摄像头,截取照片,关闭摄像头

    全部代码:(详细注释已在代码中标明) <!DOCTYPE html> <html lang="en"> <head><meta chars ...

  8. js调用pc摄像头实现拍照、录视频等,新版Chrome无访问http页面无法打开麦克风、摄像头

    js调用pc摄像头实现拍照.录视频等,新版Chrome无访问http页面无法打开麦克风.摄像头 新版Chrome配置 vue环境下的前端 function部分 ##由于没有https环境,只有http ...

  9. 【R9000P相机问题】打开相机应用摄像头无法使用,显示小锁的图标处理方法

    故障现象: 打开相机应用摄像头无法使用,显示小锁的图标 原因分析: 联想电脑管家里摄像头隐私模式开启有关. 打开相机应用摄像头无法使用,显示小锁的图标处理. 解决方法: 一.管家4.0版本工具箱截图: ...

最新文章

  1. vue中点击导航栏部分,页面切换
  2. react循环setstate_react -- 关于兄弟组件触发更新的问题
  3. IDEA Terminal命令行运行javac时,一个类运用另一个类的方法找不到符号的问题
  4. 云拨测助力节卡机器人,全面优化海外网站性能
  5. (论坛答疑点滴)DataGrid的EditCommandColumn如何使用图片作为按钮?
  6. MVC强类型和弱类型的区别
  7. CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-8CDH5安装和集群配置
  8. request-爬取一张图片的练习-答案-私
  9. 各大厂商CTR广告预估模型的优缺点对比
  10. Eureka的自我保护模式
  11. c语言中rcu缩写,ICU、MICU、EICU、NICU、NCU、CCU、RCU,科室英文缩写大全
  12. centos下安装teamview
  13. Idea新建项目和快捷键
  14. BroadcastReceiver生命周期探讨
  15. 基于Huffman算法实现文件压缩解压缩(C语言)
  16. 一文讲透 CentOS 开机流程
  17. 符号表工具addr2line
  18. 网页编码与数据传递中的中文字符编码
  19. Glide 入门到精通之四——图片缩放和调整大小
  20. arcgis javascript Measurement的使用

热门文章

  1. 基于Python实现的孤立词语音识别系统
  2. SinuTrain for SINUMERIK 仿真西门子最新版仿真软件
  3. SAP 科目的 未清项管理的理解
  4. 参考平面及其高度_某层平面图的剖切位置高度一般是离该层地面1.0米--求规范出处...
  5. Linux学习总结(59)——为什么建议大家使用 Linux 开发
  6. 09 | 校招简历投递渠道汇总与对比分析,选对渠道才能事半功倍
  7. 常常被问路吗?我今年一共 26 次!
  8. 四位顶级AI大牛纵论:深度学习和大数据结合的红利还能持续多久?
  9. NCRE 四级数据库工程师教程,例题加解析,干货
  10. 南大软工考研参考书目