我会避免将摄像机拍摄的每一帧转换为是否可以直接cvtColor(frame, image, CV_RGB2GRAY);
设置VideoCapture
为灰度?
例子:
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); //< ???
我会避免将摄像机拍摄的每一帧转换为是否可以直接cvtColor(frame, image, CV_RGB2GRAY);
设置VideoCapture
为灰度?
例子:
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); //< ???
如果您的相机支持 YUV420,那么您可以选择 Y 通道: http ://en.wikipedia.org/wiki/YUV
如何做到这一点在这里得到了很好的解释: Access to each separate channel in OpenCV
警告:Y 通道可能不是您使用 split() 获得的第一个 Mat,因此您应该分别对所有这些 Mat 进行 imshow() 并选择看起来像“真实”灰色图像的那个。其他的将只是 waaaay 出来对比,所以它会很明显。对我来说,这是第二个垫子。
通常,任何相机都应该能够执行 YUV420,因为直接以 RGB 发送帧的速度较慢,因此几乎所有相机都使用 YUV。:)
这是不可能的。以下是所有代码的列表:
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).
或者(如果可能,使用一些实用程序)您可以将相机设置为仅显示灰度图像。
要将彩色图像转换为灰度,您必须使用代码调用cvtColorCV_BGR2GRAY
。这应该不会花费太多时间。
如果您使用 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
给channel
参数cv::VideoCapture::retrieve(cv::Mat,int)
会导致 YUV NV21(又名 yuv420sp)图像被颜色转换为灰度。这只是 Y 通道到灰度图像的映射,不涉及任何实际转换memcpy
,因此非常快。您可以在https://github.com/Itseez/opencv/blob/master/modules/videoio/src/cap_android.cpp#L407和https://github.com/Itseez/中的“颜色转换”中检查此行为opencv/blob/master/modules/videoio/src/cap_android.cpp#L511。我同意这种行为根本没有记录并且非常尴尬,但它为我节省了很多 CPU 时间。