您的位置:首页 > 运维架构

opencv椭圆肤色模型人脸检测

2017-03-15 11:56 489 查看
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表示绘制椭圆弧线相对该椭圆自己的水平轴的终止角度;        绘制椭圆曲线的示意图如下所示: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息