1、介绍
上一篇介绍了使用OpenCV的setMouseCallback回调函数实现获取鼠标点击点的图像坐标和像素值,本篇使用鼠标事件mouseMoveEvent函数来实现实时获取鼠标的坐标和对应图像点的像素值,并将结果实时显示在label控件上。
2、效果展示
3、实现过程
3.1 图像的加载和显示
这里加载图像并在QLabel控件上显示,我这里使用OpenCV的imread函数加载了图像,然后把图像转换成QPixmap显示在QLabel上。
img = imread("lena.png");
cvtColor(img, img, COLOR_BGR2RGB);
QImage disImage = QImage((const unsigned char*)(img.data), img.cols, img.rows, QImage::Format_RGB888);
QPixmap pix = QPixmap::fromImage(disImage);
pix.scaled(ui->lbl_pic->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->lbl_pic->setPixmap(pix); // label 显示图像
这里也可以直接用QPixmap的load函数加载图像和显示,然后在mouseMoveEvent函数中要通过OpenCV获取图像的像素值时,将QPixmap格式再转换成Mat类型。
3.2 设置鼠标跟踪事件激活
激活控件内鼠标跟随属性,调用setMouseTracking(true)激活后在鼠标点击控件内区域进入mouseMoveEvent函数实现鼠标跟随。
如果想不点击鼠标在控件内移动触发mouseMoveEvent函数,就需要同时设置控件和窗口的setMouseTracking(true),这样鼠标在控件内移动时可以实时跟踪鼠标事件。
/*激活控件鼠标跟随属性,激活后在点击鼠标后进入mouseMoveEvent函数*/
/*如果不点击鼠标时想要在控件上触发mouseMoveEvent函数,就需要同时激活控件和窗口*/
ui->lbl_pic->setMouseTracking(true);
setMouseTracking(true);
void Widget::mouseMoveEvent(QMouseEvent *event)
{
QPoint pt = event->pos();
QRect rect = ui->lbl_pic->geometry();