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. linux如何查看系统信息

    一:cpu [root@srv /]# more /proc/cpuinfo | grep "model name" model name    : Intel(R) Xeon(R ...

  2. Java线程:Timer和TimerTask

    Timer和TimerTask可以做为实现线程的第三种方式,前两中方式分别是继承自Thread类和实现Runnable接口. Timer是一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务执 ...

  3. 一张图总结docker命令

  4. 安装weinre在PC端调试移动端

    1.使用node安装weinre. 2.启动weinre, weinre --httpPort 8081  --boundHost -all- 3.在浏览器打开 http://localhost:80 ...

  5. ecshop默认配置

    手机端 1.C, 系统默认所有配置 输出:print_r(C())

  6. Python之路【第七篇】:初识Socket

    What is Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制, ...

  7. Yii2 advanced版API接口开发 基于RESTful架构的 配置、实现、测试

    参考地址: http://www.xiaoxiangzi.com/Programme/PHP/3348.html http://www.cnblogs.com/ganiks/p/yii2-restfu ...

  8. haproxy配置文件

    haproxy配置文件   思路:读一行.写一行 global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 info de ...

  9. linux下gimp的使用

    参考资料: http://wenku.baidu.com/view/345c525f804d2b160b4ec070.html 没有视频, 只靠自己摸索使用... 参考文章: http://www.3 ...

  10. Sublime Text 2 快捷键 (windows)

    转自:http://istyles.blog.163.com/blog/static/1811003892011828111418654/ Lucifr翻译了 Sublime Text 2 快捷键 M ...