我在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中转换为灰度?
由于
答案 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方法。