opencv椭圆肤色模型人脸检测

来源:互联网 发布:新网 域名管理 编辑:程序博客网 时间:2024/03/29 09:28

void ellipse(Mat&img, Point center, Size axes, doubleangle, double startAngle, double endAngle, const Scalar&color, int thickness=1, int lineType=8, intshift=0)
 
该函数是用来在指定图片上绘制椭圆弧线的。

  参数image为需要绘制椭圆的图像;

  参数center是该椭圆的中心点坐标;

  参数axes是该椭圆的长半轴和短半轴;

  参数angle是该椭圆和水平方向上的旋转夹角;

  参数startAngle表示绘制椭圆弧线相对该椭圆自己的水平轴的起始角度;

  参数endAngel表示绘制椭圆弧线相对该椭圆自己的水平轴的终止角度;

        绘制椭圆曲线的示意图如下所示:
../../../_images/ellipse.png



code:
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/contrib/contrib.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
#include<vector>
using namespace std;
using namespace cv;
Mat input_image;
Mat output_mask;
Mat output_image;
Mat mask;
int main()
{
 input_image = imread("image01.jpg");
 /*椭圆皮肤模型*/
 Mat skinCrCbHist=Mat::zeros(Size(256,256),CV_8UC1);
 ellipse(skinCrCbHist,Point(113,155.6),Size (23.4,15.2),43.0,0.0,360.0,Scalar(255,255,255),-1);
 imshow("ellipse", skinCrCbHist);
 Mat element=getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
 while(true)
 {
 Mat ycrcb_image;
 output_mask=Mat::zeros(input_image.size(),CV_8UC1);
 cvtColor(input_image,ycrcb_image,CV_BGR2YCrCb); //首先转换成到YCrCb空间
 for(int i=0;i<input_image.rows;i++) //利用椭圆皮肤模型进行皮肤检测
 {
  uchar* p=(uchar*)output_mask.ptr<uchar>(i);
  Vec3b* ycrcb=(Vec3b*)ycrcb_image.ptr<Vec3b>(i);
  for(int j=0;j<input_image.cols;j++)
  {
  if(skinCrCbHist.at<uchar>(ycrcb[j][1],ycrcb[j][2])>0)
  p[j]=255;
  }
 }
 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=0;i<contours.size();i++)
 {
  if(fabs(contourArea(Mat(contours[i])))>1000/*&&fabs(arcLength(Mat(contours[i]),true))<2000*/) //判断手进入区域的阈值
  filterContours.push_back(contours[i]);
 }
 output_mask.setTo(0);
 drawContours(output_mask,filterContours,-1,Scalar(255,0,0),CV_FILLED); //8, hierarchy);
 input_image.copyTo(output_image,output_mask);
 imshow("input image",input_image);
 imshow("output image",output_image);
 output_image.setTo(0);
 if(27==waitKey(30))
 return 0;
 }
 return 0;

}







参考文献:

              http://www.lai18.com/content/494270.html
              http://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html?highlight=ellipse


0 0
原创粉丝点击