前言
几年前为了做摄像头图像处理,曾经使用过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;
}
效果图就不放上来了,其实就是高斯模糊+边缘检测的一个矩形。
三、总结
这次环境搭建比我想象中简单,而且整体的使用版本都是最新的版本,应该能在接下来的学习中体会到更高效的性能。