# Seal Processing - 印章处理模块

印章检测与处理的 C++ 模块，包含印章提取和边框移除功能。

## 环境要求

- **CMake** >= 3.10
- **MinGW-w64** (通过 MSYS2 安装)
- **OpenCV** >= 4.0 (通过 MSYS2 安装: `mingw-w64-x86_64-opencv`)

### 安装依赖（MSYS2）

```bash
pacman -S mingw-w64-x86_64-toolchain
pacman -S mingw-w64-x86_64-cmake
pacman -S mingw-w64-x86_64-opencv
```

---

## 项目结构

```
Final project/
├── image/                  # 测试图片目录
│   ├── 1.png
│   └── 2.png
│
└── c/                      # C++ 项目目录
    ├── CMakeLists.txt      # CMake 配置文件
    ├── build.bat           # 一键编译脚本
    ├── README.md           # 说明文档
    │
    ├── common.cpp          # 公共函数
    ├── common.h
    ├── image_utilities.cpp # 图像工具
    ├── image_utilities.h
    │
    ├── extract_seal_main/  # 印章提取模块
    │   ├── extract_seal_main.cpp
    │   ├── extract_seal_main.h
    │   ├── adjust_image.cpp
    │   ├── adjust_image.h
    │   ├── color_filter.cpp
    │   ├── color_filter.h
    │   ├── hsv_color.cpp
    │   ├── hsv_color.h
    │   ├── image_morphology.cpp
    │   ├── image_morphology.h
    │   └── test_extract_seal.cpp
    │
    └── remove_border/      # 边框移除模块
        ├── remove_border.cpp
        ├── remove_border.h
        ├── remove_border_main.cpp
        ├── remove_border_main.h
        └── test_remove_border.cpp
```

**编译后生成的目录（不会被 Git 追踪）：**
- `c/build/` - 编译输出目录，包含可执行文件
- `c/extract_seal_main/test_image/` - 印章提取测试输出
- `c/remove_border/test_image/` - 边框移除测试输出

---

## 编译

### 方法1：使用 build.bat（在 cmd.exe 中运行）

在 **命令提示符 (cmd)** 中运行：

```cmd
cd "c:\Users\用户名\Desktop\Final project\c"
build.bat
```

或在 **PowerShell** 中运行：

```powershell
cd "c:\Users\用户名\Desktop\Final project\c"
cmd /c .\build.bat
```

### 方法2：手动 CMake 编译（推荐）

```powershell
cd "c:\Users\用户名\Desktop\Final project\c"
mkdir build -ErrorAction SilentlyContinue
cd build
cmake .. -G "MinGW Makefiles" -DOpenCV_DIR="C:/msys64/mingw64/lib/cmake/opencv4"
cmake --build .
```

**注意：** 请将 `用户名` 替换为您的 Windows 用户名。

---

## 运行 test_extract_seal（印章提取）

### 功能
从图片中提取印章，输出裁剪后的印章图像。

### 运行命令

```powershell
cd "c:\Users\用户名\Desktop\Final project\c\build"
.\test_extract_seal.exe
```

### 程序会自动处理

**输入：**
- 从 `build/` 目录运行时，程序会扫描 `../../image/` 目录
- 即 `Final project/image/` 目录下的图片
- 支持格式：`.png`, `.jpg`, `.jpeg`, `.bmp`

**输出：**
- 自动保存在 `../extract_seal_main/test_image/` 目录
- 即 `Final project/c/extract_seal_main/test_image/` 目录
- 每个印章生成 3 个文件：
  - `seal_{图片名}_{序号}_cropped.png` - 原始裁剪区域
  - `seal_{图片名}_{序号}_ex_img.png` - 提取后的印章图像
  - `seal_{图片名}_{序号}_adj_img.png` - 校正后的印章图像

### 关于检测数据

程序内部已预设了 `1.png` 和 `2.png` 的印章检测数据（det）。如需使用其他图片，请参考"测试说明"章节。

---

## 运行 test_remove_border（边框移除）

### 功能
对提取的印章进行边框移除处理。

### 运行命令

```powershell
cd "c:\Users\用户名\Desktop\Final project\c\build"
.\test_remove_border.exe
```

---

## 测试说明

### 关于印章检测数据（det）

目前 C++ 程序**不包含印章检测功能**（即原 Python 项目 seal_ocr 中的 detect 部分）。

程序中使用的印章边框数据（det）是通过运行**原 Python 项目**获得后，在 C++ 代码中进行了硬编码设定。

**如需使用自己的测试图片：**
1. 使用原 Python 项目 seal_ocr 运行图片，获取检测数据（det）
2. 修改 C++ 测试文件中硬编码的 det 数据
3. 重新编译并运行程序

### 各测试程序的差异

| 测试程序 | 处理范围 | 检测数据 | 说明 |
|---------|---------|----------|------|
| `test_extract_seal.cpp` | 多张图片 | 预设 1.png, 2.png | 自动扫描 `image/` 目录，但仅对预设的图片有检测数据 |
| `test_remove_border.cpp` | 单张图片 | 预设 1.png | 仅处理 1.png，需要手动修改代码中的图片路径和 det 数据 |

**注意：** 两个测试程序都预设了检测数据（det），如需处理其他图片，需要先使用原 Python 项目获取 det 数据，然后修改代码。

---

## 快速开始

```powershell
# 1. 进入项目目录
cd "c:\Users\用户名\Desktop\Final project\c"

# 2. 编译（使用 CMake）
mkdir build -ErrorAction SilentlyContinue
cd build
cmake .. -G "MinGW Makefiles" -DOpenCV_DIR="C:/msys64/mingw64/lib/cmake/opencv4"
cmake --build .

# 3. 运行印章提取测试
.\test_extract_seal.exe

# 4. 运行边框移除测试
.\test_remove_border.exe
```

**注意：** 请将 `用户名` 替换为您的 Windows 用户名。

---

## 常见问题

### 1. `cd` 命令报错：找不到路径

**原因：** 路径中有空格 `Final project`

**解决：** 用引号包围路径
```powershell
cd "c:\Users\用户名\Desktop\Final project\c"
```

### 2. CMake 找不到 OpenCV

确保指定正确的 OpenCV 路径：
```powershell
cmake .. -G "MinGW Makefiles" -DOpenCV_DIR="C:/msys64/mingw64/lib/cmake/opencv4"
```

### 3. 编译失败

检查：
- MinGW-w64 是否已正确安装
- 环境变量 PATH 是否包含 `C:\msys64\mingw64\bin`

### 4. 运行时找不到 DLL

将 `C:\msys64\mingw64\bin` 添加到系统 PATH，或复制相关 DLL 到可执行文件目录。
