Esto no es posible si usa v4l (el método de captura de cv por defecto en el escritorio de Linux). El CV_CAP_PROP_FORMAT
existe, pero simplemente se ignora. Tienes que convertir las imágenes a escala de grises de forma manual. Si su dispositivo lo admite, puede volver a implementar cap_v4l.cpp
para conectar la interfaz v4l y establecer el formato en escala de grises.
En Android esto es posible con el siguiente código nativo (para el dispositivo 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);
Aquí, pasando CV_CAP_ANDROID_GREY_FRAME
al parámetro channel
de cv::VideoCapture::retrieve(cv::Mat,int)
hace que la imagen (también conocido como yuv420sp) YUV NV21 a ser de color convertido a escala de grises Esto es solo un mapeo del canal Y a la imagen en escala de grises, que no implica ninguna conversión real o memcpy
, por lo tanto muy rápido. Puede verificar este comportamiento en https://github.com/Itseez/opencv/blob/master/modules/videoio/src/cap_android.cpp#L407 y la "conversión de color" en https://github.com/Itseez/opencv/blob/master/modules/videoio/src/cap_android.cpp#L511. Estoy de acuerdo en que este comportamiento no está documentado en absoluto y es muy incómodo, pero me ahorró mucho tiempo de CPU.
La conversión de color segura no es gran cosa en OpenCV a menos que esté en sistemas integrados donde la potencia de la CPU es crucial y un cvtColor en cada bucle podría hacer que los fps se vuelvan más duros. Como con la Raspberry Pi. – Void
Esto no es completamente cierto, ver mi respuesta. –