Opencv-哈尔级联-人脸跟踪非常慢
Opencv - Haar cascade - Face tracking is very slow
我开发了一个使用OpenCV库通过相机跟踪人脸的项目。我使用haar级联和haarcascade_frontalface_alt.xml
来检测人脸。
我的问题是,如果从webcome捕获的图像不包含任何人脸,那么检测人脸的过程会非常缓慢,所以相机连续显示给用户的图像会延迟。
我的源代码:
void camera()
{
String face_cascade_name = "haarcascade_frontalface_alt.xml";
String eye_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
CascadeClassifier face_cascade;
CascadeClassifier eyes_cascade;
String window_name = "Capture - Face detection";
VideoCapture cap(0);
if (!face_cascade.load(face_cascade_name))
printf("--(!)Error loadingn");
if (!eyes_cascade.load(eye_cascade_name))
printf("--(!)Error loadingn");
if (!cap.isOpened())
{
cerr << "Capture Device ID " << 0 << "cannot be opened." << endl;
}
else
{
Mat frame;
vector<Rect> faces;
vector<Rect> eyes;
Mat original;
Mat frame_gray;
Mat face;
Mat processedFace;
for (;;)
{
cap.read(frame);
original = frame.clone();
cvtColor(original, frame_gray, CV_BGR2GRAY);
equalizeHist(frame_gray, frame_gray);
face_cascade.detectMultiScale(frame_gray, faces, 2, 0,
0 | CASCADE_SCALE_IMAGE, Size(200, 200));
if (faces.size() > 0)
rectangle(original, faces[0], Scalar(0, 0, 255), 2, 8, 0);
namedWindow(window_name, CV_WINDOW_AUTOSIZE);
imshow(window_name, original);
}
if (waitKey(30) == 27)
break;
}
}
Haar分类器本质上相对较慢。此外,由于detectMultiScale
在OpenCV中是并行化的,因此您无法对算法本身进行太多优化。
关于你的代码,唯一需要注意的是:你真的用等于Size(200, 200)
的minSize
检测到过一些人脸吗?当然,minSize
越大,性能越好。
在检测到任何东西之前尝试缩放图像:
const int scale = 3;
cv::Mat resized_frame_gray( cvRound( frame_gray.rows / scale ), cvRound( frame_gray.cols / scale ), CV_8UC1 );
cv::resize( frame_gray, resized_frame_gray, resized_frame_gray.size() );
face_cascade.detectMultiScale(resized_frame_gray, faces, 1.1, 3, 0 | CASCADE_SCALE_IMAGE, Size(20, 20));
(不要忘记将minSize
更改为更合理的值,并将检测到的面部位置转换为真实比例)
对于任何图像处理算法来说,将图像大小缩小2、3、5倍都是一个很大的性能提升,尤其是在涉及到一些昂贵的东西(如检测)时。
正如前面所提到的,如果调整大小不起作用,可以尝试使用探查器获取其他一些瓶颈。
你也可以切换到LBP分类器,它相对更快,但不太准确。
希望它能有所帮助。
可能对您有用:
有一个Simd库,它实现了HAAR和LBP级联分类器。它可以使用OpenCV中的标准HAAR和LBP cascade。该实现使用SSE4.1、AVX2和NEON(ARM)进行了SIMD优化,因此其工作速度是原始OpenCV实现的2-3倍。
我经常使用Haar级联分类器,在配备4GB Ram和2GHz CPU的Intel PC/Mac(Windows/Ubuuntu/OS X)上,在640x480图像上轻松获得每秒15帧的人脸检测。您的配置是什么?
这里有一些你可以尝试的东西。
-
您不必在每个帧中创建窗口(
namedWindow(window_name, CV_WINDOW_AUTOSIZE);
)。只需先创建它并更新图像。 -
你可以试试它在没有直方图均衡的情况下运行的速度。网络摄像头并不总是必需的。
-
正如上面Micka所建议的,您应该检查您的程序是在调试模式还是发布模式下运行。
-
使用探查器查看瓶颈是否为.
-
如果你还没有这样做,如果你对人脸检测和绘制矩形进行评论,你有没有测量过帧速率?
您可以使用LBP级联来检测人脸。它的重量要轻得多。您可以在OpenCV源目录中找到lbpcascade_frontalface.xml
。
- OpenGL大的3D纹理(>2GB)非常慢
- 光线跟踪器灯光反射错误
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 人脸跟踪arduino代码的优化
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 跟踪滚动条上的鼠标事件
- 如何使用新运算符跟踪在循环中创建的 QLabel
- G++ C++17 类模板参数推导在非常特殊的情况下不起作用
- 使用浮点数和双精度数的非常小数字的数学
- C++:跟踪类对象
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 跟踪日志中的T.11803()是什么意思?
- 在打开多个其他窗口时使用全屏窗口时帧速率非常低
- 我从int x[3]得到的一个非常奇怪的输出;
- 反向迭代器在C++中非常奇怪的行为
- 我能做些什么来跟踪矢量元素?
- 两个进程可以通过跟踪附加到同一个 PID 吗?
- 提升堆栈跟踪不显示函数名称和行号
- Opencv-哈尔级联-人脸跟踪非常慢
- 使用SURF和FLANN跟踪标记的结果非常糟糕