2013年1月17日 星期四

Face Detection using OpenCV 2.X

環境:Visual Studio 2008 + OpenCV 2.3.1

#include <stdafx.h>
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

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

using namespace std;
using namespace cv;

void detectAndDraw( Mat& img, CascadeClassifier& cascade, double scale);

String cascadeName = "haarcascade_frontalface_alt.xml";
// String cascadeName = "C://work/projects/test/haarcascade_frontalface_alt.xml";

int main( int argc, const char** argv )
{
    CvCapture* capture = 0;
    Mat frame, frameCopy;
    IplImage* srcImg;

    CascadeClassifier cascade;
    double scale = 2;

    if( !cascade.load( cascadeName ) )    
        return -1;

    capture = cvCaptureFromCAM(0);
    cvNamedWindow( "result", 1 );

    if( capture )
    {
        for(;;)
        {
            srcImg = cvQueryFrame( capture );
            frame = srcImg;
            if( frame.empty() )
                break;
            if( srcImg->origin == IPL_ORIGIN_TL )
                frame.copyTo( frameCopy );
            else
                flip( frame, frameCopy, 0 );

            detectAndDraw( frameCopy, cascade, scale);

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

_cleanup_:
        cvReleaseCapture( &capture );
    }
    cvDestroyWindow("result");
    return 0;
}

void detectAndDraw( Mat& img, CascadeClassifier& cascade, double scale)
{
    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)} ;//設定8種不同的顏色代表偵測的人臉
    Mat gray;//建立灰階影像
    Mat smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );//建立偵測影像

    cvtColor( img, gray, CV_BGR2GRAY );//轉換成灰階影像
    resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );//縮小偵測影像
    equalizeHist( smallImg, smallImg );//直方圖均衡化

    t = (double)cvGetTickCount();
    cascade.detectMultiScale( smallImg, faces, 1.2, 2, 0
        |CV_HAAR_SCALE_IMAGE, Size(30,30) );//臉部偵測
    t = (double)cvGetTickCount() - t;
    printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );
    printf("FPS = %f\n",1000/(t/((double)cvGetTickFrequency()*1000.)));

    for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
    {
        vector<Rect> nestedObjects;//記錄每一隻眼睛的位置與大小
        Point center;
        Scalar color = colors[i%8];//宣告顏色
        int radius;
        center.x = cvRound((r->x + r->width*0.5)*scale);//臉的x軸位置
        center.y = cvRound((r->y + r->height*0.5)*scale);//臉的y軸位置
        radius = cvRound((r->width + r->height)*0.25*scale);//臉的半徑
        circle( img, center, radius, color, 3, 8, 0 );//show出臉的位置與大小  
    }
    cv::imshow( "result", img );
}

相關文章:OpenCV學習日記

11 則留言:

  1. 作者已經移除這則留言。

    回覆刪除
  2. 我執行的時候出現C1083錯誤 似乎是開頭的 include無法開啟
    error C2679二元運算子 '=' :找不到使用右方運算類型'IplImage*' 的運算子

    回覆刪除
    回覆
    1. 請問是哪一個HEADER無法開啟?
      你可以嘗試直接#include

      刪除
  3. 我執行程式,出現發生未處理的例外狀況: Microsoft C++ 在記憶體位置 0x003aeb98,發生例外狀況: cv::Exception,可以請問是因為什麼原因嗎

    回覆刪除
    回覆
    1. 你可以加一些try catch試試。看起來像call opencv api的時候發生問題。如果能提供更詳細的流程可能比較好幫助到你。

      刪除
    2. 目前程式卡在 if( !cascade.load( cascadeName ) ) 這段,一直無法執行下去

      刪除
    3. 我了解了,應該是你的執行程式路徑上沒有haarcascade_frontalface_alt這個檔案,你可以在OpenCV的目錄中找到這一個檔案,並搬到相對應的位置,或者直接指到那個檔案位置。

      刪除
    4. 我也一樣卡在if( !cascade.load( cascadeName ) )這段,請問是要把haarcascade_frontalface_alt搬移至哪裡呢?

      刪除
    5. 你可以選擇給絕對路徑

      刪除
  4. 在win7 OpenCV2.4.9 vs2010環境下執行程式 webcam 燈有亮,但是沒有畫面出現,可以請問是什麼原因嗎

    回覆刪除
  5. 我的程式在開頭的地方#include 他說無法開啟
    然後 37 行 的 frame = srcImg 這條有問題!!!

    回覆刪除