【问题标题】:Why is haar cascade very slow opencv c++为什么haar级联非常慢opencv c ++
【发布时间】:2019-11-30 04:29:29
【问题描述】:

我正在使用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,非常慢。我在配备英特尔 i5 CPU 的 Windows 10 笔记本电脑上运行它。我相信这不应该这么慢。

在调试模式下,它提供 ~1fps,但在发布模式下,它是 4-5fps,这又是非常慢的。我已经运行了一些 openvino 演示,例如 pedestrian detection,它在相同的硬件上使用 2 个 openvino 模型,它提供了 ~17-20fps,非常好。

我使用的是 USB 3.0 罗技 brio 4k 相机,因此这不是 fps 低的原因。我的问题是为什么 haar 级联执行速度非常慢。无论如何,我们可以提高它的速度并使其更可用。请帮忙。谢谢

【问题讨论】:

  • haar 级联分类器检测成本很高。 OpenVINO 针对英特尔硬件进行了高度优化,并且可能使用 AVX 指令(并且可能会减少输入大小)。您是否尝试过使用 IPP 的 openCV?如果分辨率仍然足够大,您可以调整图像大小以降低计算复杂度。
  • 去掉cv::waitKey(1)imshow的速度是多少?

标签: c++ opencv haar-classifier


【解决方案1】:

您不应该(重新)在每个帧上加载分类器。它应该在处理帧之前加载一次。

将以下语句移出for 循环。

CascadeClassifier face_cascade;
face_cascade.load("<PATH");

OpenCV Docs 上查看演示。

【讨论】:

  • 哦,是的,我同意,但同样没有太大改善。我仍然在调试中获得 1-2fps 和在发布模式下获得 6-7fps。
  • @SAndrew 请在您的机器上运行我链接到的演示,并将其 FPS 与您的进行比较。
【解决方案2】:

您能否确认您使用的 .lib 和 .dll 文件是否正确?

我已经检查并看到 opencv_world440.lib 和 opencv_world440.dll 与 opencv_world440d.lib 和 opencv_world440d.dll 文件相比提供了更快的速度。 我的猜测是 opencv_world440d.lib & opencv_world440d.dll 是用来调试的,速度太慢了。

注意::您的库名称可能会有所不同,即 opencv_worldd.lib & opencv_world.lib

【讨论】:

  • 当我改变这个时,我得到了很多“未解析的外部符号”错误。并且项目不会构建
猜你喜欢
  • 2015-01-08
  • 1970-01-01
  • 2021-10-21
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 2019-01-21
相关资源
最近更新 更多