2012-06-22 40 views
7

我會避免將視頻攝像機拍攝的每一幀與cvtColor(frame, image, CV_RGB2GRAY);
是否有反正設置VideoCapture直接得到灰度?opencv VideoCapture.set greyscale?

實施例:

VideoCapture cap(0); 

cap.set(CV_CAP_PROP_FRAME_WIDTH,420); 
cap.set(CV_CAP_PROP_FRAME_HEIGHT,340); 
cap.set(CV_CAP_GREYSCALE,1); //< ??? 

回答

3

這是不可能的。這裏的所有代碼的列表:

CV_CAP_PROP_POS_MSEC - position in milliseconds from the file beginning 
CV_CAP_PROP_POS_FRAMES - position in frames (only for video files) 
CV_CAP_PROP_POS_AVI_RATIO - position in relative units (0 - start of the file, 1 - end of the file) 
CV_CAP_PROP_FRAME_WIDTH - width of frames in the video stream (only for cameras) 
CV_CAP_PROP_FRAME_HEIGHT - height of frames in the video stream (only for cameras) 
CV_CAP_PROP_FPS - frame rate (only for cameras) 
CV_CAP_PROP_FOURCC - 4-character code of codec (only for cameras). 

或(如果可能的話,使用一些實用工具),你可以設置你的相機,只顯示灰度圖像。

要將彩色圖像轉換爲灰度圖,您必須撥打cvtColor並使用代碼CV_BGR2GRAY。這不應該花費太多時間。

+2

在OpenCV中,確實的顏色轉換沒有什麼大不了的,除非你在嵌入式系統中CPU的能力是至關重要的,每個循環中的cvtColor都會使fps變得很難。就像樹莓派一樣。 – Void

+0

這不完全正確,請參閱我的答案。 –

6

如果您的相機支持YUV420,那麼你可以只取Y通道: http://en.wikipedia.org/wiki/YUV

如何做到這一點很好地說明如下: Access to each separate channel in OpenCV

警告:Y通道可能不是第一個墊你得到了split(),所以你應該單獨做一個imshow(),並選擇一個看起來像「真實」的灰色圖像。其他人只會失去對比,所以顯而易見。對我來說,這是第二塊墊子。因爲在RGB中直接發送幀速度比較慢,所以幾乎所有相機都使用YUV。通常情況下,任何相機都應該能夠使用YUV420。 :)

+0

實際上,檢索YUV幀並轉換爲灰度級與使用spit()函數僅處理Y通道的CPU成本幾乎相同。 當使用split函數代替cvtColor(在ARM cortex A9 1.1 ghz板上)時,我可以看到CPU使用率降低3% –

3

如果您使用v4l(桌面Linux上的默認cv捕獲方法),則這是不可能的。 CV_CAP_PROP_FORMAT存在但簡單地被忽略。您必須手動將圖像轉換爲灰度。如果您的設備支持它,您可能需要重新實現cap_v4l.cpp以便通過v4l接口將格式設置爲灰度。

在Android這是可能的用下面的本機代碼(對於第0個設備):

#include<opencv2/highgui/highgui.hpp> 
#include<opencv2/highgui/highgui_c.h> 

cv::VideoCapture camera(0); 
camera->open(0); 
cv::Mat dest(480,640,CV_8UC1); 
if(camera->grab()) 
    camera->retrieve(dest,CV_CAP_ANDROID_GREY_FRAME); 

這裏,傳球CV_CAP_ANDROID_GREY_FRAME到的cv::VideoCapture::retrieve(cv::Mat,int)channel參數將導致YUV NV21(又名yuv420sp)圖像是彩色轉換爲灰度。這僅僅是Y通道到灰度圖像的映射,其不涉及任何實際的轉換或因此非常快速。您可以在https://github.com/Itseez/opencv/blob/master/modules/videoio/src/cap_android.cpp#L407https://github.com/Itseez/opencv/blob/master/modules/videoio/src/cap_android.cpp#L511中檢查此行爲和「顏色轉換」。我同意這種行爲根本沒有記錄,非常尷尬,但它爲我節省了大量的CPU時間。