您的位置:首页 > 编程语言 > Qt开发

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

2015-05-22 00:00 573 查看

QML

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

QZXing

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

实现

从手机摄像头拿到帧图像和实时显示,使用用了
Camera
VideoOutput
,开始实现的时候,使用了
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qml QRCode QZXing qt
相关文章推荐