2012-06-22 13 views
7

würde ich vermeiden, jeden Frame von Videokamera mit cvtColor(frame, image, CV_RGB2GRAY);
konvertiert zu konvertieren Gibt es trotzdem VideoCapture setzen, um direkt in Graustufen zu bekommen?opencv VideoCapture.set Graustufen?

Beispiel:

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); //< ??? 

Antwort

3

Das ist unmöglich. Hier ist die Liste aller Codes:

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). 

Oder (wenn es möglich ist, mit einigen Utilities) Sie können Setup der Kamera nur Graustufenbild zu zeigen.

Um ein Farbbild in Graustufen zu konvertieren, müssen Sie cvtColor mit dem Code CV_BGR2GRAY anrufen. Dies sollte nicht viel Zeit in Anspruch nehmen.

+2

Sicher Farbumwandlung ist keine große Sache in OpenCV, wenn Sie auf Embedded-Systemen sind in die CPU-Leistung in jeder Schleife von entscheidenden Bedeutung und ein cvtColor ist, könnte die fps hart nach unten gehen zu machen. Wie mit dem Raspberry Pi. – Void

+0

Das stimmt nicht ganz, siehe meine Antwort. –

6

Wenn Ihre Kamera unterstützt YUV420 dann könnten Sie nehmen nur den Y-Kanal: http://en.wikipedia.org/wiki/YUV

Wie das zu tun, ist hier gut erklärt: Access to each separate channel in OpenCV

Achtung: der Y-Kanal ist vielleicht nicht die erste Mat sein Sie erhalten mit split() also sollten Sie eine IMshow() von allen separat machen und wählen Sie das, das wie das "echte" graue Bild aussieht. Die anderen werden einfach nicht im Kontrast sein, also wird es offensichtlich sein. Für mich war es die zweite Matte.

Normalerweise sollte jede Kamera in der Lage sein YUV420 zu tun, da Frames direkt in RGB Senden langsamer ist, so wird YUV ziemlich viel von fast jeder Kamera verwendet. :)

+0

Eigentlich Frames auf YUV Abrufen und Umwandlung in Graustufen hat ziemlich die gleich CPU-Kosten, wie die Spieß() Funktion nur auf dem Y-Kanal zu arbeiten. Ich kann vielleicht eine Reduktion auf 3% CPU-Auslastung sehen, wenn die Split-Funktion statt cvtColor (auf einem ARM Cortex A9 1.1 ghz Board) mit –

3

Dies ist nicht möglich, wenn Sie v4l (das Standard-cv-Capture-Verfahren auf Desktop-Linux) verwenden. Die CV_CAP_PROP_FORMAT existiert, wird aber einfach ignoriert. Sie müssen die Bilder manuell in Graustufen konvertieren. Wenn Ihr Gerät diese Funktion unterstützt, können Sie cap_v4l.cpp, um neu zu implementieren v4l Schnittstelle das Format auf Graustufen.

Auf Android dies möglich ist, mit dem folgenden nativen Code (für die 0-te Gerät):

#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); 

Hier vorbei CV_CAP_ANDROID_GREY_FRAME zum channel Parameter von cv::VideoCapture::retrieve(cv::Mat,int) bewirkt, dass die YUV NV21 (aka yuv420sp) Bildfarbe sein in Graustufen konvertiert. Dies ist nur eine Abbildung des Y-Kanals auf das Graustufenbild, die keine tatsächliche Konvertierung oder memcpy erfordert, daher sehr schnell. Sie können dieses Verhalten in https://github.com/Itseez/opencv/blob/master/modules/videoio/src/cap_android.cpp#L407 und die "Farbkonvertierung" in https://github.com/Itseez/opencv/blob/master/modules/videoio/src/cap_android.cpp#L511 überprüfen. Ich stimme zu, dass dieses Verhalten überhaupt nicht dokumentiert ist und sehr peinlich ist, aber es hat mir viel CPU-Zeit gespart.