Mat input_image;
Mat output_mask;
Mat output_image; void main()
{
VideoCapture cam();
if (!cam.isOpened())
return; namedWindow("input image");
namedWindow("output mask");
namedWindow("output image");
//椭圆皮肤模型
Mat skinCrCbHist = Mat::zeros(Size(, ), CV_8UC1);
ellipse(skinCrCbHist, Point(, 155.6), Size(23.4, 15.2), 43.0, 0.0, 360.0, Scalar(, , ), -); while (true) {
cam >> input_image;
if (input_image.empty())
return; Mat ycrcb_image;
output_mask = Mat::zeros(input_image.size(), CV_8UC1);
cvtColor(input_image, ycrcb_image, CV_BGR2YCrCb); //首先转换成到YCrCb空间
for (int i = ; i < input_image.cols; i++) //利用椭圆皮肤模型进行皮肤检测
for (int j = ; j < input_image.rows; j++){
Vec3b ycrcb = ycrcb_image.at<Vec3b>(j, i);
if (skinCrCbHist.at<uchar>(ycrcb[], ycrcb[]) > )
output_mask.at<uchar>(j, i) = ;
}
input_image.copyTo(output_image, output_mask);
cv::erode(output_mask, output_mask, cv::Mat());
cv::erode(output_mask, output_mask, cv::Mat());
cv::erode(output_mask, output_mask, cv::Mat());
cv::erode(output_mask, output_mask, cv::Mat());
cv::dilate(output_mask, output_mask, cv::Mat());
imshow("input image", input_image);
imshow("output mask", output_mask);
imshow("output image", output_image);
output_image.setTo();
if ( == waitKey())
return;
}
return;
}

第二种:

Mat input_image;
Mat output_mask;
Mat output_image;
Mat mask;
void main()
{
VideoCapture cam();
if (!cam.isOpened())
return; ///椭圆皮肤模型
Mat skinCrCbHist = Mat::zeros(Size(, ), CV_8UC1);
ellipse(skinCrCbHist, Point(, 155.6), Size(23.4, 15.2), 43.0, 0.0, 360.0, Scalar(, , ), -); Mat element = getStructuringElement(MORPH_RECT, Size(, ), Point(-, -)); while (true)
{
cam >> input_image;
if (input_image.empty())
return; Mat ycrcb_image;
output_mask = Mat::zeros(input_image.size(), CV_8UC1);
cvtColor(input_image, ycrcb_image, CV_BGR2YCrCb); //首先转换成到YCrCb空间 for (int i = ; i < input_image.rows; i++) //利用椭圆皮肤模型进行皮肤检测
{
uchar* p = (uchar*)output_mask.ptr<uchar>(i);
Vec3b* ycrcb = (Vec3b*)ycrcb_image.ptr<Vec3b>(i);
for (int j = ; j < input_image.cols; j++)
{
if (skinCrCbHist.at<uchar>(ycrcb[j][], ycrcb[j][]) > )
p[j] = ;
}
} morphologyEx(output_mask, output_mask, MORPH_CLOSE, element); vector< vector<Point> > contours; // 轮廓
vector< vector<Point> > filterContours; // 筛选后的轮廓
vector< Vec4i > hierarchy; // 轮廓的结构信息
contours.clear();
hierarchy.clear();
filterContours.clear(); findContours(output_mask, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
// 去除伪轮廓
for (size_t i = ; i < contours.size(); i++)
{
if (fabs(contourArea(Mat(contours[i]))) > &&fabs(arcLength(Mat(contours[i]),true))<) //判断手进入区域的阈值
filterContours.push_back(contours[i]);
} output_mask.setTo();
drawContours(output_mask, filterContours, -, Scalar(, , ), CV_FILLED); //8, hierarchy); input_image.copyTo(output_image, output_mask);
imshow("input image", input_image);
imshow("output image", output_image); output_image.setTo();
if ( == waitKey())
return;
}
return;
}

OpenCv椭圆皮肤模型的更多相关文章

  1. OpenCV混合高斯模型函数注释说明

    OpenCV混合高斯模型函数注释说明 一.cvaux.h #define CV_BGFG_MOG_MAX_NGAUSSIANS 500 //高斯背景检测算法的默认参数设置 #define CV_BGF ...

  2. Opencv混合高斯模型前景分离

    #include "stdio.h" #include "string.h" #include "iostream" #include &q ...

  3. OpenCv:椭圆上点的计算方程

    椭圆         椭圆(Ellipse)是平面内到定点F1.F2的距离之和等于常数(大于|F1F2|)的动点P的轨迹,F1.F2称为椭圆的两个焦点.其数学表达式为:                 ...

  4. Opencv SkinOtsu皮肤检测

    void SkinRGB(IplImage* rgb, IplImage* _dst) { assert(rgb->nChannels == && _dst->nChann ...

  5. OpenCV探索之路(二十七):皮肤检测技术

    好久没写博客了,因为最近都忙着赶项目和打比赛==| 好吧,今天我打算写一篇关于使用opencv做皮肤检测的技术总结.那首先列一些现在主流的皮肤检测的方法都有哪些: RGB color space Yc ...

  6. OpenCV实时美颜摄像并生成H264视频流

    为什么美颜摄像这么简单的功能,OpenCV这个开源项目网上很少有代码呢?对于在windows平台下,生成h264视频流也比价麻烦,没有现成的api可以使用,需要借助MinGw编译libx264,或者f ...

  7. 使用VS+OpenCV调用深度学习模型

    最近项目有个任务,要在windows环境下用VS+OpenCV实现caffe模型的调用,于是在网上找了几个相关的博客跑了几个demo练练手.这些博客写得都很详细,但是有些细节由于版本更新的问题,配置的 ...

  8. HOG:从理论到OpenCV实践

    (转载请注明出处:http://blog.csdn.net/zhazhiqiang/ 未经允许请勿用于商业用途) 一.理论 1.HOG特征描述子的定义:     locally normalised ...

  9. Unity3d 屏幕空间人体皮肤知觉渲染&次表面散射Screen-Space Perceptual Rendering & Subsurface Scattering of Human Skin

    之前的人皮渲染相关 前篇1:unity3d Human skin real time rendering 真实模拟人皮实时渲染 前篇2:unity3d Human skin real time ren ...

随机推荐

  1. Java数据结构——双端链表

    //================================================= // File Name : FirstLastList_demo //------------ ...

  2. Java数据库——处理大数据对象

    处理大数据对象 CLOB中可以存储海量文字 BLOB中可以存储海量二进制数据 如果程序中要想处理这样的大对象操作,则必须使用PreparedStatement完成,所有的内容要通过IO流的方式从大文本 ...

  3. Random类

    Random类是随机数产生类,可以指定一个随机数的范围,然后任意产生在此范围中的数字. //================================================= // F ...

  4. You Can Do Research Too

    You Can Do Research Too I was recently discussing gatekeeping and the process of getting started in ...

  5. 在线考试系统(Online Exam System)--ASP.NET

    用户设计 -|学生 -|老师 -|管理员 学生结构设计 -|个人信息管理 -|修改个人信息 -|修改登录密码 -|选课中心 -|显示所有老师所开课的信息可进行选课 -|显示自己已选课程 -|在线考试 ...

  6. Latex 表格内公式换行方法

    Latex 表格内的公式实现换行的方法       简单的两步走:   1.先将下面的语句放在latex正文的导言区: \newcommand{\tabincell}[2]{\begin{tabula ...

  7. CURL常用命令--update20151015

    下载单个文件,默认将输出打印到标准输出(STDOUT)中 curl http://www.centos.org 通过-o/-O选项保存下载的文件到指定的文件中:-o:将文件保存为命令行中指定的文件名的 ...

  8. 数据库操作事务IsolationLevel 枚举

      成员名称 说明   Chaos 无法覆盖隔离级别更高的事务中的挂起的更改.   ReadCommitted 在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复 ...

  9. 代码中access 的使用

     C++代码:if(access(strZip.c_str(), 0) == 0){...}    此处为判断strZip中文件是否存在   .c_str() 是他自身字符串名称,该名称是一个压缩文件 ...

  10. 管理员必备的Linux系统监控工具

    管理员必备的Linux系统监控工具 #1: top - 进程活动 top提供一个当前运行系统实时动态的视图, 也就是正在运行进程.在默认情况下,显示系统 中CPU使用率最高的任务,并每5秒钟刷新一次. ...