编程训练及要求有 1.基于QT/C++、OpenCV进行可视化窗体开发 2.多个子窗口或者图像显示的子区域 3.图像的自适应与鼠标控制的缩放显示 4.图像的自适应与鼠标控制的缩放显示
时间: 2024-02-16 12:03:52 浏览: 91
VS+QT+Opencv可视化编程.zip_VS+QT+Opencv可视化编程_opencv vs_qt opencv_qt教程
5星 · 资源好评率100%
好的,以下是基于QT/C++、OpenCV进行可视化窗体开发的代码示例,满足要求:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
#include <QApplication>
#include <QWidget>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLabel>
#include <QSlider>
#include <QMouseEvent>
using namespace std;
using namespace cv;
class ImageViewer : public QWidget
{
Q_OBJECT
public:
ImageViewer(QWidget *parent = nullptr) : QWidget(parent)
{
// 读入图像
image = imread("test.jpg");
// 初始化滑动条
slider = new QSlider(Qt::Horizontal, this);
slider->setMinimum(1);
slider->setMaximum(100);
slider->setValue(50);
// 初始化标签
originalLabel = new QLabel(this);
processedLabel = new QLabel(this);
// 布局
QHBoxLayout *hLayout = new QHBoxLayout();
hLayout->addWidget(originalLabel);
hLayout->addWidget(processedLabel);
QVBoxLayout *vLayout = new QVBoxLayout();
vLayout->addLayout(hLayout);
vLayout->addWidget(slider);
setLayout(vLayout);
// 信号槽连接
connect(slider, SIGNAL(valueChanged(int)), this, SLOT(onSliderValueChanged(int)));
// 设置窗口大小
setFixedSize(image.cols * 2 + 20, image.rows + 80);
// 显示原图和滤波结果
originalLabel->setPixmap(QPixmap::fromImage(matToQImage(image)));
processedLabel->setPixmap(QPixmap::fromImage(matToQImage(image)));
// 设置鼠标跟踪
setMouseTracking(true);
}
protected:
void mousePressEvent(QMouseEvent *event) override
{
if (event->button() == Qt::LeftButton)
{
// 保存鼠标按下时的坐标
lastPoint = event->pos();
}
}
void mouseMoveEvent(QMouseEvent *event) override
{
if (event->buttons() & Qt::LeftButton)
{
// 计算鼠标移动的距离
QPoint offset = event->pos() - lastPoint;
// 保存当前的图像大小和位置
QRect rect = processedLabel->geometry();
// 改变图像大小和位置
rect.setWidth(rect.width() + offset.x());
rect.setHeight(rect.height() + offset.y());
processedLabel->setGeometry(rect);
// 更新上一次的坐标
lastPoint = event->pos();
}
}
void wheelEvent(QWheelEvent *event) override
{
// 计算滚轮的滚动距离
int delta = event->angleDelta().y();
// 计算缩放比例
double scale = (delta > 0) ? 1.1 : 0.9;
// 保存当前的图像大小和位置
QRect rect = processedLabel->geometry();
// 计算新的图像大小和位置
int newWidth = rect.width() * scale;
int newHeight = rect.height() * scale;
int newX = rect.x() - (newWidth - rect.width()) / 2;
int newY = rect.y() - (newHeight - rect.height()) / 2;
// 设置图像大小和位置
processedLabel->setGeometry(newX, newY, newWidth, newHeight);
}
private slots:
void onSliderValueChanged(int value)
{
// 计算参数
int d = value * 2 + 1;
double sigmaColor = 75;
double sigmaSpace = 75;
// 自适应双边滤波
Mat result;
bilateralFilter(image, result, d, sigmaColor, sigmaSpace);
// 显示滤波结果
processedLabel->setPixmap(QPixmap::fromImage(matToQImage(result)));
}
private:
Mat image;
QPoint lastPoint;
QSlider *slider;
QLabel *originalLabel;
QLabel *processedLabel;
QImage matToQImage(const Mat &mat)
{
// 转换为RGB格式
Mat rgbMat;
cvtColor(mat, rgbMat, COLOR_BGR2RGB);
// 创建QImage
QImage img(rgbMat.data, rgbMat.cols, rgbMat.rows, rgbMat.step, QImage::Format_RGB888);
return img;
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
ImageViewer viewer;
viewer.show();
return app.exec();
}
```
这段代码实现了一个包含原图和处理后图像的窗口,可以使用滑动条控制自适应双边滤波的参数,通过鼠标拖拽和滚轮缩放实现图像的自适应与鼠标控制的缩放显示,满足要求。
阅读全文