OpenCV VideoCapture设置为灰度图像?

8

我建议不要使用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); //< ???
4个回答

6
如果你的相机支持YUV420,那么你可以直接取Y通道:http://en.wikipedia.org/wiki/YUV 如何操作已经在这里讲得很清楚了:Access to each separate channel in OpenCV 警告:使用split()函数得到的第一个Mat不一定是Y通道,所以你应该分别对它们进行imshow(),选择看起来像“真正”的灰度图像的那个。其他的会明显对比度过低。对我来说,是第二个Mat。
通常,任何相机都应该能够使用YUV420,因为直接发送RGB帧速度较慢,所以几乎每个相机都使用YUV。 :)

实际上,从YUV中检索帧并转换为灰度图像与仅处理Y通道的split()函数具有几乎相同的CPU成本。当使用split()函数而不是cvtColor时,我可以看到3%的CPU使用率降低(在ARM Cortex A9 1.1 GHz板上)。 - Pedro Batista

5

这是不可能的。以下是所有代码列表:

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。这不应该花费太多时间。


3
在OpenCV中进行颜色转换并不是什么大问题,除非你要在CPU性能至关重要的嵌入式系统上运行,每个循环中的cvtColor可能会导致帧速率急剧下降。比如在树莓派上就是这种情况。 - Void
这并不完全正确,请看我的回答。 - Ayberk Özgür

4
如果您使用的是桌面Linux上的默认cv捕获方法v4l,则不可能实现。虽然存在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通道映射到灰度图像中,不涉及任何实际转换或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时间。

0
如果你使用 <raspicam/raspicam_cv.h>]1,你就可以做到这一点。 你需要像这样打开一个设备:
RaspiCam_Cv m_rapiCamera;

使用以下代码设置您需要的任何参数:

m_rapiCamera.set(CV_CAP_PROP_FORMAT, CV_8UC1);

然后像下面这样打开流:

m_rapiCamera.open();

你只会得到一个通道。

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接