opencv 头发识别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv 头发识别相关的知识,希望对你有一定的参考价值。

怎样通过二值化将图像中的人的头发分割出来???

参考技术A HOG特征结合SVM或者Adaboost训练Haar特征,来得到人头部的分类器,将人头部检测出来。然后使用HSV颜色特征区分头发和面部。 参考技术B 我只能说这是个技术活你得上专业网站看看。因为发型太多了要总结特征难。

opencv 能识别眼睛吗

参考技术A 可以啊。给你个代码
人眼睛识别:
  #include "stdafx.h"
  #include "cv.h"
  #include "highgui.h"
  #include <stdio.h>

  #ifdef _EiC
  #define WIN32
  #endif

  static CvMemStorage* storage = 0;
  static CvHaarClassifierCascade* cascade = 0;

  void detect_and_draw( IplImage* image );

  const char* cascade_name =
  "haarcascade_eye.xml";//人脸检测分类器

  int main( int argc, char** argv )
  
  CvCapture* capture = 0;
  IplImage *frame, *frame_copy = 0;
  int optlen = strlen("--cascade=");
  const char* input_name;

  if( argc > 1 && strncmp( argv[1], "--cascade=", optlen ) == 0 )
  
  cascade_name = argv[1] + optlen;
  input_name = argc > 2 ? argv[2] : 0;
  
  else
  
  cascade_name = "C:/OpenCV2.0/data/haarcascades/haarcascade_eye.xml";//分类器路径

  input_name = argc > 1 ? argv[1] : 0;
  

  cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );

  if( !cascade )//如果没有找到分类器,输出以下
  
  fprintf( stderr, "ERROR: Could not load classifier cascade\n" );
  fprintf( stderr,
  "Usage: facedetect --cascade=\"<cascade_path>\" [filename|camera_index]\n" );
  return -1;
  
  storage = cvCreateMemStorage(0);

  capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' );//读取摄像头
  if(!capture)//如果没有摄像头读取视频文件

  capture = cvCaptureFromAVI("检测.avi");

  cvNamedWindow( "result", 1);//创建窗口

  if( capture )
  
  for(;;)
  
  if( !cvGrabFrame( capture ))//从摄像头中抓取帧
  break;
  frame = cvRetrieveFrame( capture );//读取上边抓取的帧
  if( !frame )
  break;
  if( !frame_copy )
  frame_copy = cvCreateImage( cvSize(frame->width,frame->height),
  IPL_DEPTH_8U, frame->nChannels );
  if( frame->origin == IPL_ORIGIN_TL )
  cvCopy( frame, frame_copy, 0 );
  else
  cvFlip( frame, frame_copy, 0 );

  detect_and_draw( frame_copy );

  if( cvWaitKey( 10 ) >= 0 )
  break;
  

  cvReleaseImage( &frame_copy );
  cvReleaseCapture( &capture );
  
  else//没检测到视频文件或者摄像头
  
  const char* filename = (char*)"检测.jpg";//读图片
  IplImage* image = cvLoadImage( filename, 1 );

  if( image )
  
  detect_and_draw( image );
  cvWaitKey(0);
  cvReleaseImage( &image );
  
  else
  

  FILE* f = fopen( filename, "rt" );
  if( f )
  
  char buf[1000+1];
  while( fgets( buf, 1000, f ) )
  
  int len = (int)strlen(buf);
  while( len > 0 && isspace(buf[len-1]) )
  len--;
  buf[len] = '\0';
  image = cvLoadImage( buf, 1 );
  if( image )
  
  detect_and_draw( image );
  cvWaitKey(0);
  cvReleaseImage( &image );
  
  
  fclose(f);
  
  

  

  cvDestroyWindow("result");

  return 0;
  

  void detect_and_draw( IplImage* img )
  
  static CvScalar colors[] =
  
  0,0,255,
  0,128,255,
  0,255,255,
  0,255,0,
  255,128,0,
  255,255,0,
  255,0,0,
  255,0,255
  ;
  double scale = 1.3;
  IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 );
  IplImage* small_img = cvCreateImage( cvSize( cvRound (img->width/scale),
  cvRound (img->height/scale)),
  8, 1 );
  int i;

  cvCvtColor( img, gray, CV_BGR2GRAY );
  cvResize( gray, small_img, CV_INTER_LINEAR );
  cvEqualizeHist( small_img, small_img );
  cvClearMemStorage( storage );

  if( cascade )
  
  double t = (double)cvGetTickCount();
  CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,
  1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,
  cvSize(30, 30) );//检测人脸返回矩形人脸
  t = (double)cvGetTickCount() - t;
  printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );
  for( i = 0; i < (faces ? faces->total : 0); i++ )//找到矩形中心,把矩形转化为圆形
  
  CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
  CvPoint center;
  int radius;
  center.x = cvRound((r->x + r->width*0.5)*scale);
  center.y = cvRound((r->y + r->height*0.5)*scale);
  radius = cvRound((r->width + r->height)*0.25*scale);
  cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );
  
  

  cvShowImage( "result", img );
  cvReleaseImage( &gray );
  cvReleaseImage( &small_img );
  本回答被提问者和网友采纳
参考技术B 这个库里面好像就有吧。。。

以上是关于opencv 头发识别的主要内容,如果未能解决你的问题,请参考以下文章

基于Opencv实现车牌图片识别系统

牛逼plus的springboot+maven车牌识别开源系统

OpenCV 从网络摄像头流中分离出剪影

用opencv定位和识别数字如何识别呢,急求~~~~~~~~~

opencv 能识别眼睛吗

一套基于java的开源车牌识别算法