2014-12-08 179 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