Lab0 实验环境准备与OpenCV Hello World
参考自同济大学蒋磊老师编写的IPMV实验说明
同济大学自动化专业IMPV课程学习记录 (包含知识点以及实验)
Lab0 实验环境准备与OpenCV Hello World
Lab1-1 OpenCV入门与实践——从基础操作到实时视频处理(一)
Lab1-2 OpenCV入门与实践——从基础操作到实时视频处理(二)
Lab2-1 从零玩转Eigen库:掌握线性代数与OpenCV互操作的神器!(一)
Lab2-2 从零玩转Eigen库:掌握线性代数与OpenCV互操作的神器!(二)
Lab4 Blending 线性混合与拉普拉斯金字塔混合对比
…
待更新
文章目录
本项目旨在在 Ubuntu 24.04.x LTS 虚拟机中配置 OpenCV、Eigen、Sophus 和 GeographicLib 等库的编译环境,并通过编写一个简单的 “Hello World” 程序来验证配置的正确性。
0 任务
- 准备实验环境
- 获取opencv / eigen / sophus / geographiclib等库的源代码
- 编译并安装必要的软件包:CMake、GCC、G++等,并配置环境
- 编写一个简单的 C++ 程序来验证环境配置是否成功
1 准备实验环境
1.1 在虚拟机中安装Ubuntu Linux
我们的实验需要以下最低硬件要求:
- Intel/AMD x86_64兼容的CPU;
- 至少4核的CPU,运行频率高于2GHz;
- 至少12GB内存;
- 至少40GB的可用磁盘空间;
1.1.1 安装 Ubuntu 和 VMware
强烈建议使用Ubuntu Linux 24.04.x LTS作为实验环境的主要操作系统。
安装镜像可以从以下链接下载:
如果您使用的是 Microsoft Windows,请安装VMware,强烈推荐使用VMware Workstation Player 17.5.0 for Windows。该工具可以从以下链接下载:
VMware Workstation Player 17.5下载链接
1.1.2 检查虚拟化
VMware需要虚拟化指令以获得更高的性能,这对于OpenCV开发至关重要。打开Windows任务管理器(右键点击Windows任务栏,选择“任务管理器”),找到“性能”选项卡,点击“CPU”项并检查“虚拟化”项,如下所示。该项应显示“已启用”。
若显示“未启用”,请在文末查询解决措施
1.1.3 配置虚拟机
安装完 VMware Workstation 后,打开该软件按照以下配置设置一个新的虚拟机:
- 2+ CPU核心(最好是(N-2)核心,N为CPU物理核心数);
- 勾选 “虚拟化支持Intel VT-X/EPT或AMD-V/RVI” 选项以启用虚拟化指令加速;
- 8GB+内存(最好是 >12GB内存,如果您使用更多CPU核心编译OpenCV,编译过程将需要大量内存);
- 40GB磁盘空间(最好是60GB);
- 将CDROM分配给Ubuntu Linux 24.04.x安装镜像(iso文件);
启动虚拟机以开始安装过程。在安装过程的开始选择最小安装。
注意!新系统的语言必须选择英语。如果选择中文,系统将使用中文字符作为您的主目录名称,这会导致将代码放在工作目录下时出现严重问题。
1.2 在Ubuntu Linux下安装一些有用的工具
进入Ubuntu Linux桌面后,按 Ctrl+Alt+T 打开终端。
1.2.1 apt 安装工具
使用apt
安装我们需要的工具。必需的工具如下:
- git
- gcc
- make
- wget
- unzip
- g++
- cmake
- vim
sudo apt update
sudo apt install -y git gcc make wget unzip g++ cmake vim
1.2.2 下载VSCode
另一个有用的工具是Visual Studio Code(简称VSCode)。 可以从这里下载, 选择 “.deb” 包 .
以上操作均是在虚拟机中操作
下载VSCode后,在终端中找到deb文件,然后使用以下命令安装:
cd ~/Downloads
sudo dpkg -i ./code_1.xxxxxx_amd64.deb
-i 后面为你的 deb 文件所在路径
注意:Ubuntu软件(Snap商店)也可能提供VSCode安装,但该版本在显示OpenCV图像窗口时存在严重问题。请使用VSCode官方网站的deb包进行安装!
安装完VSCode后,需要在VSCode中安装一些扩展:
点击 VSCode 左侧边栏中图标,搜索 “ C/C++ Extension Pack” 并安装。该扩展包还包括 “ CMake ”和“ CMake Tools ” 扩展。
1.3 从源代码安装OpenCV、Eigen、Sophus、GeographicLib
注意:由于某些库需要其他包作为依赖项,请严格按照以下顺序安装软件包。
1.3.0 创建工作目录
首先,为我们的工作文件夹做准备。
打开 Linux 终端,使用以下命令创建工作目录。
mkdir -p ~/work/cv
该命令将在你的主目录下创建一个空白目录。
然后进入该工作目录:
cd ~/work/cv
1.3.1 安装Eigen
Eigen
是一个用于许多计算机视觉应用的线性代数库。由于一些 OpenCV 额外模块依赖此库,因此应首先安装它。
进入~/work/cv
,然后继续克隆Eigen
源代码。使用以下命令:
git clone https://git.tongji.edu.cn/ipmv/mirrors/eigen.git
克隆完成后,执行以下命令:
cd eigen
mkdir -p build
cd build
cmake ..
make -j4
sudo make install
1.3.2 安装libgtk
libgtk
是 OpenCV 在 Linux GUI上显示图像所需的库。在编译 OpenCV 之前安装libgtk
。
以下是详细步骤:
- 安装
libgtk2.0-dev
sudo apt install libgtk2.0-dev
- 安装
libcanberra-gtk-module
sudo apt install libcanberra-gtk-module
1.3.3 安装vtk库并更新OpenCV
vtk
库用于3D显示。
- 首先,安装
vtk
的依赖项,我们需要 OpenGL 库。使用以下命令安装:
sudo apt-get install libglu1-mesa-dev freeglut3-dev mesa-common-dev
- 下载vtk源代码并使用以下命令安装
viz
库:
cd ~/work/cv
从 git.tongji.edu.cn 下载vtk
源代码
git clone https://git.tongji.edu.cn/ipmv/mirrors/kitware-vtk.git
- 切换到 v9.3.0
cd kitware-vtk
git checkout v9.3.0
- 编译并安装
mkdir -p build
cd build
cmake ..
make -j4
sudo make install
1.3.4 安装 OpenCV 和 OpenCV-contrib
请注意,这些存储库包含这些项目的所有历史记录,当前(或HEAD)版本是最新的,但不适合我们的实验。我们需要选择指定的版本(或 git 系统中的BRANCH/TAG)。
使用以下命令克隆 OpenCV 源代码:
git clone https://git.tongji.edu.cn/ipmv/mirrors/opencv.git
cd opencv
git checkout 4.x
修改 OpenCV 的 CMakeLists 以兼容你安装的Eigen库:
修改~/work/cv/opencv
中的 CMakeLists.txt (你可以在终端中使用vim
或在Ubuntu桌面环境中使用文本编辑器),在 CMakeLists.txt 文件的前面添加以下两行:
include_directories("/usr/local/include/eigen3")
set(CMAKE_CXX_STANDARD 17)
然后下载opencv-contrib
源代码,这是 OpenCV 的额外库,我们稍后会使用这个库。
在文件夹中打开终端,例如~/work/cv
,使用git
克隆opencv-contrib
源代码:
git clone https://git.tongji.edu.cn/ipmv/mirrors/opencv_contrib.git
cd opencv_contrib
git checkout 4.x
完成这些步骤后,准备编译 OpenCV:
cd ~/work/cv/opencv
mkdir -p build
cd build
cmake -DOPENCV_EXTRA_MODULES_PATH=~/work/cv/opencv_contrib/modules ..
等待cmake
完成编译配置,你应该在cmake
输出信息中看到GTK
支持信息,如下所示:
然后输入命令:
make -j4
注意:“-j4”表示使用 4 个线程编译代码,根据你在 VMware 设置中的 CPU 核心数调整此数字。此过程将持续半小时左右,请耐心等待。请注意,如果使用 8 个线程进行编译,将消耗约 8GB+ 的内存,需要确保 VMware 中的 Ubuntu Linux 有足够的内存。
编译完成后,使用以下命令安装二进制文件和头文件:
sudo make install
默认情况下,OpenCV 将安装到/usr/local
目录,所有文件将复制到以下位置:
/usr/local/bin - executable files
/usr/local/lib - libraries (.so)
/usr/lib/cmake/opencv4 - cmake package
/usr/local/include/opencv4 - headers
/usr/local/share/opencv4 - other files (e.g. trained cascades in XML format)
请参考 https://docs.opencv.org/4.9.0/d7/d9f/tutorial_linux_install.html
1.3.5 安装fmt库
回到~/work/cv
,然后继续克隆fmt
源代码。使用以下命令:
git clone https://git.tongji.edu.cn/ipmv/mirrors/fmt.git
克隆完成后,执行以下命令:
cd fmt
mkdir -p build
cd build
cmake ..
make -j4
sudo make install
1.3.6 安装 Sophus
回到~/work/cv
,然后继续克隆 Sophus 源代码。使用以下命令:
git clone -b 1.22.10 --single-branch https://git.tongji.edu.cn/image_pro_and_cv/example_code/Sophus.git
克隆完成后,执行以下命令:
cd Sophus
mkdir -p build
cd build
cmake ..
make -j4
sudo make install
如果出现如下编译错误:
在Sophus
源代码文件夹中找到 “so3.hpp” 文件(例如~/work/cv/Sophus/sophus/so3.hpp
),使用文本编辑器编辑该文件。
将 include 行(第12-14行)从
#include <Eigen/src/Geometry/OrthoMethods.h>
#include <Eigen/src/Geometry/Quaternion.h>
#include <Eigen/src/Geometry/RotationBase.h>
修改为:
#include <Eigen/Geometry>
修改后,so3.hpp 文件应如下图所示:
如果遇到编译错误报告“array_bounds”或“maybe_uninitialized”,请修改CMakeLists.txt 以将警告级别从“错误”更改为“警告”。
在 CMakeLists.txt 中找到以下行:
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -Wextra ......")
修改此行以添加 g++ 的额外标志,应如下所示:
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -Wextra -Wno-maybe-uninitialized -Wno-array-bounds ......")
保存修改并重新运行 make -j4
.
1.3.7 安装GeographicLib
回到~/work/cv
,然后继续克隆 GeographicLib 源代码。使用以下命令:
git clone https://git.tongji.edu.cn/ipmv/mirrors/geographiclib.git
克隆完成后,执行以下命令:
cd geopraphiclib
mkdir -p build
cd build
cmake ..
make -j4
sudo make install
2 环境验证
编写一个 “Hello World” 项目来验证环境。
2.1 为你的第一个 OpenCV 项目创建工作空间
首先,为我们的项目创建一个空文件夹。
mkdir -p ~/work/lab0
cd ~/work/lab0
我们将使用CMake来管理项目,驱动编译器生成可执行程序。使用VSCode进行C++编码和调试。
使用搜索引擎或向DeepSeek寻求帮助,编写一个使用 OpenCV 的 C++ 演示项目,显示一个 GUI 窗口来展示 “Hello World”。内容应包括 “ Hello World ” 短语和你的学号或电子邮件地址。
2.2 向项目中添加源代码文件
在你的工作文件夹中添加一个名为“main.cpp”的新文件(例如~/work/lab0
)。以下是该任务的示例:
#include "opencv2/opencv.hpp"
int main(int argc, char *argv[])
{
cv::Mat image(240, 640, CV_8UC3, cv::Scalar(32,32,32));
cv::putText(image, "Hello World",cv::Point(80,160),cv::FONT_HERSHEY_SIMPLEX,2,cv::Scalar(255,255,255),1,8,false);
cv::imshow("Hello world", image);
cv::waitKey(0);
return EXIT_SUCCESS;
}
2.3 为项目添加 CMakeLists.txt
以下是用于编译控制的CMakeLists.txt文件:
cmake_minimum_required(VERSION 3.5.1)
project(hello_opencv)
set(compiler_options -Wall -Wextra -Wpedantic)
# 添加库
find_package(OpenCV 4 REQUIRED)
add_executable(${PROJECT_NAME}
main.cpp # 这里是你的源代码文件
)
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
target_compile_options(${PROJECT_NAME} PRIVATE ${compiler_options})
set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD_REQUIRED ON CXX_STANDARD 11)
2.3 如何在VSCode中使用CMake
-
使用 Ctrl+Shift+P调出 VSCode 命令面板,输入
CMake:Configure
以调用 cmake 生成 makefiles. -
调出 VSCode 命令面板并输入
CMake:Build
以编译源代码。 -
调出VSCode命令面板并输入
CMake:Debug
以进入调试模式。
注意:VSCode 无法弹出 imshow() 的弹出窗口,你可以在工作目录下的“build”子目录中运行你的应用程序。
2.4 修改代码以满足 2.1 中的要求
使用 OpenCV 的在线手册、搜索引擎或 DeepSeek 帮助你理解 2.2 源代码中使用的 OpenCV 函数。明确以下函数或 OpenCV 类的参数:
cv::Mat
cv::putText()
#include "opencv2/opencv.hpp"
int main(int argc, char *argv[])
{
cv::Mat image(240, 640, CV_8UC3, cv::Scalar(32, 32, 32));
cv::putText(image, "Hello OpenCV!", cv::Point(80, 120), cv::FONT_HERSHEY_SIMPLEX, 2, cv::Scalar(255, 255, 255), 1, 8, false);
cv::putText(image, "******@tongji.edu.cn", cv::Point(100, 200), cv::FONT_HERSHEY_SIMPLEX, 0.6, cv::Scalar(255, 255, 255), 1, 8, false);
cv::imshow("Hello OpenCV!", image);
cv::waitKey(0);
return EXIT_SUCCESS;
}
}
运行结果:
3 函数解释
cv::Mat
和 cv::putText
.
3.1 cv::Mat
类构造函数
函数功能:存储矩阵(含图像)
cv::Mat image(240, 640, CV_8UC3, cv::Scalar(32,32,32));
-
创建一个240px高、640px宽的灰色背景图像,其中颜色通道为BGR三通道。
-
创建一个
Mat
类型对象image
。 -
分配给它一个240 px 行、640 px 列的空间。
-
数据类型是
CV_8UC3
,即3通道(C3)8 bit 的无符号整型(8U,unchar)。 -
对矩阵(通道)进行初始化赋值,此处:B=32,G=32,R=32。
参数说明
参数顺序 | 参数示例 | 含义 |
---|---|---|
1 | 240 | 图像高度 |
2 | 640 | 图像宽度 |
3 | CV_8UC3 | 数据类型与通道数 |
8U = 8位无符号数 | ||
C3 = 3个颜色通道(BGR) | ||
4 | cv::Scalar(32, 32, 32) | 初始化颜色 |
3.2 cv::putText
函数
函数功能:在图像中某一位置显示文字
cv::putText(image, "Hello World",
cv::Point(80,160), cv::FONT_HERSHEY_SIMPLEX,
2, cv::Scalar(255,255,255), 1, 8, false);
在 image 图像的(80, 160) 位置绘制白色的 “Hello World” 文本,使用简单的字体(FONT_HERSHEY_SIMPLEX),大小为默认的两倍,线条粗细为 1,并且从左上角开始绘制。
参数说明
参数顺序 | 参数示例 | 含义 |
---|---|---|
1 | image | 显示文字所在图像 |
2 | “Hello World” | 显示文字字符串 |
3 | cv::Point(80,160) | 文字显示位置(坐标) |
4 | cv::FONT_HERSHEY_SIMPLEX | 字体类型 |
5 | 2 | 文本缩放因子,文字大小 |
6 | cv::Scalar(255,255,255) | 文本颜色(默认BGR通道) |
7 | 1 | 文本线条粗细 |
8 | 8 | Line Type线性线条类型 |
此处表示使用8-连通线,标准抗锯齿线条 | ||
9 | false | 图像原点位置左上角(true:左下角) |
4 问题与常见问题解答
- 由于旧版本的OpenCV(例如3.x)与C++17不兼容,强烈建议使用新版本。如果你想使用旧版本,请安装g++ 9.x。
-
软件包的备用链接
-
Eigen、vtk、opencv、opencv_contrib、sophus、geographiclib、fmt的备用存储库
- eigen: https://gitlab.com/libeigen/eigen.git
- vtk: https://gitlab.kitware.com/vtk/vtk.git
- opencv: https://github.com/opencv/opencv.git
- opencv_contrib: https://github.com/opencv/opencv_contrib.git
- sophus: https://github.com/strasdat/Sophus.git
- geographiclib: https://github.com/geographiclib/geographiclib.git
- fmt: https://github.com/fmtlib/fmt.git
-
关闭基于虚拟化的安全性
首先,进行排查
1. 任务管理器(win+X打开)-性能-CPU界面虚拟化为“已启用”状态,如下图:
2. Windows安全中心-设备安全性-内核隔离:内存完整性为“关闭”状态,本地安全机构保护为“关闭”状态
3. 关闭 Hyper-v 相关功能
Windows功能 - 启用或关闭Windows功能 - Hyper-V “关闭”、Vitual Machine Platform “关闭”、Windows虚拟机监控程序平台 “关闭”、适用于Linux的Windows子系统 “关闭”
- 关闭其他使用虚拟机的软件,如WSL、docker等
- 关闭基于虚拟化的安全性
Win+R打开运行,输入
msinfo32
,查看内核DMA保护、基于虚拟化的安全性状态
若基于虚拟化的安全性为开启状态,请进行以下操作:
首先,以管理员身份运行Windows终端输入以下命令:bcdedit /set hypervisorlaunchtype off
然后,下载微软关闭工具,详细操作优快云中查看方法四