OpenCV肤色检测

前三种方式转载:http://blog.csdn.net/onezeros/article/details/6342567

 

第一种:RGB color space

第二种:RG color space

第三种:Ycrcb之cr分量+otsu阈值化

第四种:YCrCb中133<=Cr<=173 77<=Cb<=127

第五种:HSV中 7<H<29

 下一步需要滤波操作 因为检测结果中有许多瑕疵

[cpp] view
plain
copy

  1. #include "highgui.h"     
  2. #include "cv.h"     
  3.     
  4. // skin region location using rgb limitation     
  5. void SkinRGB(IplImage* rgb,IplImage* _dst)    
  6. {    
  7.     assert(rgb->nChannels==3&& _dst->nChannels==3);    
  8.     
  9.     static const int R=2;    
  10.     static const int G=1;    
  11.     static const int B=0;    
  12.     
  13.     IplImage* dst=cvCreateImage(cvGetSize(_dst),8,3);    
  14.     cvZero(dst);    
  15.     
  16.     for (int h=0;h<rgb->height;h++) {    
  17.         unsigned char* prgb=(unsigned char*)rgb->imageData+h*rgb->widthStep;    
  18.         unsigned char* pdst=(unsigned char*)dst->imageData+h*dst->widthStep;    
  19.         for (int w=0;w<rgb->width;w++) {    
  20.             if ((prgb[R]>95 && prgb[G]>40 && prgb[B]>20 &&    
  21.                 prgb[R]-prgb[B]>15 && prgb[R]-prgb[G]>15/*&&  
  22.                 !(prgb[R]>170&&prgb[G]>170&&prgb[B]>170)*/)||//uniform illumination      
  23.                 (prgb[R]>200 && prgb[G]>210 && prgb[B]>170 &&    
  24.                 abs(prgb[R]-prgb[B])<=15 && prgb[R]>prgb[B]&& prgb[G]>prgb[B])//lateral illumination     
  25.                 ) {    
  26.                     memcpy(pdst,prgb,3);    
  27.             }               
  28.             prgb+=3;    
  29.             pdst+=3;    
  30.         }    
  31.     }    
  32.     cvCopyImage(dst,_dst);    
  33.     cvReleaseImage(&dst);    
  34. }    
  35. // skin detection in rg space     
  36. void cvSkinRG(IplImage* rgb,IplImage* gray)    
  37. {    
  38.     assert(rgb->nChannels==3&&gray->nChannels==1);    
  39.         
  40.     const int R=2;    
  41.     const int G=1;    
  42.     const int B=0;    
  43.     
  44.     double Aup=-1.8423;    
  45.     double Bup=1.5294;    
  46.     double Cup=0.0422;    
  47.     double Adown=-0.7279;    
  48.     double Bdown=0.6066;    
  49.     double Cdown=0.1766;    
  50.     for (int h=0;h<rgb->height;h++) {    
  51.         unsigned char* pGray=(unsigned char*)gray->imageData+h*gray->widthStep;    
  52.         unsigned char* pRGB=(unsigned char* )rgb->imageData+h*rgb->widthStep;    
  53.         for (int w=0;w<rgb->width;w++)     
  54.         {    
  55.             int s=pRGB[R]+pRGB[G]+pRGB[B];    
  56.             double r=(double)pRGB[R]/s;    
  57.             double g=(double)pRGB[G]/s;    
  58.             double Gup=Aup*r*r+Bup*r+Cup;    
  59.             double Gdown=Adown*r*r+Bdown*r+Cdown;    
  60.             double Wr=(r-0.33)*(r-0.33)+(g-0.33)*(g-0.33);    
  61.             if (g<Gup && g>Gdown && Wr>0.004)    
  62.             {    
  63.                 *pGray=255;    
  64.             }    
  65.             else    
  66.             {     
  67.                 *pGray=0;    
  68.             }    
  69.             pGray++;    
  70.             pRGB+=3;    
  71.         }    
  72.     }    
  73.     
  74. }    
  75. // implementation of otsu algorithm     
  76. // author: onezeros#yahoo.cn     
  77. // reference: Rafael C. Gonzalez. Digital Image Processing Using MATLAB     
  78. void cvThresholdOtsu(IplImage* src, IplImage* dst)    
  79. {    
  80.     int height=src->height;    
  81.     int width=src->width;    
  82.     
  83.     //histogram     
  84.     float histogram[256]={0};    
  85.     for(int i=0;i<height;i++) {    
  86.         unsigned char* p=(unsigned char*)src->imageData+src->widthStep*i;    
  87.         for(int j=0;j<width;j++) {    
  88.             histogram[*p++]++;    
  89.         }    
  90.     }    
  91.     //normalize histogram     
  92.     int size=height*width;    
  93.     for(int i=0;i<256;i++) {    
  94.         histogram[i]=histogram[i]/size;    
  95.     }    
  96.     
  97.     //average pixel value     
  98.     float avgValue=0;    
  99.     for(int i=0;i<256;i++) {    
  100.         avgValue+=i*histogram[i];    
  101.     }    
  102.     
  103.     int threshold;      
  104.     float maxVariance=0;    
  105.     float w=0,u=0;    
  106.     for(int i=0;i<256;i++) {    
  107.         w+=histogram[i];    
  108.         u+=i*histogram[i];    
  109.     
  110.         float t=avgValue*w-u;    
  111.         float variance=t*t/(w*(1-w));    
  112.         if(variance>maxVariance) {    
  113.             maxVariance=variance;    
  114.             threshold=i;    
  115.         }    
  116.     }    
  117.     
  118.     cvThreshold(src,dst,threshold,255,CV_THRESH_BINARY);    
  119. }    
  120.     
  121. void cvSkinOtsu(IplImage* src, IplImage* dst)    
  122. {    
  123.     assert(dst->nChannels==1&& src->nChannels==3);    
  124.     
  125.     IplImage* ycrcb=cvCreateImage(cvGetSize(src),8,3);    
  126.     IplImage* cr=cvCreateImage(cvGetSize(src),8,1);    
  127.     cvCvtColor(src,ycrcb,CV_BGR2YCrCb);    
  128.     cvSplit(ycrcb,0,cr,0,0);    
  129.     
  130.     cvThresholdOtsu(cr,cr);    
  131.     cvCopyImage(cr,dst);    
  132.     cvReleaseImage(&cr);    
  133.     cvReleaseImage(&ycrcb);    
  134. }    
  135.     
  136. void cvSkinYUV(IplImage* src,IplImage* dst)    
  137. {    
  138.     IplImage* ycrcb=cvCreateImage(cvGetSize(src),8,3);    
  139.     //IplImage* cr=cvCreateImage(cvGetSize(src),8,1);     
  140.     //IplImage* cb=cvCreateImage(cvGetSize(src),8,1);     
  141.     cvCvtColor(src,ycrcb,CV_BGR2YCrCb);    
  142.     //cvSplit(ycrcb,0,cr,cb,0);     
  143.     
  144.     static const int Cb=2;    
  145.     static const int Cr=1;    
  146.     static const int Y=0;    
  147.     
  148.     //IplImage* dst=cvCreateImage(cvGetSize(_dst),8,3);     
  149.     cvZero(dst);    
  150.     
  151.     for (int h=0;h<src->height;h++) {    
  152.         unsigned char* pycrcb=(unsigned char*)ycrcb->imageData+h*ycrcb->widthStep;    
  153.         unsigned char* psrc=(unsigned char*)src->imageData+h*src->widthStep;    
  154.         unsigned char* pdst=(unsigned char*)dst->imageData+h*dst->widthStep;    
  155.         for (int w=0;w<src->width;w++) {    
  156.             if (pycrcb[Cr]>=133&&pycrcb[Cr]<=173&&pycrcb[Cb]>=77&&pycrcb[Cb]<=127)    
  157.             {    
  158.                     memcpy(pdst,psrc,3);    
  159.             }    
  160.             pycrcb+=3;    
  161.             psrc+=3;    
  162.             pdst+=3;    
  163.         }    
  164.     }    
  165.     //cvCopyImage(dst,_dst);     
  166.     //cvReleaseImage(&dst);     
  167. }    
  168.     
  169. void cvSkinHSV(IplImage* src,IplImage* dst)    
  170. {    
  171.     IplImage* hsv=cvCreateImage(cvGetSize(src),8,3);    
  172.     //IplImage* cr=cvCreateImage(cvGetSize(src),8,1);     
  173.     //IplImage* cb=cvCreateImage(cvGetSize(src),8,1);     
  174.     cvCvtColor(src,hsv,CV_BGR2HSV);    
  175.     //cvSplit(ycrcb,0,cr,cb,0);     
  176.     
  177.     static const int V=2;    
  178.     static const int S=1;    
  179.     static const int H=0;    
  180.     
  181.     //IplImage* dst=cvCreateImage(cvGetSize(_dst),8,3);     
  182.     cvZero(dst);    
  183.     
  184.     for (int h=0;h<src->height;h++) {    
  185.         unsigned char* phsv=(unsigned char*)hsv->imageData+h*hsv->widthStep;    
  186.         unsigned char* psrc=(unsigned char*)src->imageData+h*src->widthStep;    
  187.         unsigned char* pdst=(unsigned char*)dst->imageData+h*dst->widthStep;    
  188.         for (int w=0;w<src->width;w++) {    
  189.             if (phsv[H]>=7&&phsv[H]<=29)    
  190.             {    
  191.                     memcpy(pdst,psrc,3);    
  192.             }    
  193.             phsv+=3;    
  194.             psrc+=3;    
  195.             pdst+=3;    
  196.         }    
  197.     }    
  198.     //cvCopyImage(dst,_dst);     
  199.     //cvReleaseImage(&dst);     
  200. }    
  201.     
  202. int main()    
  203. {       
  204.         
  205.     IplImage* img= cvLoadImage("D:/skin.jpg"); //随便放一张jpg图片在D盘或另行设置目录     
  206.     IplImage* dstRGB=cvCreateImage(cvGetSize(img),8,3);    
  207.     IplImage* dstRG=cvCreateImage(cvGetSize(img),8,1);    
  208.     IplImage* dst_crotsu=cvCreateImage(cvGetSize(img),8,1);    
  209.     IplImage* dst_YUV=cvCreateImage(cvGetSize(img),8,3);    
  210.     IplImage* dst_HSV=cvCreateImage(cvGetSize(img),8,3);    
  211.     
  212.     
  213.     cvNamedWindow("inputimage", CV_WINDOW_AUTOSIZE);    
  214.     cvShowImage("inputimage", img);    
  215.     cvWaitKey(0);    
  216.     
  217.     SkinRGB(img,dstRGB);    
  218.     cvNamedWindow("outputimage1", CV_WINDOW_AUTOSIZE);    
  219.     cvShowImage("outputimage1", dstRGB);    
  220.     cvWaitKey(0);    
  221.     cvSkinRG(img,dstRG);    
  222.     cvNamedWindow("outputimage2", CV_WINDOW_AUTOSIZE);    
  223.     cvShowImage("outputimage2", dstRG);    
  224.     cvWaitKey(0);    
  225.     cvSkinOtsu(img,dst_crotsu);    
  226.     cvNamedWindow("outputimage3", CV_WINDOW_AUTOSIZE);    
  227.     cvShowImage("outputimage3", dst_crotsu);    
  228.     cvWaitKey(0);    
  229.     cvSkinYUV(img,dst_YUV);    
  230.     cvNamedWindow("outputimage4", CV_WINDOW_AUTOSIZE);    
  231.     cvShowImage("outputimage4", dst_YUV);    
  232.     cvWaitKey(0);    
  233.     cvSkinHSV(img,dst_HSV);    
  234.     cvNamedWindow("outputimage5", CV_WINDOW_AUTOSIZE);    
  235.     cvShowImage("outputimage5", dst_HSV);    
  236.     cvWaitKey(0);    
  237.     return 0;    
  238. }    

OpenCV肤色检测

时间: 2024-09-17 04:30:57

OpenCV肤色检测的相关文章

OpenCv 人脸检测的学习

最近公司要组织开发分享,但是自己还是新手真的不知道分享啥了,然后看了看前段时间研究过OpenCv,那么就分享他把. openCv就不介绍了,说下人脸检测,其实是通过openCv里边已经训练好的xml文件来进行的,我只是在学习. 我测试中我写了俩个Demo,其中一个是通过Carame来通过摄像头来进行人脸检测看看效果图: 可以看出检测出来的面部有线框. 第一个Dmeo是通过Jni编程来实现的人脸检测, (1)这是本地方法 package com.example.opencv.checkface2;

NVIDIA Jetson TK1学习与开发(九):基于GPU加速的OpenCV人体检测(Full Body Detection)

基于GPU加速的OpenCV人体检测(Full Body Detection) 1.CUDA和OpenCV的安装 首先,确定一下自己的平台是否安装好了CUDA和OpenCV. CUDA的安装可以参考:http://blog.csdn.net/frd2009041510/article/details/42042807和http://blog.csdn.net/frd2009041510/article/details/42925205 OpenCV的安装可以参考:http://blog.csdn

自己做的一个肤色检测模型

肤色检测 在人像美化中,肤色检测有助于防止磨掉头发.胡子等需要保持细节的部分,也可以使美白算法仅作用于皮肤,不对人像周边环境产生影响. 网上找了一下肤色检测模型,效果都太差,换了一种思维,找个训练集,自己做一个. 训练结果,正确率大概85%,运行起来,确实还是比网上找的公式好,勉强可用了. 模型 算法最终反映为 opengl 的一个片断着色器,直接看shader代码吧. varying vec2 textureCoordinate; uniform sampler2D inputImageTex

usb相机-opencv如何检测USB相机的通断?

问题描述 opencv如何检测USB相机的通断? 我使用openCV调用USB相机,使用过程中USB相机突然断开,这个过程应如何进行检测?谢谢 解决方案 下面代码,打开就继续,不打开直接返回么,不知道这样可以不? VideoCapture cap(0); //打开默认的摄像头号 if(!cap.isOpened()) //检测是否打开成功 return -1; 解决方案二: http://blog.csdn.net/carson2005/article/details/6705198 解决方案三

脸部识别-android Opencv 人脸检测

问题描述 android Opencv 人脸检测 请问有大神做过opencv人脸识别的相关demo吗?找了好长时间都是人脸检测 解决方案 最近在做人脸识别,现在初步只做了人脸检测,比较简单,仅供参考. 功能是打开图片,进行人脸检测,输出人脸个数和检测范围. .......省略包 public class Staticdetection2Activity extends Activity { final private static String TAG = "Staticrecognition.

opencv 运动目标检测 性能问题

问题描述 opencv 运动目标检测 性能问题 使用混合高斯背景模型背景差分法进行运动目标检测时,发现实时解码视频流会出现,背景差分效率跟不上的情况,占用资源高,而且还容易丢帧,请问各位大虾怎样提高解码性能,以及怎样提高背景差分的性能? 解决方案 主要是处理速度跟不上,简单的说如果你的视频是25/s帧 那么至少40ms要解一帧,并且做背景差分,电脑处理速度跟不上,就会丢帧.建议你看看实时解码出来的图像是否花屏严重,如果不严重,可以适当减小图片的大小,从而达到处理速度的目的.至于你说的占用资源高,

opencv 区域检测-如何利用opencv对ycbcr格式的图像求重心

问题描述 如何利用opencv对ycbcr格式的图像求重心 如题,在opencv中将普通格式的图像转化为ycbcr用以检测肤色后,如何对图像求重心?是利用cvmoments吗?但是这个函数好像只能用于二值化图像,程序运行到一半会报错求大神解答 解决方案 利用opencv求图像重心 解决方案二: 重心这种计算,一般都是针对二值图或者单通道进行的,你可以对Y通道进行二值化,然后再计算重心!还有,计算重心的算法很简单,没必要非要用opencv,自己写一个都可以! 解决方案三: 一般某个核心的研究成果,

opencv 区域检测-Opencv中cvfindcontours原理

问题描述 Opencv中cvfindcontours原理 Opencv中的cvfindcontours原理是什么啊,有没有什么比较著名的算法在里面,自己看不懂代码,网上也没有介绍~但是想学习一下轮廓检测-- 解决方案 OpenCV人脸识别的原理 .OpenCV人脸识别的原理 .opencv cvFindContours---------------------- 解决方案二: opencv文档中的内容有写: "") The function retrieves contours fro

OpenCV 轮廓检测

读入彩色3通道图像,转换成灰度图像,再转换成二值图像,完后检测轮廓.   // cvtcolor.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <opencv2/highgui/highgui.hpp> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp&g