linux人脸检测,一个简单的OpenCV人脸检测代码

基于OpenCV harr级联分类器的人脸及眼睛、鼻子、嘴巴检测程序。

代码很简单:

#include

#include

#include

#include

#include

using namespace std;

int main()

{

cv::CascadeClassifier mFaceDetector;

cv::CascadeClassifier mEyeDetector;

cv::CascadeClassifier mMouthDetector;

cv::CascadeClassifier mNoseDetector;

//载入四个人脸特征分类器文件,可以从opencv的安装目录中找到

if( mFaceDetector.empty() )

mFaceDetector.load( "haarcascade_frontalface_default.xml" );

if( mEyeDetector.empty() )

mEyeDetector.load( "haarcascade_mcs_eyepair_big.xml" );

if( mNoseDetector.empty() )

mNoseDetector.load("haarcascade_mcs_nose.xml" );

if( mMouthDetector.empty() )

mMouthDetector.load( "haarcascade_mcs_mouth.xml" );

//打开视频文件

//cv::VideoCapture capture("bike.avi");

//0 open default camera

cv::VideoCapture capture(0);

//检查视频是否打开

if(!capture.isOpened())

return 1;

// 得到帧率

double rate= capture.get(CV_CAP_PROP_FPS);

bool stop(false);

cv::Mat frame; // 现在的视频帧

cv::Mat mElabImage;//备份frame图像

cv::namedWindow("Extracted Frame");

// 两帧之间的间隔时间

int delay= 1000/rate;

// 循环播放所有的帧

while (!stop) {

// 读下一帧

if (!capture.read(frame))

break;

frame.copyTo( mElabImage );

//检测脸

//缩放因子

float scaleFactor = 3.0f;

vector< cv::Rect > faceVec;

mFaceDetector.detectMultiScale( frame, faceVec, scaleFactor );

int i, j;

for(  i=0; i

{

cv::rectangle( mElabImage, faceVec[i], CV_RGB(255,0,0), 2 );

cv::Mat face = frame( faceVec[i] );

//检测眼睛

vector< cv::Rect > eyeVec;

mEyeDetector.detectMultiScale( face, eyeVec );

for( j=0; j

{

cv::Rect rect = eyeVec[j];

rect.x += faceVec[i].x;

rect.y += faceVec[i].y;

cv::rectangle( mElabImage, rect, CV_RGB(0,255,0), 2 );

}

//检测鼻子

vector< cv::Rect > noseVec;

mNoseDetector.detectMultiScale( face, noseVec, 3 );

for( j=0; j

{

cv::Rect rect = noseVec[j];

rect.x += faceVec[i].x;

rect.y += faceVec[i].y;

cv::rectangle( mElabImage, rect, CV_RGB(0,0,255), 2 );

}

//检测嘴巴

vector< cv::Rect > mouthVec;

cv::Rect halfRect = faceVec[i];

halfRect.height /= 2;

halfRect.y += halfRect.height;

cv::Mat halfFace = frame( halfRect );

mMouthDetector.detectMultiScale( halfFace, mouthVec, 3 );

for(  j=0; j

{

cv::Rect rect = mouthVec[j];

rect.x += halfRect.x;

rect.y += halfRect.y;

cv::rectangle( mElabImage, rect, CV_RGB(255,255,255), 2 );

}

}

//在窗口中显示图像

cv::imshow("Extracted Frame",mElabImage);

// 按任意键停止视频播放

//if (cv::waitKey(delay)>=0)

//    stop= true;

cv::waitKey(20);

}

// 关闭视频文件

capture.release();

return 0;

    }0b1331709591d260c1c78e86d0c51c18.png

你可能感兴趣的:(linux人脸检测)