openCV转换颜色空间,建立人体肤色模型

转载 2008年09月16日 23:26:00

台湾人的blog,ms是
http://finalevil.blogspot.com/search/label/0.4%EF%BC%9A%E7%A8%8B%E5%BC%8F-OpenCV%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98
 

[Introduction]I find some questions when using opencv today.The color-space convert function cvCvtColor seems problematic. I'm not sure.But when I convert the RGB to YCrCb,the result has error.

今天在寫一個很單純的Skin color modal,
用數學模型替人的皮膚顏色建立可以判斷的標準,這個顏色是人的皮膚 or 不是人的皮膚?
有各式各樣的方法來建立此一數學模型。

像是這篇用Gussian Modal(高斯分佈模型)
Face detection in color images using AdaBoost algorithm based on skin color information
來解釋皮膚的顏色分布。

或是這篇
Fuzzy System Learned Through Fuzzy Clustering and Support Vector Machine for Human Skin Color Segmentation
用Fuzzy和Support Vector Machine來切割出圖片中屬於人類皮膚的部分。

但是,這些方法都過於複雜容易影響整個人臉偵測與辨識的效率,造成人臉偵測無法在即時系統運作的問題。所以目前不考慮這些較為複雜的數學模型。

依照這篇論文的做法
Face Detection in Color Images using Wavelet Packet Analysis
我嘗試暫時先用簡單的不等式來替代膚色的截取。不等式內容如下:
6 

關於OpenCV的重點來了 = =

我要先將RGB的色彩轉換到對光照亮度比較不敏感的YCrCb空間,所以我直接使用OpenCV的cvCvtColor方法,但是我得到的結果卻與論文上轉換色彩空間的方法不一樣。
同樣是YCrCb難道有第二種算法?!!
因此找出來的膚色位置都不是正確的。

參考OpenCV中文論壇
對cvCvtColor的空間轉換是這樣解釋的
Y=0.299*R + 0.587*G + 0.114*B
Cr=(R-Y)*0.713 + 128
Cb=(B-Y)*0.564 + 128


但是我出來的問題卻是上面的公式不對,
我後來改用另一篇論文提供的公式如下:
1


雖然我覺得OpenCV在色彩空間轉換的function似乎有問題,但還是說明一下怎麼使用,
有興趣的朋友可以踹踹看,是不是正常work

記得先用cvLoadImage載入圖片到pImg
//建立三個單通道的圖片指標
IplImage* pCh[3];
for(int i=0;i<3;i++)
    pCh[i]=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,1);

//實際將pImg鐘的圖片,轉換到YCrCb色彩空間,並存在pYcc裡面
cvCvtColor(pImg,pYcc,CV_BGR2YCrCb);

//最後,我們可以把pYcc裡面有Y,Cb,Cr三個通道的資料,分解開來,
//存到pCh[0],pCh[1],pCh[2]
cvSplit(pYcc,pCh[0],pCh[1],pCh[2],0);

所以pCh[0],pCh[1],pCh[2]分別表示Y,Cr,Cb的數值。

總之最後有結果囉。以下是原圖:
Untitled-4 

下圖保留了被認定是膚色的部分:
5


結論:使用OpenCV的時候請小心,他也許不是錯的,但可能不是你要的。

OpenCV Using Python——RGB颜色空间中的统计肤色模型

RGB颜色空间中的统计肤色模型 1. 统计肤色模型简介         前几篇文章提出的参数肤色模型,由于参数值固定,所以来自测试图像集的分割误差有可能很大(不过在光照足够的情况下已经够用了)。对于光...
  • shadow_guo
  • shadow_guo
  • 2015年02月09日 12:52
  • 2253

OpenCV Using Python——RGB颜色空间中的肤色检测

RGB颜色空间中的肤色检测 1. 问题         很多相关文章中都会每每在肤色检测时都会提到:RGB颜色空间中肤色受光照影响,背光时肤色都是黑的,当然会受光照影响了。         之前像我这...
  • shadow_guo
  • shadow_guo
  • 2015年02月07日 11:36
  • 3935

YCbCr颜色空间下的一个简便的肤色模型

转自http://www.cnblogs.com/tornadomeet/archive/2012/12/05/2802428.html   前言    最近课题研究上想采用皮肤信息,但是个人...
  • hqh45
  • hqh45
  • 2014年03月27日 16:31
  • 3021

人脸--基于肤色模型的人脸检测研究

0 引言     在人脸检测领域,人脸特征的选取是基础与核心。目前主要的人脸检测方法可以分为基于特征的方法和基于统计的方法两大类。基于特征的方法可以处理较大尺度和视角变化的人脸检测问题,但其最大的困...
  • evsqiezi
  • evsqiezi
  • 2013年05月07日 09:28
  • 1345

opencv椭圆肤色模型人脸检测

void ellipse(Mat& img, Point center, Size axes, double angle, double startAngle, double endAngle, ...
  • electronic49
  • electronic49
  • 2017年03月15日 11:56
  • 556

OpenCV下肤色检测代码

先贴代码void cvSkinSegment(IplImage* img, IplImage* mask){ CvSize imageSize = cvSize(img->width, img->he...
  • scyscyao
  • scyscyao
  • 2010年04月09日 21:03
  • 17648

简单的基于YCrCb颜色空间的人脸检测(肤色)

简单的基于YCrCb颜色空间的人脸检测(肤色) 环境:Windows XP+MATLAB 2010b 基本思路: 1)将基于彩色空间的RGB模型转换为YCbCr模型(...
  • c_______
  • c_______
  • 2015年05月25日 10:41
  • 2183

利用人体肤色从图像中分割出人体区域的OpenCV代码

原理:YCbCr颜色空间是一种常用的肤色检测的色彩模型,其中Y代表亮度(为了消除光照的影响一般放弃亮度通道),Cr代表光源中的红色分量,Cb代表光源中的蓝色分量,人体的皮肤的颜色集中在色度的较小区域内...
  • wenhao_ir
  • wenhao_ir
  • 2016年07月23日 11:15
  • 2657

基于人脸检测的肤色采集以及两种常见肤色模型建模

#include "relativeFunction.h"int main() { //svmTest(); //neuralTest(); char imageFileDir...
  • zdx19880830
  • zdx19880830
  • 2015年05月21日 15:35
  • 2059

肤色检测算法 - 基于不同颜色空间简单区域划分的皮肤检测算法

本文涉及的很多算法,在网络上也有不少同类型的文章,但是肯定的一点就是,很多都是不配代码的,或者所附带的代码都是象征性的,速度慢,不优雅,不具有实用价值,本文努力解决这些问题。       文中各...
  • songhhll
  • songhhll
  • 2013年10月11日 10:40
  • 9675
收藏助手
不良信息举报
您举报文章:openCV转换颜色空间,建立人体肤色模型
举报原因:
原因补充:

(最多只允许输入30个字)