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.
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
Das stimmt nicht ganz, siehe meine Antwort. –