2017-03-17 141 views
1

我在做一些基本的人臉檢測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中?

謝謝

回答

1

每個人都轉換爲灰度,因爲許多函數都希望灰度。從OpenCV documentationfaceCascade.detectMultiScale()還預計灰階:

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

圖像 - 包含其中檢測對象的圖像的類型CV_8U的矩陣。

CV_8U是1通道圖像,而不是CV_8U3,這將是一個3通道圖像。

編輯:如果在傳遞給方法之前沒有將它轉換爲灰度,OpenCV會爲您做好準備。

+0

那麼爲什麼detectMultiScale仍然工作,即使我給它BGR? – g00dnatur3

+0

你給它一個指針。你有沒有嘗試用圖像而不是指針餵它? 你發給我的文件也說CV_8U而不是CV_8U3 – m3h0w

+0

其實我做了更多的挖掘。在這裏你可以找到你的後續問題的答案:http://answers.opencv.org/question/67416/is-grayscale-image-still-required-in-cascadeclassifierdetectmultiscale/ – m3h0w

0

在一言以蔽之:

這是必要的,但如果你不這樣做,那麼將OpenCV的爲你做。

如果你正在通過Mat--你傳遞了CV_8U(頻道)信息 - 他們可以爲你做......這很聰明。

爲什麼開發人員編寫三行代碼時,您可以輕鬆讓他們編寫一行代碼?

無論如何,謝謝你的答案和挖掘。

一些筆記對其他開發人員:

cvtColor大約需要3毫秒在RPI3轉換一個640×480 BGR爲灰度。

如果您正在執行多個需要灰度的openCv方法,那麼如果您只轉換一次灰度級並將灰度傳遞給那些openCv方法,則可以獲得更好的性能。