将opencv图像显示在qt上并框选roi
时间: 2023-06-14 10:05:36 浏览: 411
要在Qt中显示OpenCV图像并框选ROI,可以按照以下步骤进行:
1.使用OpenCV读取图像文件:
```c++
cv::Mat image = cv::imread("image.jpg");
```
2.将图像转换为Qt格式:
```c++
QImage img(image.data, image.cols, image.rows, QImage::Format_RGB888);
```
3.创建一个QLabel并设置图像:
```c++
QLabel* label = new QLabel(this);
label->setPixmap(QPixmap::fromImage(img));
```
4.添加一个鼠标事件处理程序以框选ROI:
```c++
void MyWidget::mousePressEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
{
// 记录鼠标按下的位置
startPoint = event->pos();
}
}
void MyWidget::mouseReleaseEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
{
// 记录鼠标松开的位置
endPoint = event->pos();
// 计算矩形的左上角和右下角坐标
int x = qMin(startPoint.x(), endPoint.x());
int y = qMin(startPoint.y(), endPoint.y());
int width = qAbs(startPoint.x() - endPoint.x());
int height = qAbs(startPoint.y() - endPoint.y());
// 在图像上绘制矩形
cv::rectangle(image, cv::Rect(x, y, width, height), cv::Scalar(0, 255, 0), 2);
// 将图像转换为Qt格式并设置到QLabel上
QImage img(image.data, image.cols, image.rows, QImage::Format_RGB888);
label->setPixmap(QPixmap::fromImage(img));
}
}
```
在上面的代码中,我们记录鼠标按下和松开时的位置,并计算矩形的左上角和右下角坐标。然后,我们使用OpenCV在图像上绘制一个矩形,并将图像转换为Qt格式并设置到QLabel上。
完整的示例代码如下:
```c++
#include <QtWidgets>
#include <opencv2/opencv.hpp>
class MyWidget : public QWidget
{
public:
MyWidget(QWidget* parent = nullptr)
: QWidget(parent)
{
// 使用OpenCV读取图像文件
cv::Mat image = cv::imread("image.jpg");
// 将图像转换为Qt格式
QImage img(image.data, image.cols, image.rows, QImage::Format_RGB888);
// 创建一个QLabel并设置图像
label = new QLabel(this);
label->setPixmap(QPixmap::fromImage(img));
// 设置窗口大小
setFixedSize(image.cols, image.rows);
// 设置鼠标跟踪
setMouseTracking(true);
label->setMouseTracking(true);
label->installEventFilter(this);
}
protected:
void mousePressEvent(QMouseEvent* event) override
{
if (event->button() == Qt::LeftButton)
{
// 记录鼠标按下的位置
startPoint = event->pos();
}
}
void mouseReleaseEvent(QMouseEvent* event) override
{
if (event->button() == Qt::LeftButton)
{
// 记录鼠标松开的位置
endPoint = event->pos();
// 计算矩形的左上角和右下角坐标
int x = qMin(startPoint.x(), endPoint.x());
int y = qMin(startPoint.y(), endPoint.y());
int width = qAbs(startPoint.x() - endPoint.x());
int height = qAbs(startPoint.y() - endPoint.y());
// 在图像上绘制矩形
cv::Mat image = cv::imread("image.jpg");
cv::rectangle(image, cv::Rect(x, y, width, height), cv::Scalar(0, 255, 0), 2);
// 将图像转换为Qt格式并设置到QLabel上
QImage img(image.data, image.cols, image.rows, QImage::Format_RGB888);
label->setPixmap(QPixmap::fromImage(img));
}
}
private:
QLabel* label;
QPoint startPoint;
QPoint endPoint;
};
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
MyWidget widget;
widget.show();
return app.exec();
}
```
阅读全文