OpenCV 基于色彩直方图进行肤色检测
色彩直方图是统计不同色彩在图像中的像素个数。例如,下图的猫咪在RGB色彩空间中每通道的灰度直方图(线条的颜色与其通道相对应)。
将图像转为HSV色彩空间(Hue:色调;Saturation:饱和度;Value:亮度),我们可以更稳定地提取特定的颜色。本示例采用HSV色彩空间的H、S通道来进行颜色提取。H、S通道下的色彩直方图二维的展现形式如下(竖列为Hue通道,横行为Saturation通道,图像中的像素亮度越高,表明该色彩在原始图像中出现的频次越高):
程序执行过程:
- 截取若干张不同肤色的图片,最好覆盖常见的所有肤色(如下图);
- 对所有肤色的图片一起做色彩直方图(利用OpenCV中的calcHist函数);
- 新建一个与待检测图片同尺寸的灰度图片,找到待检测图片中每颗像素点的颜色在色彩直方图中对应栅格的数值(即统计中出现的次数),并将该数值赋值予新建灰度图片中与该检测像素同位置的像素(利用OpenCV中的calcBackProject函数)。下图是效果展示(图像中像素亮度越高,待检测图像该位置处是肤色的概率越大):
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <math.h>void calcBackProject_demo() {int num_srcs = 6;vector<Mat> hsv_rscs;for (int i=1; i<num_srcs+1; i++) {Mat src = imread("./skin_"+ to_string(i) +".jpg");if (src.empty()) {cout << "Failed to load src image ..." << endl;}if (src.rows > 500 || src.cols > 500) {pyrDown(src, src);}Mat hsv_src;cvtColor(src, hsv_src, COLOR_BGR2HSV);hsv_rscs.push_back(hsv_src);}Mat dest = imread("./skin_test.png");if (dest.empty()) {cout << "Failed to load dest image ..." << endl;}Mat hsv_dest, hist;cvtColor(dest, hsv_dest, COLOR_BGR2HSV);int bin_w = 10;const int channels[] = {0,1};const int histSize[] = {static_cast<int>(ceil(180/bin_w)),static_cast<int>(ceil(256/bin_w))};float h_range[] = {0,180};float s_range[] = {0,256};const float* ranges[] = {h_range, s_range};hist.create(histSize[0], histSize[1], CV_32F);Mat hist_tmp;for (int i=0; i<num_srcs; i++) {calcHist(&hsv_rscs[i], 1, channels, Mat(), hist_tmp, 2, histSize, ranges);add(hist, hist_tmp, hist);}Mat histImg = Mat::zeros(histSize[0]*bin_w, histSize[1]*bin_w, CV_8UC1);normalize(hist, hist, 0, 255, NORM_MINMAX);double max, min;minMaxLoc(hist, &min, &max);cout << "rows: " << hist.rows << "\t" << "cols: " << hist.cols << "\t" << "max: " << max << "\t" << "min: " << min << endl << endl;
// cout << hist << endl << endl;for (int i=1; i<=histSize[0]; i++) {for (int j=1; j<=histSize[1]; j++) {rectangle(histImg, Point((j-1)*bin_w, (i-1)*bin_w), Point(j*bin_w, i*bin_w), saturate_cast<int>(hist.at<float>(i-1,j-1)), -1);}}imshow("histImg", histImg);Mat backProj;calcBackProject(&hsv_dest, 1, channels, hist, backProj, ranges);imshow("backProj", backProj);waitKey(0);destroyAllWindows();
}int main(int argc, char** argv){calcBackProject_demo(); return 0;
}
OpenCV 基于色彩直方图进行肤色检测相关推荐
- OpenCV基于Python霍夫圆检测—标准霍夫圆检测
标准霍夫圆检测 1. 简介 2. 标准霍夫圆检测 2.1 情形一 2.2 情形二 2.3 情形三 3. 程序演示 4. 结尾 参考资料 1. 简介 1972年,R. D. Duda和P. E. Har ...
- 基于椭圆模型的肤色检测
算法思想:主要判断YCrCb空间中以(Cr, Cb)为坐标的点是否落在肤色椭圆内,如果在椭圆内,则为肤色点. 注:RGB空间转换为YCrCb空间时要以为坐标(Cb, Cr),BGR空间转换为YCrCb ...
- OpenCV基于Python霍夫圆检测—基于梯度的霍夫圆检测
基于梯度的霍夫圆检测 1. 回顾与目标 2. 基于梯度的霍夫圆检测 2.1 问题分析 2.2 基于梯度的霍夫圆检测步骤 3. 基于梯度的霍夫圆检测函数HoughCircles 3.1 函数HoughC ...
- 基于椭圆模块的肤色检测
前言 最近课题研究上想采用皮肤信息,但是个人总是对皮肤信息应用在目标检测和目标识别上有排斥,认为皮肤信息完全不足以胜任这个工作.其实计算机视觉的最终实现是一个长期的过程,是AI领域一个经典的问 ...
- OpenCV基于dlib进行人脸关键点检测(摄像头)
1. dlib.get_frontal_face_detector()获取人脸检测器 2. dlib.shape_predictor()预测人脸关键点 人脸关键点模型,下载地址: http://dli ...
- python opencv 肤色检测
附上我自己的实例代码 基于运动信息和肤色检测的手位置检测 基于深度学习的asl手语识别例程 1 椭圆肤色检测模型 原理:将RGB图像转换到YCRCB空间,肤色像素点会聚集到一个椭圆区域.先定义一个椭圆 ...
- 【matlab 图像处理】 肤色检测
肤色检测 肤色是人类皮肤重要特征之一,在检测人脸或手等目标时常采用肤色检测的方法,将相关区域从图像中分割出来. 肤色检测方法: 肤色检测方法有很多,但无论是基于不同的色彩空间还是不同的肤色模型,其根本 ...
- 计算机视觉之利用颜色进行肤色检测(基于OpenCV自带库函数)
概述: 在对待物体做初步检测时,颜色信息非常有用.比如说辅助驾驶程序中的路标检测功能,就要凭借标准路标的颜色快速识别可能是路标信息.另一个例子是肤色检测,检测到的皮肤区域可以作为图像中有人存在的标志. ...
- Opencv暑期历程--Day10(6种肤色检测方法,YCrCb肤色模型解释,再理解一遍掩模)
从一篇文章了解到,肤色检测主要有以下七种方法: RGB color space Ycrcb之cr分量+otsu阈值化 YCrCb中133<=Cr<=173 77<=Cb<=12 ...
最新文章
- Leetcode 4.28 Tree Easy
- 深入理解abstract class和interface
- 爱上经典之《蜗牛与黄鹂鸟》
- MySQL面试 - 读写分离
- 以太坊服务器是什么_OKEX区块链60讲 | 第33集:什么是以太坊?
- win10+Ubuntu16.04 LTS双系统完美教程
- 广西小学计算机教案上册,广西三年级信息技术教案
- 使用Java复制文件及显示进度
- vivo x6plus支持html,vivo x6plus手机USB驱动
- 关于MSXML3.dll与MSXML6.dll
- 基于车牌形状和颜色的车牌定位
- UVA - 10158 War
- 互联网日报 | 全国版消费券今日起开抢;微信搜一搜正式开放服务搜索接入;高德打车上线“考生专车”服务...
- cmdb自动发现mysql_干货 | EasyOps 的CMDB主机自动发现方案
- 转载:简明 GPG 概念
- 局域网三大攻击工具的攻击原理及其防范
- God.Game 漏洞复盘:跑路还是黑客攻击?
- python使用turtle画五星红旗!
- Adaptive Icons - Android O 自适应图标简单用法
- 加快系统启动速度的技巧