1. 项目概述
在Linux环境下进行Qt和OpenCV的联合开发时,64位库的编译与中文支持一直是困扰开发者的典型问题。这次我将分享在Ubuntu 20.04.03系统上,使用Qt5.12.10和OpenCV4.13.0版本进行64位库编译的完整过程,重点解决中文绘制这个实际开发中的痛点需求。
这个配置组合的选择并非偶然——Qt5.12是LTS长期支持版本,OpenCV4.13则包含了DNN模块的重要更新。在工业视觉、医疗影像等领域,这种组合既能保证稳定性又能获得较新的计算机视觉算法支持。而中文显示问题,则是国内开发者处理图像标注、结果可视化时无法回避的实际需求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与依赖安装
2.1 系统基础环境配置
首先需要确保Ubuntu系统已更新到最新状态:
bash复制sudo apt update && sudo apt upgrade -y
开发工具链的安装是后续编译的基础:
bash复制sudo apt install -y build-essential cmake git libgtk2.0-dev pkg-config \
libavcodec-dev libavformat-dev libswscale-dev libtbb2 libtbb-dev \
libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
注意:这里特别包含了GTK+开发包,它会影响OpenCV的GUI模块编译。如果漏装,可能导致后续imshow()等函数无法正常使用。
2.2 Qt5.12.10特定依赖
针对Qt5.12.10需要额外安装的依赖项:
bash复制sudo apt install -y libxcb-xinerama0-dev libxkbcommon-dev libxkbcommon-x11-dev \
libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-render-util0-dev
这些包处理了X11窗口系统的交互问题,缺少它们可能导致Qt程序在Linux桌面环境下出现奇怪的窗口管理问题。
3. OpenCV4.13.0编译详解
3.1 源码获取与配置
建议从GitHub获取官方源码以确保完整性:
bash复制git clone --branch 4.13.0 https://github.com/opencv/opencv.git
git clone --branch 4.13.0 https://github.com/opencv/opencv_contrib.git
配置CMake时特别需要注意的参数:
bash复制cd opencv && mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
-D WITH_QT=ON \
-D WITH_OPENGL=ON \
-D OPENCV_ENABLE_NONFREE=ON \
-D BUILD_EXAMPLES=ON ..
关键参数解析:
WITH_QT=ON:启用Qt后端支持OPENCV_ENABLE_NONFREE=ON:包含SIFT/SURF等专利算法BUILD_EXAMPLES=ON:编译示例程序便于测试
3.2 编译过程优化
在16核服务器上可以这样加速编译:
bash复制make -j$(nproc)
但普通开发机建议控制线程数避免内存耗尽:
bash复制make -j4
编译完成后验证模块是否完整:
bash复制ls lib/python3.8/site-packages/cv2/python-3.8/
应该能看到cv2.cpython-38-x86_64-linux-gnu.so文件,这表示Python绑定也已成功编译。
4. Qt5.12.10定制编译
4.1 源码获取与配置
从官方镜像获取指定版本:
bash复制wget https://download.qt.io/archive/qt/5.12/5.12.10/single/qt-everywhere-src-5.12.10.tar.xz
tar xvf qt-everywhere-src-5.12.10.tar.xz
配置时重点考虑以下选项:
bash复制./configure -prefix /opt/Qt5.12.10 \
-opensource \
-confirm-license \
-release \
-opengl desktop \
-no-pch \
-nomake examples \
-nomake tests \
-qt-xcb \
-fontconfig \
-system-freetype \
-icu
关键选项说明:
-opengl desktop:启用桌面级OpenGL支持-qt-xcb:优化X11环境下的表现-fontconfig:确保系统字体支持
4.2 中文支持强化
在qtbase/src/platformsupport/fontdatabases目录下,需要修改fontconfig的初始化代码,确保中文字体能被正确识别。典型修改如下:
cpp复制// 在QFontconfigDatabase::setupFontEngine()中添加
FcPatternAddString(pattern, FC_LANG, (const FcChar8*)"zh-cn");
重新编译后,可以通过以下命令验证中文支持:
bash复制qmake -query QT_INSTALL_BINS
./qtdemo
在示例程序中应该能正常显示中文字符而非方框。
5. 联合调试与验证
5.1 环境变量配置
在~/.bashrc中添加:
bash复制export PATH=/opt/Qt5.12.10/bin:$PATH
export LD_LIBRARY_PATH=/opt/Qt5.12.10/lib:/usr/local/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
5.2 测试程序编写
创建测试项目验证功能完整性:
cpp复制#include <QApplication>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
cv::Mat img(300, 500, CV_8UC3, cv::Scalar(255,255,255));
cv::putText(img, "中文测试", cv::Point(50,150),
cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0,0,255), 2);
cv::imshow("Qt+OpenCV测试", img);
return a.exec();
}
5.3 项目文件配置
对应的.pro文件关键配置:
qmake复制QT += core gui widgets
TARGET = OpenCVQtTest
CONFIG += c++11
INCLUDEPATH += /usr/local/include/opencv4
LIBS += -L/usr/local/lib -lopencv_core -lopencv_highgui -lopencv_imgproc
6. 常见问题解决方案
6.1 中文显示为方框
可能原因及解决:
- 系统缺少中文字体
bash复制sudo apt install fonts-wqy-microhei - Qt编译时未正确配置fontconfig
需重新编译Qt并确保-fontconfig选项启用
6.2 OpenCV窗口无响应
典型解决方案:
cpp复制// 在main()开头添加
cv::namedWindow("window", cv::WINDOW_NORMAL | cv::WINDOW_GUI_EXPANDED);
6.3 库版本冲突
使用ldd检查依赖关系:
bash复制ldd ./YourProgram | grep "not found"
对于冲突的库,可以通过设置LD_PRELOAD指定优先级:
bash复制export LD_PRELOAD=/path/to/correct/library.so
7. 性能优化技巧
7.1 启用OpenCV的IPP加速
在CMake配置时添加:
bash复制-D WITH_IPP=ON \
-D IPP_PATH=/opt/intel/ipp
7.2 Qt与OpenCV的混合渲染
对于需要高性能绘制的场景,建议:
cpp复制// 将OpenCV Mat转换为QImage时使用共享内存
QImage cvMatToQImage(const cv::Mat &mat) {
if(mat.type() == CV_8UC3) {
return QImage(mat.data, mat.cols, mat.rows,
mat.step, QImage::Format_RGB888).rgbSwapped();
}
// 其他类型处理...
}
7.3 多线程处理模式
推荐使用Qt的Concurrent框架:
cpp复制QFuture<cv::Mat> future = QtConcurrent::run([](){
cv::Mat processed;
// 耗时的OpenCV处理
return processed;
});
8. 部署注意事项
8.1 库文件打包
使用linuxdeployqt工具:
bash复制linuxdeployqt AppImage -qmake=/opt/Qt5.12.10/bin/qmake
8.2 依赖项检查
创建检查脚本:
bash复制#!/bin/bash
for lib in $(ldd $1 | awk '{print $3}'); do
if [ -f "$lib" ]; then
cp -v "$lib" ./lib/
fi
done
8.3 字体打包
确保目标系统有相同字体:
bash复制cp -r /usr/share/fonts/wqy ./appfonts
