使用 C++/OpenCV 实现对图片中较暗肤色女生进行美白处理
·
实现思路:
- 加载图像和人脸检测器:加载需要处理的图片,并使用 OpenCV 提供的预训练 Haar Cascade 分类器进行人脸检测。
- 创建滑动条:创建一个滑动条,用于控制美白程度(即白色与原肤色融合的比例)。
- 美白处理与颜色融合:
- 对于检测到的每张人脸,提取该区域 (ROI - Region of Interest)。
- 创建一个与 ROI 大小相同的纯白色图像。
- 使用
cv::addWeighted函数将原 ROI 区域与白色图像进行加权融合。滑动条的值将决定白色的权重,原图的权重则是1.0 - 白色权重。这样可以在提亮肤色的同时,尝试保留一部分原始的纹理和特征。
- 显示结果:实时显示处理后的图像。
haarcascade_frontalface_alt.xml的文件你们百度找找这个是脸定位的文件

C++ 代码示例:
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/objdetect.hpp> // For CascadeClassifier
#include <iostream>
// 全局变量
cv::Mat originalImage, processedImage;
cv::CascadeClassifier faceCascade;
std::string faceCascadePath = "haarcascade_frontalface_alt.xml"; // Haar级联分类器文件路径
int whiteningAlpha = 20; // 滑动条初始值 (0-100)
const int MAX_ALPHA = 100;
const std::string windowName = "Skin Whitening";
// 图像处理函数
void applyWhitening(int, void*) {
if (originalImage.empty()) {
return;
}
processedImage = originalImage.clone();
std::vector<cv::Rect> faces;
// 将图像转换为灰度图以提高人脸检测效率
cv::Mat grayImage;
cv::cvtColor(originalImage, grayImage, cv::COLOR_BGR2GRAY);
cv::equalizeHist(grayImage, grayImage); // 直方图均衡化,有助于检测较暗图像中的人脸
// 检测人脸
faceCascade.detectMultiScale(grayImage, faces, 1.1, 3, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));
// 获取滑动条的alpha值 (0.0 - 1.0)
double alpha = static_cast<double>(whiteningAlpha) / MAX_ALPHA;
double beta = 1.0 - alpha;
for (const cv::Rect& faceRect : faces) {
// 获取人脸区域ROI
cv::Mat faceROI = processedImage(faceRect);
// 创建一个与ROI相同大小的纯白色图像
cv::Mat whiteLayer = cv::Mat(faceROI.size(), faceROI.type(), cv::Scalar(255, 255, 255));
// 对人脸区域进行加权融合
// P_blended = alpha * P_white + beta * P_original
cv::addWeighted(whiteLayer, alpha, faceROI, beta, 0.0, faceROI);
}
cv::imshow(windowName, processedImage);
}
int main(int argc, char** argv) {
// 检查是否提供了图片路径
if (argc < 2) {//这部分是命令行的形式打开对应图片,如果想简单点直接删掉这个if语句
std::cerr << "Usage: " << argv[0] << " <image_path>" << std::endl;
return -1;
}
std::string imagePath = argv[1];//如果删除了if语句然后argv[1]改成“./1.png”
originalImage = cv::imread(imagePath);
if (originalImage.empty()) {
std::cerr << "Error: Could not read image from " << imagePath << std::endl;
return -1;
}
// 加载Haar级联分类器用于人脸检测
// 你需要下载 haarcascade_frontalface_alt.xml 文件,并将其路径替换到 faceCascadePath
// 文件通常可以在 OpenCV 源码的 data/haarcascades/ 目录下找到
if (!faceCascade.load(faceCascadePath)) {
std::cerr << "Error: Could not load face cascade classifier from " << faceCascadePath << std::endl;
std::cerr << "Please download 'haarcascade_frontalface_alt.xml' and place it in the correct path." << std::endl;
std::cerr << "You can find it in the OpenCV source at opencv/data/haarcascades/" << std::endl;
return -1;
}
// 创建窗口和滑动条
cv::namedWindow(windowName, cv::WINDOW_AUTOSIZE);
cv::createTrackbar("Whitening %", windowName, &whiteningAlpha, MAX_ALPHA, applyWhitening);
// 初始处理并显示图像
applyWhitening(whiteningAlpha, nullptr);
cv::waitKey(0); // 等待按键后关闭窗口
cv::destroyAllWindows();
return 0;
}
Markdown 说明文档
# 基于 OpenCV 的 C++ 肤色美白程序
该程序旨在使用 C++ 和 OpenCV 库对图像中人物的肤色进行美白处理,特别适用于肤色较暗的情况。它通过人脸检测定位面部区域,并利用颜色融合技术实现可调节的美白效果,同时尽量保留面部特征。
## 功能特性
1. **人脸检测**:使用 OpenCV 的 Haar Cascade 分类器检测图像中的人脸区域。
2. **肤色美白**:对检测到的人脸区域进行美白处理。
3. **滑动条调控**:提供一个滑动条,用户可以动态调整美白的强度(即白色与原始肤色的融合比例)。
4. **特征保留**:通过将白色与原始肤色进行加权平均融合,而非简单地提高亮度,旨在提亮肤色的同时,减少细节的丢失。
## 工作原理
1. **加载资源**:
* 程序首先加载用户指定的输入图像。
* 加载预训练的 Haar Cascade 分类器 XML 文件 (`haarcascade_frontalface_alt.xml`) 用于人脸检测。
2. **人脸检测**:
* 将彩色图像转换为灰度图像,并进行直方图均衡化,以提高在不同光照条件下人脸检测的准确性和鲁棒性。
* 调用 `faceCascade.detectMultiScale()` 函数在灰度图上检测人脸,返回包含人脸位置和大小的矩形框列表。
3. **美白与融合处理** (`applyWhitening` 函数):
* 该函数在滑动条数值改变时被调用。
* 遍历检测到的每个人脸矩形框:
* 从原始图像中提取出对应的人脸区域 (ROI)。
* 创建一个与该 ROI 大小和类型完全相同的纯白色图像层 (`cv::Scalar(255, 255, 255)`)。
* 获取当前滑动条设定的美白比例 `alpha` (范围从 0.0 到 1.0)。原始肤色的融合比例 `beta` 计算为 `1.0 - alpha`。
* 使用 `cv::addWeighted()` 函数将白色图像层和原始人脸 ROI 进行加权融合:
`blended_pixel = alpha * white_pixel + beta * original_pixel`
这个操作会直接修改人脸 ROI 区域的像素值。
* 显示处理后的图像。
4. **用户交互**:
* 程序创建一个名为 "Skin Whitening" 的窗口。
* 窗口中包含一个名为 "Whitening %" 的滑动条,范围从 0 到 100。用户拖动滑动条即可实时看到美白效果的变化。
## 如何编译与运行
### 依赖项
* **OpenCV 库** (版本 3.x 或 4.x)
* **C++ 编译器** (如 GCC, Clang, MSVC)
* **CMake** (推荐,用于管理编译过程)
* **`haarcascade_frontalface_alt.xml` 文件**:这是 OpenCV 提供的人脸检测模型文件。你需要从 OpenCV 的官方源码库 (通常在 `opencv/data/haarcascades/` 目录下) 下载它,并将其放在程序可以访问的路径(代码中默认为与可执行文件同目录,或修改 `faceCascadePath` 变量指定完整路径)。
### 编译步骤 (使用 CMake 和 GCC/Clang 示例)
1. **创建 `CMakeLists.txt` 文件**:
```cmake
cmake_minimum_required(VERSION 3.10)
project(SkinWhiteningApp)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(SkinWhiteningApp main.cpp) # 假设你的源文件名是 main.cpp
target_link_libraries(SkinWhiteningApp ${OpenCV_LIBS})
```
2. **将 C++ 代码保存为 `main.cpp`** (或你在 `CMakeLists.txt` 中指定的文件名)。
3. **下载 `haarcascade_frontalface_alt.xml`** 并将其放置在与 `main.cpp` 相同的目录,或者修改代码中 `faceCascadePath` 的路径。
4. **编译**:
打开终端或命令行,进入代码所在目录,然后执行以下命令:
```bash
mkdir build
cd build
cmake ..
make
```
5. **运行**:
编译成功后,在 `build` 目录下会生成可执行文件 `SkinWhiteningApp` (或 `SkinWhiteningApp.exe` on Windows)。
```bash
./SkinWhiteningApp /path/to/your/image.jpg
```
将 `/path/to/your/image.jpg` 替换为你要处理的实际图片路径。
## 注意事项与潜在改进
* **Haar Cascade 文件路径**:确保 `haarcascade_frontalface_alt.xml` 文件路径正确,否则人脸检测会失败。
* **光照条件**:人脸检测和美白效果可能受图像光照条件影响。对于非常暗或光照不均的图像,效果可能需要调整。
* **特征保留的局限性**:虽然 `addWeighted` 尝试融合颜色,但过高的美白强度仍可能导致部分细节(如痣、细微的皮肤纹理)变淡或丢失。
* **更精确的皮肤分割**:当前方法是对整个人脸矩形框进行处理。更高级的方法可以先进行皮肤区域分割(例如基于颜色空间的分割,如 HSV 或 YCbCr),然后仅对皮肤区域进行美白,这样可以避免美白眼睛、眉毛、头发等非皮肤区域,效果会更自然。
* **高级美白算法**:可以研究更复杂的美白算法,如基于双边滤波的美白(在提亮的同时保持边缘),或在 LAB 颜色空间中调整 L (亮度) 通道等。
* **性能**:对于非常高分辨率的图像或视频流处理,可能需要进一步优化。
该程序提供了一个基础的肤色美白框架,你可以根据具体需求进行扩展和改进。
使用说明:
-
准备环境:
- 确保你已经安装了 OpenCV 库,并且配置好了 C++ 开发环境(如 Visual Studio, g++, Clang 等)。
- 下载
haarcascade_frontalface_alt.xml文件。你可以从 OpenCV 的 GitHub 仓库 (opencv/data/haarcascades/) 找到它。将此文件放在你的项目目录中,或者修改代码中的faceCascadePath变量指向其正确位置。
-
编译代码:
- 将上面的 C++ 代码保存为
.cpp文件(例如skin_whitening.cpp)。 - 使用你的 C++ 编译器编译代码,并链接 OpenCV 库。例如,使用 g++:
(如果你使用的是 OpenCV 3,将g++ skin_whitening.cpp -o skin_whitening $(pkg-config --cflags --libs opencv4)opencv4改为opencv)
或者使用 CMake(推荐,如 Markdown 中所述)。
- 将上面的 C++ 代码保存为
-
运行程序:
- 在命令行中运行编译好的可执行文件,并提供图片路径作为参数:
./skin_whitening path_to_your_image.jpg - 程序会打开一个窗口显示图片,窗口上方会有一个滑动条。拖动滑动条即可调整美白程度。
- 在命令行中运行编译好的可执行文件,并提供图片路径作为参数:
这个方案应该能满足你的基本需求。如果需要更精细的效果,可能需要引入更复杂的皮肤检测算法和图像处理技术。
更多推荐



所有评论(0)