qml+QZXing實現實時QRCode識別和給重複造輪子的一些建議

QML

這個不說了,qml是qt在Qt4.7推出的qt元對象語言。markdown

QZXing

QZXing是對ZXing庫的一個Qt外包庫(Qt wrapper library),是被QRCode只是其中的一種。app

實現

從手機攝像頭拿到幀圖像和實時顯示,使用用了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信號通知這個異步的操做完成。ide

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我不知道怎麼想到更好的辦法,只能輪訓。ui

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

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

表現仍是能夠接受的。this

給重複造輪子的一些建議

我接觸到不少基於Qt,本身重複造輪子,這個能夠玩玩,學習一下實現,但是實際使用仍是要考慮,除非你以爲你比Qt的開發者還要NB。spa

相關文章
相關標籤/搜索