qml+QZXing实现实时QRCode识别和给重复造轮子的一些建议

本文详细介绍了如何利用Qt框架实现从手机摄像头获取帧图像并实时显示,通过使用Camera和VideoOutput组件优化性能,避免UI主线程卡顿。重点探讨了如何在独立线程中进行QRCode识别,以及如何使用QThread和QML中的异步调用机制。同时,文章提供了一种基于QZXing库的QRCode识别方法,并讨论了图像抓取、解码过程中的关键步骤和优化策略。

QML

这个不说了,qml是qt在Qt4.7推出的qt元对象语言。

QZXing

QZXing是对ZXing库的一个Qt外包库(Qt wrapper library),是被QRCode只是其中的一种。

实现

从手机摄像头拿到帧图像和实时显示,使用用了CameraVideoOutput,开始实现的时候,使用了CameraCapture,其性能不能忍受。然后我希望可以直接从VideoOutput中取出图片。
对QRCode的识别是一个cpu密集型运算,在UI主线程中做会出现卡顿,那可以使用QThread。
用C++来做QRCode识别,qt5之后的QML渲染机制使用了OpenGL ES,其在单独的渲染线程进行,其由QWindow完成。QML中的一个可视化元素都是QQuickItem的一个实例。Qt为我们提供了grabToImage调用。

void Supporter::decoderVideoOutputQML(QObject *obj)
{
    if (!m_bisGrab) {
        QQuickItem *item = qobject_cast<QQuickItem*>(obj);
        m_grabResult = item->grabToImage();
        QQuickItemGrabResult * _p = m_grabResult.data();
        if (_p) {
            connect(_p, SIGNAL(ready()),this,SLOT(grabReady()));
            m_bisGrab = true;
        }
    }
}

VideoOutput作为参数传递进来,grabToImage是一个异步调用,UI主线程和渲染线程。我们引入参数m_bisGrab来进行管理,ready信号通知这个异步的操作完成。

    void grabReady() {
        m_imageQR = m_grabResult->image();
        emit sig_zxingDecoderImage(m_imageQR);
    }
    //识别结果
    void decoderResult(bool succ) {
        m_bisGrab = false;
        qDebug() <<  "qr decode" << succ;
    }

取出图像发送给解码线程。

    pQZXing = new QZXing();
    m_pQZXing->setDecoder(QZXing::DecoderFormat_QR_CODE);
    m_pDecoderThread = new QThread(this);
    m_bisGrab = false;
    m_pQZXing->moveToThread(m_pDecoderThread);
    m_pDecoderThread->start();

信号

    connect(this, SIGNAL(sig_zxingDecoderImage(QImage)), m_pQZXing, SLOT(decodeImage(QImage)));
    connect(m_pQZXing, SIGNAL(tagFound(QString)), this,SIGNAL(sig_tag(QString)));
    connect(m_pQZXing, SIGNAL(decodingFinished(bool)),this,SLOT(decoderResult(bool)));

在QML我不知道怎么想到更好的办法,只能轮训。

    Timer {
        id:tick_timer
        interval: 1000
        running: false
        repeat: true

        onTriggered: {
            Supporter.decoderVideoOutputQML(video_output);
        }
    }

表现还是可以接受的。

给重复造轮子的一些建议

我接触到很多基于Qt,自己重复造轮子,这个可以玩玩,学习一下实现,可是实际使用还是要考虑,除非你觉得你比Qt的开发者还要NB。

转载于:https://my.oschina.net/u/854744/blog/418503

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值