Skip to content

loskyertt/RSCmd

Repository files navigation

1. 遥感图像处理程序

这是本人大一时, C++ 的课程设计。

1.1 项目简介

本项目是一个基于 C++ 和 OpenCV 库开发的遥感图像处理命令行工具。程序提供了完整的交互式菜单界面,支持多种遥感图像处理操作,包括图像信息的查看、统计分析、直方图显示、几何变换(旋转、缩放)、滤波处理等功能。程序采用面向对象的设计思想,具有良好的代码结构和可扩展性。

1.2 主要功能

功能命令 功能说明
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 输出帮助信息

1.3 技术栈

  • 编程语言:C++20
  • 图像处理库:OpenCV 4.12.0
  • 构建系统:CMake 3.20+
  • 开发工具:VSCode + clangd / CLion
  • 支持平台:Windows、Linux

1.4 编译和运行

前置要求

  • CMake 3.20 或更高版本
  • C++20 兼容的编译器(GCC、Clang 或 MSVC)
  • OpenCV 4.12.0 或更高版本

编译步骤

  1. 克隆或下载项目到本地

  2. 创建构建目录并配置 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
  1. 编译项目:
cmake --build build -j12
  1. 运行程序:
# Windows
build\bin\my_program.exe

# Linux/macOS
./build/bin/my_program

1.5 使用示例

示例 1:查看图像信息

############ 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 无符号整数
排列方式: 灰度图像

示例 2:显示图像直方图

####################################请输入您的选择:H

程序会弹出窗口显示图像的直方图。

示例 3:图像旋转

####################################请输入您的选择:R
请输入旋转角度(逆时针为正):45

程序会显示旋转后的图像,并询问是否更新图像数据。

1.6 直方图数据说明

Histogram:标签列,当前是哪一个波段

表头名称 全称 解释
DN Digital Number 数字量化值(即像素的亮度级)。对于 8 位图,范围是 0-255。它代表"这是哪个亮度等级"。
Npts Number of Points 像素点数。在该亮度等级(DN)下,图像中一共有多少个像素点。
Total Cumulative Total 累计点数。从亮度 0 到当前亮度 DN 的所有像素点总和。最后一行对应的 Total 应该等于图像总像素数。
Percent Percentage 当前百分比。该亮度级的像素点数占全图总像素数的比例。
Acc Pct Accumulated Percentage 累计百分比。到当前亮度为止,所有像素占全图的比例。用于观察图像对比度分布。

2. 项目结构

.
├── 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.cpp

3. CMake 优化指南

3.1 最小化 GLOB 操作

file(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."

3.2 使用现代 CMake

include_directories(${YoUR_DIRECToRY})

link_directories(${YOUR_DIRECTORY})

推荐:

target_include_directories(myLib PRIVATE include/)
target_link_libraries(myApp PRIVATE myLib)

3.3 使用 Ninja

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

3.4 指定目标编译

如果只想编译 src 目录下的代码文件:

cmake --build build --target my_program -j12

这里的 my_programsrc/CMakeLists.txt 下的 add_executable(my_program ${ALL_SRCS}) 相对应。


4. 一些问题

下面是可能在编写代码时遇到的问题,以及对应的解决办法。

4.1 Windows 下编码问题

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()

4.2 无法找到头文件

VSCode + clangd 配置下,可能会出现无法找到标准库头文件的情况,导致 clangd 报错,但是编译是可以通过的。一般单独分别安装 llvm 和 mingw 时,会出现这个错误。这个错误是因为 clangd 无法找到 MinGW 的标准库头文件路径。虽然你生成了 compile_commands.json,但里面的编译器是 MinGW 的 g++.exe,而 clangd 需要知道这些头文件在哪里。

其问题根源是 clangd 和 MinGW 是两个不同的工具链:

  • clangd 基于 LLVM/Clang,默认在 MSVC 或自身 libc++ 环境下查找头文件
  • MinGW 使用 GCC 的 libstdc++,头文件路径不同

4.2.1 方案 1:使用集成有 llvm 的 mingw

下载:winlibs

选择 UCRT runtime 版并且包含有 LLVM/Clang/LLD/LLDB 的下载。

4.2.2 方案 2:配置 clangd 参数

比如我这里使用的是 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

把上面的路径改成你自己的。

4.2.3 方案 3:改用 Clang 编译器

可以尝试直接用 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++。

4.3 使用 MSVC 编译器

有时候不可避免得要用到 MSVC 编译器,因为网上有不少预编译好的 Windows 第三方库,都是用的 MSVC 编译器。

下载后 VS 时(比如下载的是 VS 2022 Community),会自动安装 Developer Command Prompt for VS 2022Developer 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。

About

遥感影像处理系统,C++ & OpenCV 实现(CUG-C++课程设计)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors