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+QZXing实现实时QRCode识别和给重复造轮子的一些建议
- 重复造轮子---使用RecyclerView实现联系人首字母导航
- 当电脑连接网络出现未识别的网络且IP为169开头的一些解决的建议
- 重复造轮子-C语言风格string库函数的实现
- Python 3 利用 Dlib 实现摄像头实时人脸识别
- 解决qml画布当填充为透明时,不能实现实时绘图
- 字符识别算法SWT实现中的一些经验总结
- 【opencv学习之六】opencv+Qt+Qzxing调取本地摄像头识别二维码
- 人脸检测及识别python实现系列(1)——配置、获取实时视频流
- Qt移动开发大部分的场景基本上实现没问题,listview支持刷新3000~5000的实时数据没有任何压力(QML的几个大型应用)
- 准确的汽车识别技术(适应非结构化道路,可以实现实时汽车主动安全系统)
- 表情识别的简单实现(实时,C++,SVM+Dlib)
- “1000万字符串,去掉重复”的一些思考和java实现
- 关于重复造轮子的一些延续思考
- 重复造轮子--IOC容器的AOP简单实现
- Qt+QZXing编写识别二维码的程序
- JavaScript 实现的滚动条,熟悉一下JS的基本语法一些细节建议查看手册:
- “1000万字符串,去掉重复”的一些思考和java实现
- 迭代器就是重复地做一些事情,可以简单的理解为循环,在python中实现了__iter__方法的对象是可迭代的,实现了next()方法的对象是迭代器,这样说起来有
- 人脸检测及识别python实现系列(6)——终篇:从实时视频流识别出“我”