为什么 haar 级联很慢 opencv c++
Why is haar cascade very slow opencv c++
我正在使用 haar cascading
来检测正面。我有以下代码:
int main()
{
Mat image;
cv::VideoCapture cap;
cap.open(1);
int frame_idx = 0;
time_t fpsStartTime, fpsEndTime;
time(&fpsStartTime);
for (;;)
{
frame_idx = frame_idx + 1;
cap.read(image);
CascadeClassifier face_cascade;
face_cascade.load("<PATH");
std::vector<Rect> faces;
face_cascade.detectMultiScale(image, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, Size(30, 30));
// Draw circles on the detected 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(image, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);
}
cv::imshow("Detected Face", image);
char k = cv::waitKey(1);
if (k == 27)
break;
time(&fpsEndTime);
double seconds = difftime(fpsEndTime, fpsStartTime);
double fps = frame_idx / seconds;
std::string fps_txt = "FPS: " + std::to_string(fps); // fps_str.str();
cout << "FPS : " << fps_txt << endl;
}
return 0;
}
此代码运行良好,但 FPS 非常低。 FPS 约为 1fps,非常慢。我正在 运行 在 Windows 10 笔记本电脑上使用 intel i5 CPU。我相信这应该不会这么慢。
在调试模式下,它提供 ~1fps 但在发布模式下它是 4-5fps,这同样非常慢。我有 运行 一些像 pedestrian detection 这样的 openvino 演示,它在相同的硬件上使用 2 个 openvino 模型,它给出了 ~17-20fps,这非常好。
我使用的是 USB 3.0 罗技 brio 4k 相机,所以这不是低 fps 的原因。我的问题是为什么 haar 级联执行非常慢。无论如何我们可以提高它的速度并使其更有用。请帮忙。谢谢
你不应该在每个帧上(重新)加载分类器。它应该在处理帧之前加载一次。
将以下语句移出 for
循环。
CascadeClassifier face_cascade;
face_cascade.load("<PATH");
查看 OpenCV Docs 上的演示。
您能确认一下您使用的.lib 和.dll 文件是否正确吗?
我检查过 opencv_world440.lib 和 opencv_world440.dll 与 opencv_world440d.lib 和 opencv_world440d.dll 文件相比速度更快。
我的猜测是 opencv_world440d.lib & opencv_world440d.dll 用于调试速度太慢。
注意::您的库名称可能有所不同,即 opencv_world<"SomeNumber">d.lib & opencv_world<"SomeNumber">.lib
我正在使用 haar cascading
来检测正面。我有以下代码:
int main()
{
Mat image;
cv::VideoCapture cap;
cap.open(1);
int frame_idx = 0;
time_t fpsStartTime, fpsEndTime;
time(&fpsStartTime);
for (;;)
{
frame_idx = frame_idx + 1;
cap.read(image);
CascadeClassifier face_cascade;
face_cascade.load("<PATH");
std::vector<Rect> faces;
face_cascade.detectMultiScale(image, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, Size(30, 30));
// Draw circles on the detected 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(image, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);
}
cv::imshow("Detected Face", image);
char k = cv::waitKey(1);
if (k == 27)
break;
time(&fpsEndTime);
double seconds = difftime(fpsEndTime, fpsStartTime);
double fps = frame_idx / seconds;
std::string fps_txt = "FPS: " + std::to_string(fps); // fps_str.str();
cout << "FPS : " << fps_txt << endl;
}
return 0;
}
此代码运行良好,但 FPS 非常低。 FPS 约为 1fps,非常慢。我正在 运行 在 Windows 10 笔记本电脑上使用 intel i5 CPU。我相信这应该不会这么慢。
在调试模式下,它提供 ~1fps 但在发布模式下它是 4-5fps,这同样非常慢。我有 运行 一些像 pedestrian detection 这样的 openvino 演示,它在相同的硬件上使用 2 个 openvino 模型,它给出了 ~17-20fps,这非常好。
我使用的是 USB 3.0 罗技 brio 4k 相机,所以这不是低 fps 的原因。我的问题是为什么 haar 级联执行非常慢。无论如何我们可以提高它的速度并使其更有用。请帮忙。谢谢
你不应该在每个帧上(重新)加载分类器。它应该在处理帧之前加载一次。
将以下语句移出 for
循环。
CascadeClassifier face_cascade;
face_cascade.load("<PATH");
查看 OpenCV Docs 上的演示。
您能确认一下您使用的.lib 和.dll 文件是否正确吗?
我检查过 opencv_world440.lib 和 opencv_world440.dll 与 opencv_world440d.lib 和 opencv_world440d.dll 文件相比速度更快。 我的猜测是 opencv_world440d.lib & opencv_world440d.dll 用于调试速度太慢。
注意::您的库名称可能有所不同,即 opencv_world<"SomeNumber">d.lib & opencv_world<"SomeNumber">.lib