为什么要转换为灰度opencv?

时间:2017-03-17 22:17:53

标签: opencv

我在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中转换为灰度?

由于

2 个答案:

答案 0 :(得分:2)

每个人都转换为灰度,因为许多功能都需要灰度。来自OpenCV documentation faceCascade.detectMultiScale()也需要灰度:

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

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

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

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

答案 1 :(得分:0)

简而言之:

这是必要的,但如果你不这样做,那么OpenCv会为你做这件事。

如果您正在传递Mat--您正在传递CV_8U(频道)信息 - 他们可以为您做这件事..这很聪明。

为什么开发人员会编写三行代码,何时可以轻松地编写一行代码?

尽管如此,谢谢你的回答和挖掘。

其他开发人员的一些注意事项:

cvtColor在RPI3上花费大约3ms将640x480 BGR转换为灰度。

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