【问题标题】:Why convert to grayscale opencv?为什么要转换为灰度opencv?
【发布时间】:2017-03-19 06:13:01
【问题描述】:

我在 opencv 中做一些基本的人脸检测,我看到的每个示例代码都转换为灰度,然后在灰度上执行人脸检测...

起初我以为是出于性能原因,但我做了一个比较,发现没有显着的性能提升。

这段代码:

faceCascade.detectMultiScale(*image, *faces, 1.1, 3, CASCADE_SCALE_IMAGE, Size(60,60));

执行与此代码大致相同:

Mat gray;
cvtColor(*image, gray, COLOR_BGR2GRAY);
faceCascade.detectMultiScale(gray, *faces, 1.1, 3, CASCADE_SCALE_IMAGE, Size(60,60));

那么这就引出了一个问题,为什么大家都在opencv中转灰度?

谢谢

【问题讨论】:

    标签: opencv


    【解决方案1】:

    每个人都转换为灰度,因为许多函数都需要灰度。来自OpenCV documentationfaceCascade.detectMultiScale()也期待灰度:

    CascadeClassifier::detectMultiScale(const Mat& image,...)

    image - CV_8U 类型的矩阵,包含检测到对象的图像。

    CV_8U 是 1 通道图像,而 CV_8U3 是 3 通道图像。

    编辑:如果您在传递给方法之前不将其转换为灰度,OpenCV 会在后台为您完成。

    【讨论】:

    • 那为什么detectMultiScale即使我给它BGR仍然有效?
    • 你给了它一个指针。您是否尝试过用图像而不是指针来喂它?你发给我的文档也说 CV_8U 而不是 CV_8U3
    • 其实我做了更多的挖掘。在这里您可以找到后续问题的答案:answers.opencv.org/question/67416/…
    【解决方案2】:

    简而言之:

    它是必需的,但如果你不这样做,那么 OpenCv 会为你做的。

    如果您传递的是 Mat——你传递的是 CV_8U(通道)信息——他们可以为你做这件事。这很聪明。

    为什么开发人员可以编写三行代码,而您可以轻松地让他们编写一行代码?

    不过,谢谢你的回答和挖掘。

    给其他开发者的一些注意事项:

    cvtColor 在 RPI3 上大约需要 3 毫秒才能将 640x480 BGR 转换为灰度。

    如果您正在执行多个需要灰度的 openCv 方法,那么如果您转换为灰度一次 - 并将灰度传递给那些 openCv 方法,您可以获得更好的性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-19
      • 2013-10-11
      • 2015-10-07
      • 2016-09-09
      • 1970-01-01
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多