OpenCV2.4 例程五 (人脸检测)

以下程序来自OpenCV自带例程:

原例是检测视频文件中的人脸,笔者改为检测视频中的人脸,还有OpenCV2.4的摄像头的驱动我该成了VFW,否则不能正常读取摄像头:

#include "stdafx.h"
#include "opencv/highgui.h"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/video/tracking.hpp"
#include "opencv2/video/video.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

void help()
{
	cout << "\nThis program demonstrates the multi cascade recognizer. It is a generalization of facedetect sample.\n\n"
		"Usage: ./multicascadeclassifier \n"
		"   --cascade1=<cascade_path> this is the primary trained classifier such as frontal face\n"
		"   [--cascade2=[this an optional secondary classifier such as profile face or eyes]]\n"
		"   input video or image\n\n"
		"Example: ./multicascadeclassifier --cascade1=\"../../data/haarcascades/haarcascade_frontalface_alt.xml\" --cascade2=\"../../data/haarcascades/haarcascade_eye.xml\"\n\n"
		"Using OpenCV version " << CV_VERSION << endl << endl;
}

void DetectAndDraw(Mat& img, CascadeClassifier& cascade);

String cascadeName = "H:/OpenCV2.4/opencv/data/haarcascades/haarcascade_frontalface_alt.xml";
String nestedCascadeName = "H:/OpenCV2.4/opencv/data/haarcascades/haarcascade_eye_tree_eyeglasses.xml";

int main( int argc, const char** argv )
{ 
	CvCapture* capture = 0;
	//double t=capture->getProperty(0);
	//capture = cvCreateCameraCapture(0);//cvCaptureFromCAM( 0 );//
	Mat frame, image;

	if (argc == 0)
	{
		help();
		return 0;
	}

	const String cascadeOpt = "--cascade1=";
	size_t cascadeOptLen = cascadeOpt.length();
	string inputName;
	for( int i = 1; i < argc; i++ )
	{
		cout << "Processing argument #" << i << ": " <<  argv[i] << endl;
		if( cascadeOpt.compare( 0, cascadeOptLen, argv[i], cascadeOptLen ) == 0 )
		{
			cascadeName.assign( argv[i] + cascadeOptLen );
			cout << "  from which we have cascadeName= " << cascadeName << endl;
		}
		else if( argv[i][0] == '-' )
		{
			cerr << "WARNING: Unknown option " << argv[i] << endl;
		}
		else
			inputName.assign( argv[i] );
	}

	CascadeClassifier cascade;
	if( !cascade.load( cascadeName ) )
	{
		cerr << "ERROR: Could not load cascade classifier \"" << cascadeName << "\"" << endl;
		help();

		return -1;
	}

	if( inputName.size() )
	{
		image = imread( inputName, 1 );
		if( image.empty() )
		{
			capture = cvCaptureFromAVI( inputName.c_str() );
			if( !capture )
				cout << "Capture from AVI don't work" << endl;
		}
	}
	else
	{
		capture=cvCaptureFromCAM(-1);
		/*cout << "Please provide input file." << endl;
		return -1;*/
	}

	cvNamedWindow( "result", 1 );

	if( capture )
	{
		for(;;)
		{
			IplImage* iplImg = cvQueryFrame( capture );
			frame = iplImg;
			if( frame.empty() )
				break;

			DetectAndDraw( frame, cascade );

			if( waitKey( 10 ) >= 0 )
				goto _cleanup_;
		}

		waitKey(0);
_cleanup_:
		cvReleaseCapture( &capture );
	}
	else if( !image.empty() )
	{
		DetectAndDraw( image, cascade );
		waitKey(0);
	}
	else
	{
		cout << "Please provide correct input file." << endl;
	}

	cvDestroyWindow("result");

	return 0;
}

void DetectAndDraw( Mat& img, CascadeClassifier& cascade)
{
	int i = 0;
	double t = 0;
	vector<Rect> faces;
	const static Scalar colors[] =  { CV_RGB(0,0,255),
		CV_RGB(0,128,255),
		CV_RGB(0,255,255),
		CV_RGB(0,255,0),
		CV_RGB(255,128,0),
		CV_RGB(255,255,0),
		CV_RGB(255,0,0),
		CV_RGB(255,0,255)} ;
	Mat gray;
	Mat frame( cvRound(img.rows), cvRound(img.cols), CV_8UC1 );

	cvtColor( img, gray, CV_BGR2GRAY );
	resize( gray, frame, frame.size(), 0, 0, INTER_LINEAR );
	equalizeHist( frame, frame );

	t = (double)cvGetTickCount();
	cascade.detectMultiScale( frame, faces,
		1.1, 2, 0
		//|CV_HAAR_FIND_BIGGEST_OBJECT
		//|CV_HAAR_DO_ROUGH_SEARCH
		|CV_HAAR_SCALE_IMAGE
		,
		Size(30, 30) );
	t = (double)cvGetTickCount() - t;
	printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );

	for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
	{
		Point center;
		Scalar color = colors[i%8];
		int radius;
		center.x = cvRound(r->x + r->width*0.5);
		center.y = cvRound(r->y + r->height*0.5);
		radius = (int)(cvRound(r->width + r->height)*0.25);
		circle( img, center, radius, color, 3, 8, 0 );
	}

	cv::imshow( "result", img );
}

缺点是检测效率还达不到实时,700ms左右每帧:  效果图:


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值