2014-12-08 181 views
2

我有一個函數可以從for循環中從main調用,它可以從視頻源中搜索臉部。代碼在第一次運行時完美運行,但在第二次循環時輸出很多「Camera dropped frame!」。錯誤到控制檯並不再更新視頻源。什麼是造成「相機掉幀!」使用OpenCV運行detectMultiScale時出錯?

我找到了導致錯誤的行,它是包含detectMultiScale函數的行。完整的功能是在這裏:

void findInFrame(Mat inputFrame) 
{ 
    vector<Rect> faces; 
    Mat grayFrame; 

    cvtColor(inputFrame, grayFrame, COLOR_BGR2GRAY); 
    faceClassifier.detectMultiScale(grayFrame, faces); 


    for(int i=0;i<faces.size();i++) 
    { 
     Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5); 
     ellipse(inputFrame,center,Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0); 

     Mat faceROI = grayFrame(faces[i]); 
    } 
    imshow("frame", inputFrame); 
} 

拋出錯誤的路線是:第一導致錯誤

faceClassifier.detectMultiScale(grayFrame, faces); 

每幀後。我怎樣才能解決這個問題?

主要是在這裏:

#include <iostream> 
#include <unistd.h> 
#include <opencv2/core.hpp> 
#include <opencv2/opencv.hpp> 


using namespace std; 
using namespace cv; 

string faceHaar = "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml"; 
string eyesHaar = "/usr/local/share/OpenCV/haarcascades/haarcascade_eye.xml"; 

CascadeClassifier faceClassifier; 
void findInFrame(Mat inputFrame); 

int main(int argc, const char * argv[]) 
{ 

    VideoCapture cam(0); 
    Mat frame; 

    if(!faceClassifier.load(faceHaar)) 
    { 
     cout << "Error loading face cascade" << endl; 
     return -1; 
    } 

    for(;;) 
    { 
     cam >> frame; 

     if(!frame.empty()) 
     { 
      findInFrame(frame); 
      usleep(1000); 
     } 
     else 
     { 
      cout << "frame empty" << endl; 
     } 
    } 

    return 0; 
} 

回答

1

嘗試指定功能多一點 - 我覺得它只是時間太長處理您的匹配。

faceClassifier.detectMultiScale(grayFrame, faces, 1.3, 3,0|CV_HAAR_SCALE_IMAGE, Size(20, 30)); 

哪裏size是你訓練有素的探測器大小,1.3是一個規模門檻和3是如何都需要一個匹配許多最近的鄰居。除此之外,丟幀並不是一個大問題,但是你可能會在代碼的其他地方做一些錯誤的事情,比如抓取新幀的位置。

我也會考慮將函數更改爲void findInFrame(Mat &inputFrame)並在主循環中調用imshow,而不是在函數中調用。請注意,& inputFrame不是一個真正的傳統指針,不需要您更改在函數中引用inputFrame的方式

+0

感謝您的響應堆,我如何才能找到CV_HAAR_SCALE_IMAGE常量所在的庫? – 2014-12-08 00:29:17

+0

http://stackoverflow.com/questions/6119772/face-detector-parameters-for-opencv-cv-haar-scale-image ive在回答中增加了另一個建議 – chris 2014-12-08 00:30:47

+0

我想也許CV_HAAR_SCALE_IMAGE已被棄用並替換爲CASCADE_SCALE_IMAGE 。我用它取代了它,但仍然遇到同樣的問題。要更新與我的主要問題,以確保我不抓幀錯誤。 – 2014-12-08 00:35:15