我有一个在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;
}
答案 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的方式