【问题标题】:opencv VideoCapture.set greyscale?opencv VideoCapture.set 灰度?
【发布时间】:2012-06-22 15:39:30
【问题描述】:

我会避免用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); //< ???

【问题讨论】:

    标签: opencv


    【解决方案1】:

    如果您使用 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 传递给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 时间。

    【讨论】:

      【解决方案2】:

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

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

      或者(如果可能,使用一些实用程序)您可以将相机设置为仅显示灰度图像。

      要将彩色图像转换为灰度图像,您必须使用代码CV_BGR2GRAY 调用cvtColor。这应该不会花费太多时间。

      【讨论】:

      • 当然颜色转换在 OpenCV 中没什么大不了的,除非你在嵌入式系统上,CPU 能力至关重要,每个循环中的 cvtColor 可能会使 fps 下降。就像树莓派一样。
      • 这不完全正确,看我的回答。
      【解决方案3】:

      如果您的相机支持 YUV420,那么您可以只使用 Y 通道: http://en.wikipedia.org/wiki/YUV

      如何做到这一点在这里得到了很好的解释: Access to each separate channel in OpenCV

      警告:Y 通道可能不是您使用 split() 获得的第一个 Mat,因此您应该分别对所有这些 Mat 执行 imshow() 并选择看起来像“真实”灰色图像的那个。其他的将只是 waaaay 出来对比,所以它会很明显。对我来说,这是第二张垫子。

      通常,任何相机都应该能够执行 YUV420,因为直接以 RGB 发送帧的速度较慢,因此几乎所有相机都使用 YUV。 :)

      【讨论】:

      • 实际上,在 YUV 上检索帧并转换为灰度与使用 spit() 函数仅在 Y 通道上工作的 CPU 成本几乎相同。使用 split 函数而不是 cvtColor(在 ARM cortex A9 1.1 ghz 板上)时,我可能会看到 CPU 使用率减少了 3%
      猜你喜欢
      • 2019-12-30
      • 2016-09-09
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 2018-11-18
      • 1970-01-01
      • 2014-09-15
      相关资源
      最近更新 更多