qt opencv透视变换
时间: 2025-01-21 18:12:30 浏览: 40
### 如何在 Qt 中使用 OpenCV 实现图像的透视变换
为了在 Qt 中集成并使用 OpenCV 进行图像的透视变换,可以遵循以下方法。此过程涉及设置项目环境、加载图像以及执行透视变换。
#### 设置 Qt 和 OpenCV 的开发环境
确保已安装配置好 Qt 开发套件,并且能够成功编译运行简单的 Qt 应用程序;另外还需下载安装适合操作系统的 OpenCV 版本,并将其库文件路径添加至项目的 `.pro` 文件以便链接器能找到必要的头文件和库:
```qmake
QT += core gui opencv
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
LIBS += -L$$PWD/../../opencv/build/lib \
-lopencv_core \
-lopencv_imgproc \
-lopencv_highgui \
-lopencv_calib3d
INCLUDEPATH += $$PWD/../../opencv/build/include
DEPENDPATH += $$PWD/../../opencv/build/include
```
上述代码片段展示了如何修改 `.pro` 文件以包含 OpenCV 库的位置[^2]。
#### 加载图片与显示窗口初始化
创建一个基于 `QWidget` 或者其他合适的基类的新窗体,在其中定义两个成员变量分别保存原始输入图像指针及其副本用于展示最终效果。重写 paintEvent 函数绘制当前状态下的图像帧数据流。同时利用按钮控件触发特定事件比如打开文件对话框选取待处理素材等交互逻辑。
#### 执行透视变换的具体实现
下面给出一段完整的 C++ 源码用来说明怎样调用 OpenCV API 完成从源到目的位置映射关系计算进而完成整个转换流程:
```cpp
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QFileDialog>
#include <QImage>
#include <QPainter>
// 导入OpenCV核心模块和其他所需组件
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/calib3d.hpp>
class PerspectiveTransformWidget : public QWidget {
Q_OBJECT
public:
explicit PerspectiveTransformWidget(QWidget *parent = nullptr);
protected slots:
void onButtonClicked();
private:
QPushButton* button;
cv::Mat imgOriginal; // 原始图像
};
PerspectiveTransformWidget::PerspectiveTransformWidget(QWidget *parent)
: QWidget(parent), button(new QPushButton(tr("Select Image"), this)) {
connect(button, SIGNAL(clicked()), SLOT(onButtonClicked()));
}
void PerspectiveTransformWidget::onButtonClicked(){
QString fileName = QFileDialog::getOpenFileName(this,
tr("Open File"),
"",
tr("Images (*.png *.xpm *.jpg)"));
if (!fileName.isEmpty()){
imgOriginal = cv::imread(fileName.toStdString());
std::vector<cv::Point2f> srcPoints = {cv::Point2f(56, 65),
cv::Point2f(368, 52),
cv::Point2f(28, 387),
cv::Point2f(389, 390)};
std::vector<cv::Point2f> dstPoints = {{0.f, 0.f},
{330.f, 0.f},
{0.f, 471.f},
{330.f, 471.f}};
cv::Mat perspectiveMatrix = cv::getPerspectiveTransform(srcPoints,dstPoints)[^3];
cv::Mat transformedImg;
cv::warpPerspective(imgOriginal,transformedImg,perspectiveMatrix,cv::Size(330,471));
QImage qimage((uchar*)transformedImg.data,
transformedImg.cols,
transformedImg.rows,
static_cast<int>(transformedImg.step),
QImage::Format_RGB888);
update(); // 刷新界面
QPainter painter(this);
painter.drawImage(rect(), qimage);
}
}
```
这段代码实现了基本的功能框架,即当用户点击按钮选择要处理的照片之后,会读取选定照片进入内存缓冲区作为工作对象,接着指定四个角点坐标对来构建仿射变换矩阵并通过 warpPerspective 方法应用给定参数实施变形操作最后更新 UI 显示区域呈现新生成的结果视图.
阅读全文
相关推荐


















