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;
}

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

三、总结

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

相关推荐
YangYang9YangYan2 小时前
2026年经管专业学习数据分析的指南
学习·数据挖掘·数据分析
独特的螺狮粉2 小时前
开源鸿蒙跨平台Flutter开发:微波射频阻抗匹配系统-极坐标史密斯圆图与天线信号渲染架构
开发语言·flutter·华为·架构·开源·harmonyos
冰暮流星2 小时前
javascript之dom方法访问内容
开发语言·前端·javascript
我命由我123452 小时前
在 React 项目中,配置了 setupProxy.js 文件,无法正常访问 http://localhost:3000
开发语言·前端·javascript·react.js·前端框架·ecmascript·js
草莓熊Lotso2 小时前
MySQL 事务管理全解:从 ACID 特性、隔离级别到 MVCC 底层原理
linux·运维·服务器·c语言·数据库·c++·mysql
浅时光_c2 小时前
9 循环语句
c语言·开发语言
stevenzqzq2 小时前
Kotlin 协程:withContext 与 async 核心区别与使用场景
android·开发语言·kotlin
鱼鳞_2 小时前
Java学习笔记_Day23(HashMap)
java·笔记·学习
CDN3602 小时前
弱网下游戏盾掉线重连失败?链路保活与超时参数优化
开发语言·游戏·php