图像识别(11)——LED灯光点捕获+基于QT平台绘制轨迹
Posted somebot
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像识别(11)——LED灯光点捕获+基于QT平台绘制轨迹相关的知识,希望对你有一定的参考价值。
博主QQ:1356438802
QQ群:473383394——UVC&OpenCV473383394
平台:Win7 64bits + Qt 5.3.0 MinGW 32bit + OpenCV 2.4.10
在前面的文章中,我已经实现了捕获红外LED灯的光点,并且借助OpenCV的imshow()函数,可以直接将光点轨迹图像显示在窗体界面上。
另外由于OpenCV是纯C/C++的开源库,可以在VisualStudio和QT开发平台中,无缝切换编译运行(当然前提是你已经准备好了两个平台的OpenCV库),在上一篇文章的末尾,我已经分别给出了VisualStudio和QT两个平台的源码。
于是我现在要在上述QT的源码《LED_detect.rar》的基础上,再改进。我在多个场合说过,MFC平台不适合做UI,没有布局工具,非常麻烦,这就是为什么我现在要迁移到QT开发平台。而且OpenCV自带的窗体不美观,交互性也很弱,不适合直接拿来做产品,那么我现在要结合OpenCV的算法优势和QT的桌面软件编程优势,继续深入手写笔应用的开发!
核心思想:单独开一个线程,专门负责摄像头的图像识别工作,即捕获LED灯光点,计算光点坐标,再反馈给QT的UI界面,绘图。
涉及的QT知识点:
1. paintEvent绘图事件
2. 信号与槽
3. QT线程的一种新用法
mainwindow.cpp文件如下
#include <QMessageBox>
#include <QThread>
#include <QDebug>
#include "cfg.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui->setupUi(this);
mIsFirstPoint = true;
mCenterPoint = mPrevCenterPoint = QPointF(0.0, 0.0);
//把LED灯追踪放入一个子线程里面运行
mTracker = new Track();
mTrackThread = new QThread(this);
mTracker->moveToThread(mTrackThread);
connect(this, SIGNAL(startTrack()), mTracker, SLOT(startTrack()));
connect(mTracker, SIGNAL(TrackPoint(QPointF)), this, SLOT(setPoints(QPointF)));
connect(mTracker, SIGNAL(errnum(int)), this, SLOT(errProc(int)));
mTrackThread->start();
MainWindow::~MainWindow()
//停止图像识别
mTracker->StopTrack();
//结束线程
mTrackThread->quit();
mTrackThread->wait();
delete mTrackThread;
delete mTracker;
delete ui;
void MainWindow::paintEvent(QPaintEvent *event)
Q_UNUSED(event);
QPainter painter(this);
// 反走样 反锯齿
painter.setRenderHint(QPainter::Antialiasing, true);
// 设置画笔颜色
painter.setPen(QColor(0, 160, 230));
// 绘制直线
painter.drawLine(mPrevCenterPoint, mCenterPoint);
// 保存当前光点坐标, 下次绘制时使用
mPrevCenterPoint = mCenterPoint;
void MainWindow::setPoints(QPointF point)
mCenterPoint = point;
if(true == mIsFirstPoint)
mPrevCenterPoint = mCenterPoint;
mIsFirstPoint = false;
// 开始重绘
update();
void MainWindow::errProc(int err)
if(CFG::CAMERA_OPEN_FAILED == err)
QMessageBox::warning(this, "警告", "摄像头打开失败");
void MainWindow::on_btnStartTrack_clicked()
emit startTrack();
完整源码下载链接:
以上是关于图像识别(11)——LED灯光点捕获+基于QT平台绘制轨迹的主要内容,如果未能解决你的问题,请参考以下文章