这是本人大一时, C++ 的课程设计。
本项目是一个基于 C++ 和 OpenCV 库开发的遥感图像处理命令行工具。程序提供了完整的交互式菜单界面,支持多种遥感图像处理操作,包括图像信息的查看、统计分析、直方图显示、几何变换(旋转、缩放)、滤波处理等功能。程序采用面向对象的设计思想,具有良好的代码结构和可扩展性。
| 功能命令 | 功能说明 |
|---|---|
| X - Exit | 退出程序 |
| O - Open | 打开影像文件 |
| C - Close | 关闭当前图像 |
| I - Information | 输出当前图像的路径、行列值、波段数、数据类型、排列方式等信息 |
| S - Statistics | 输出图像数据统计量(最小值、最大值、均值、标准差) |
| B - SaveData | 保存图像的统计信息到文件中 |
| H - Histogram | 输出图像的直方图 |
| D - DisplayImage | 显示图像(支持灰度和彩色显示,支持线性拉伸) |
| R - Rotate | 图像旋转,输入角度逆时针 |
| Z - Zoom | 图像缩放,输入比例尺 |
| F - Filter | 输入滤波核,输出滤波后图像 |
| A - Save as | 输入保存的文件路径,输出图像为二进制文件 |
| ? - Help | 输出帮助信息 |
- 编程语言:C++20
- 图像处理库:OpenCV 4.12.0
- 构建系统:CMake 3.20+
- 开发工具:VSCode + clangd / CLion
- 支持平台:Windows、Linux
- CMake 3.20 或更高版本
- C++20 兼容的编译器(GCC、Clang 或 MSVC)
- OpenCV 4.12.0 或更高版本
-
克隆或下载项目到本地
-
创建构建目录并配置 CMake:
# 使用 Ninja 构建器(推荐)
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
# 或使用 Unix Makefiles
cmake -B build -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug
# 或在 Windows 上使用 MSVC
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl- 编译项目:
cmake --build build -j12- 运行程序:
# Windows
build\bin\my_program.exe
# Linux/macOS
./build/bin/my_program############ Remote Sensing Image Process Tools ############
# X – Exit 退出程序
# O – Open 打开影像文件
# C – Close 关闭当前图像
# I – Information 输出当前图像的路径、行列值、波段数、数据类型、排列方式等信息
# S – Statistics 输出图像数据统计量,若文件未打开,输出提示
# B - SaveData 保存图像的统计信息到文件中
# H – Histogram 输出图像的直方图
# ? – Help 输出本信息
# D - DisplayImage 显示图像
# R – Rotate 图像旋转,输入角度逆时针
# Z – Zoom 图像缩放,输入比例尺
# F - Filter 输入滤波核,输出滤波后图像
# A – Save as 输入保存的文件路径,输出图像为二进制文件
###########################################################
####################################请输入您的选择:O
请输入图像文件路径:data/gray.png
读取图像文件成功!
####################################请输入您的选择:I
路径: data/gray.png
行: 512
列: 512
波段: 1
数据类型: 0 => 8-bit 无符号整数
排列方式: 灰度图像####################################请输入您的选择:H程序会弹出窗口显示图像的直方图。
####################################请输入您的选择:R
请输入旋转角度(逆时针为正):45程序会显示旋转后的图像,并询问是否更新图像数据。
Histogram:标签列,当前是哪一个波段
| 表头名称 | 全称 | 解释 |
|---|---|---|
| DN | Digital Number | 数字量化值(即像素的亮度级)。对于 8 位图,范围是 0-255。它代表"这是哪个亮度等级"。 |
| Npts | Number of Points | 像素点数。在该亮度等级(DN)下,图像中一共有多少个像素点。 |
| Total | Cumulative Total | 累计点数。从亮度 0 到当前亮度 DN 的所有像素点总和。最后一行对应的 Total 应该等于图像总像素数。 |
| Percent | Percentage | 当前百分比。该亮度级的像素点数占全图总像素数的比例。 |
| Acc Pct | Accumulated Percentage | 累计百分比。到当前亮度为止,所有像素占全图的比例。用于观察图像对比度分布。 |
.
├── CMakeLists.txt
├── README.md
├── cmake_build_debug.sh
├── data
│ ├── LinearDisp.png
│ ├── filter.png
│ ├── gray.png
│ ├── image_data.txt
│ ├── info.txt
│ └── test
│ ├── 03_basic_info.txt
│ ├── 03_hist_info_1.txt
│ ├── 03_hist_info_2.txt
│ └── 03_info.txt
├── format_count.sh
├── include
│ ├── image.h
│ ├── menu.h
│ └── utils.h
├── lib
│ ├── CMakeLists.txt
│ ├── image.cpp
│ ├── menu.cpp
│ └── utils.cpp
├── src
│ ├── CMakeLists.txt
│ └── main.cpp
└── test
├── CMakeLists.txt
├── test01.cpp
├── test02.cpp
├── test03.cpp
└── test04.cppfile(GLOB ...)
推荐:
set(SOURCES
main.cpp
utiles/utiles.cpp
...
)
add_executable(myApp ${SOURCES})
- CMake 文档明确指出: "We do not recommend using GLOB to collect a list of source files from your source tree. If no CMakeLists.txt file changes when a source is added or removed then the generated build system cannot know when to ask CMake to regenerate."
include_directories(${YoUR_DIRECToRY})
link_directories(${YOUR_DIRECTORY})
推荐:
target_include_directories(myLib PRIVATE include/)
target_link_libraries(myApp PRIVATE myLib)
Ninja的构建速度很快。
如果采用的是 LLVM:
cmake -B build -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++如果采用的是 GNU:
cmake -B build -G Ninja -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++如果采用的是 MSVC:
cmake -B build -G Ninja -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl如果只想编译 src 目录下的代码文件:
cmake --build build --target my_program -j12这里的
my_program与src/CMakeLists.txt下的add_executable(my_program ${ALL_SRCS})相对应。
下面是可能在编写代码时遇到的问题,以及对应的解决办法。
Windows 的控制台编码一般采用的是 GB2312 编码的,但源代码编码采用的是 UTF-8 编码(不建议把源代码文件编码改为 GB2312 格式!),所以当有中文在控制台输出时,会产生乱码。解决方法如下:
- 方式一:如果使用的是 cmd,在每次从终端执行可编译好的程序之前,执行:
chcp 65001执行完后,再执行程序就不会乱码。
- 方式二:如果使用的是 PowerShell,可以修改配置文件:
打开配置文件(如果没有的话,会创建):
notepad $PROFILE在配置文件中写入:
# 设置默认编码为 UTF-8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
[Console]::InputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
# 设置环境变量,让子进程也使用 UTF-8
$env:PYTHONIOENCODING = "utf-8"修改完毕后,重启 PowerShell 即可。
如果是在 VS 中运行程序,因为默认打开的是 cmd,所以建议在代码 main 函数开头添加:
int main(){
// 设置控制台为 UTF-8
SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);
// 其它代码......
}如果采用 MSVC 编译,需要在 CMakeLists.txt 中给目标程序添加编译选项:
# MSVC UTF-8 支持
if(MSVC)
target_compile_options(my_app PRIVATE /utf-8)
endif()在 VSCode + clangd 配置下,可能会出现无法找到标准库头文件的情况,导致 clangd 报错,但是编译是可以通过的。一般单独分别安装 llvm 和 mingw 时,会出现这个错误。这个错误是因为 clangd 无法找到 MinGW 的标准库头文件路径。虽然你生成了
compile_commands.json,但里面的编译器是 MinGW 的g++.exe,而 clangd 需要知道这些头文件在哪里。
其问题根源是 clangd 和 MinGW 是两个不同的工具链:
- clangd 基于 LLVM/Clang,默认在 MSVC 或自身 libc++ 环境下查找头文件
- MinGW 使用 GCC 的 libstdc++,头文件路径不同
下载:winlibs
选择 UCRT runtime 版并且包含有 LLVM/Clang/LLD/LLDB 的下载。
比如我这里使用的是 CLion 集成的 mingw。
在 VS Code 的 settings.json 中添加:
{
"clangd.arguments": [
"--compile-commands-dir=${workspaceFolder}/build", // 指定 compile_commands.json 所在目录
"--query-driver=C:/Apps/CLion 2025.3.2/bin/mingw/bin/g++.exe", // 查询指定编译器的系统 include 路径
"--background-index", // 后台索引整个项目,加速代码跳转
"--header-insertion=iwyu", // 自动插入头文件时遵循 "Include What You Use" 原则
"--completion-style=bundled", // 代码补全风格:打包式
"--pch-storage=memory", // 预编译头文件存储在内存中
"--cross-file-rename", // 启用跨文件重命名功能
"--enable-config", // 允许从 .clangd 文件读取配置
],
}关键参数:
--query-driver:告诉 clangd 查询指定编译器的系统 include 路径
再在项目根目录下创建 .clangd 文件,在里面手动指定 MinGW 的 C++ 标准库路径:
CompileFlags:
Add:
- -std=c++20
- -IC:/Apps/CLion 2025.3.2/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++
- -IC:/Apps/CLion 2025.3.2/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/x86_64-w64-mingw32
- -IC:/Apps/CLion 2025.3.2/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include
- -IC:/Apps/CLion 2025.3.2/bin/mingw/include
- -IC:/Apps/CLion 2025.3.2/bin/mingw/x86_64-w64-mingw32/include
Compiler: C:/Apps/CLion 2025.3.2/bin/mingw/bin/g++.exe把上面的路径改成你自己的。
可以尝试直接用 Clang 编译,避免工具链混用:
# 在 CMake 配置时指定 Clang
cmake -B build -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Debug确保 clang++ 能找到 MinGW 的 libstdc++,或使用 Clang 自带的 libc++。
有时候不可避免得要用到 MSVC 编译器,因为网上有不少预编译好的 Windows 第三方库,都是用的 MSVC 编译器。
下载后 VS 时(比如下载的是 VS 2022 Community),会自动安装 Developer Command Prompt for VS 2022 和 Developer PowerShell for VS 2022,这两个终端集成了 MSVC 编译器的环境变量。在该终端中使用指令 where.exe cl 会有如下输出:
PS C:\Apps\Microsoft Visual Studio\2022\Community> where.exe cl
C:\Apps\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\Hostx64\x64\cl.exe打开 Developer PowerShell for VS 2022,然后用 cd 命令进入到项目根目录,输入:
# 打开 VSCode
code .
# 或者打开 CLion
clion64.exe .这样打开的 IDE 就会继承 Developer PowerShell for VS 2022 中的环境。
前提是要把 VSCode 和 CLion 添加到环境变量中。这里建议使用 Developer PowerShell for VS 2022 而不是 Developer Command Prompt for VS 2022,因为前者的命令行功能更强大。
在编译时指定编译器:-DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl。
如果使用 MSVC 生成器(Visual Studio Generator),是不会生成 compile_commands.json 文件的:
cmake -B build -G "Visual Studio 17 2022" -DCMAKE_BUILD_TYPE=Debug因此,除非要使用 VS 进行开发,其他情况生成器请选择 Ninja 或者 Unix Makefiles。