Qt+OpenCV(一)环境搭建

前言

几年前为了做摄像头图像处理,曾经使用过opencv,印象中环境搭建还蛮复杂的,需要做cmake构建等工作。最近想重新实现记录一下,发现环境搭建没有想象中的困难。

一、OpenCV预编译包下载

OpenCV是一个视觉处理库,从官网上可以下载源码包。
OpenCV官网

下载好后虽然是一个exe,但实际上是一个压缩包,点击后解压到系统一个指定目录下,比如:

D:\ThirdParty\OpenCV\opencv_source_4.12.0。

原本以为要进行本地编译,后面看到了build目录,底下有v16。(\build\x64\vc16)

里面的bin有dll,lib下有lib文件,build下也有include目录,这不就可以直接引用预编译好的动态库吗?

当然前提是你的开发环境对得上。我使用的是qt6.10.2+msvc2022,刚好可以使用这个版本的OpenCV。

二、Qt中使用OpenCV

先创建一个新的项目工程,我习惯了用qmake,pro的。

在pro文件中添加这段代码,根据实际情况修改。这下基本上就可以引用上了,我也没遇到奇怪的问题。

cpp 复制代码
# 1. 指定 OpenCV 的安装根目录 (根据你的实际路径修改)
OPENCV_DIR = D:/ThirdParty/OpenCV/opencv_source_4.12.0/build
# D:\ThirdParty\OpenCV\opencv_source_4.12.0\build\x64\vc16

# 2. 添加头文件路径
INCLUDEPATH += $$OPENCV_DIR/include

# 3. 链接 MSVC 版本的库
# 注意:这里我们明确指向 vc16 目录下的 lib
LIBS += -L$$OPENCV_DIR/x64/vc16/lib \
        -lopencv_world4120

# 4. 指定依赖路径 (可选,但推荐)
DEPENDPATH += $$OPENCV_DIR/include

可以先编译一下,没有问题,我们就可以添加代码测试了。假设我们有一个mainwindow,然后自行添加一个按钮触发,调用下面的testOpenCV函数吧。

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLabel>
#include <QMessageBox>

// 1. 引入 OpenCV 头文件
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>

// 辅助函数:OpenCV (cv::Mat) 转 Qt (QPixmap)
// 注意:OpenCV 默认是 BGR 格式,Qt 是 RGB 格式,必须转换!
QPixmap matToPixmap(const cv::Mat& mat)
{
    if (mat.empty()) return QPixmap();

    // 如果是灰度图,转为 RGB
    cv::Mat rgbMat;
    if (mat.channels() == 1) {
        cv::cvtColor(mat, rgbMat, cv::COLOR_GRAY2RGB);
    } else {
        cv::cvtColor(mat, rgbMat, cv::COLOR_BGR2RGB);
    }

    // 构造 QImage (注意步长 bytesPerLine)
    QImage img(rgbMat.data, rgbMat.cols, rgbMat.rows, 
               static_cast<int>(rgbMat.step), 
               QImage::Format_RGB888);
    
    return QPixmap::fromImage(img);
}

void MainWindow::testOpenCV()
{
    // --- 第一步:创建一张测试图片 (200x200, 白色背景) ---
    cv::Mat originalImage = cv::Mat::zeros(200, 200, CV_8UC3);
    originalImage.setTo(cv::Scalar(255, 255, 255)); // 白色背景

    // 画一个蓝色的矩形 (OpenCV颜色是 BGR,所以纯蓝是 255,0,0)
    cv::rectangle(originalImage, 
                  cv::Point(50, 50), cv::Point(150, 150), 
                  cv::Scalar(255, 0, 0), -1); // -1 表示填充

    // --- 第二步:OpenCV 图像处理 ---
    cv::Mat processedImage;
    
    // 1. 高斯模糊 (验证算法库是否正常)
    cv::GaussianBlur(originalImage, processedImage, cv::Size(15, 15), 5);
    
    // 2. Canny 边缘检测 (验证核心视觉算法是否正常)
    // 这会提取出矩形的轮廓
    cv::Canny(processedImage, processedImage, 50, 150);
    
    // 3. 把边缘检测后的灰度图转回彩色图,方便观察
    cv::cvtColor(processedImage, processedImage, cv::COLOR_GRAY2BGR);

    // --- 第三步:在 Qt 界面上显示 ---
    // 假设你界面上有一个 QLabel 叫 ui->labelResult
    // 如果还没有,可以临时 new 一个 QLabel 出来测试
    
    QLabel *label = new QLabel(this);
    label->setWindowTitle("OpenCV 测试结果");
    
    // 将 OpenCV 的 Mat 转为 Qt 的 QPixmap 显示
    label->setPixmap(matToPixmap(processedImage).scaled(400, 400, Qt::KeepAspectRatio));
    label->show();

    // --- 第四步:控制台输出 ---
    // 验证版本号,确保链接的是你下载的 4.12 版本
    qDebug() << "OpenCV 版本:" << CV_VERSION;
    qDebug() << "测试图片矩阵大小:" << originalImage.size().width << "x" << originalImage.size().height;
}

效果图就不放上来了,其实就是高斯模糊+边缘检测的一个矩形。

三、总结

这次环境搭建比我想象中简单,而且整体的使用版本都是最新的版本,应该能在接下来的学习中体会到更高效的性能。

相关推荐
Scott9999HH5 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
2401_841495645 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
fqbqrr6 小时前
2607C++,soui与安卓
c++·soui
码智社6 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海6 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖7 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
a1117769 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
我的xiaodoujiao9 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
fqbqrr9 小时前
2607C++,使用微软detours勾挂工具
c++