造成“相机丢帧”的原因是什么?使用OpenCV运行detectMultiScale时出错?

时间:2014-12-08 00:12:53

标签: c++ opencv

我有一个在for循环中从main调用的函数,用于从视频源中搜索面部。代码在第一次运行时完美运行,但在第二次循环中它会输出许多"相机丢帧!"错误到控制台,不再更新视频源。

我找到了导致错误的行,它是包含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 个答案:

答案 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,而不是在函数中调用imshow。请注意,&amp; inputFrame并非真正的传统指针,并且不需要您更改函数中引用inputFrame的方式