Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
opencv VideoCapture.set灰度?_Opencv - Fatal编程技术网

opencv VideoCapture.set灰度?

opencv VideoCapture.set灰度?,opencv,Opencv,我会避免使用cvtColor(帧、图像、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); //< ??? VideoCapture(0); 封盖套件(CV、封盖、道具、框架、宽

我会避免使用
cvtColor(帧、图像、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); //< ???
VideoCapture(0);
封盖套件(CV、封盖、道具、框架、宽度,420);
封盖套件(CV、封盖、支柱、框架、高度,340);
帽套(CV_cap_GREYSCALE,1);/<???

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

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).
或者(如果可能的话,使用一些实用程序)您可以设置您的相机只显示灰度图像


要将彩色图像转换为灰度,必须使用code
CV\u BGR2GRAY
调用。这应该不会花费太多时间。

如果您的相机支持YUV420,那么您可以使用Y频道:

这里很好地解释了如何做到这一点:

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


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

如果使用v4l(桌面Linux上的默认cv捕获方法),则这是不可能的。
CV\u CAP\u PROP\u格式存在,但被忽略。您必须手动将图像转换为灰度。如果您的设备支持它,您可能需要重新实现
cap_v4l.cpp
,以便与v4l接口,将格式设置为灰度

在Android上,这可以通过以下本机代码实现(对于第0台设备):

#包括
#包括
cv::摄像机(0);
摄像头->打开(0);
cv::材料目的地(480640,cv_8UC1);
如果(摄像头->抓取())
摄像头->检索(目标、CV\u CAP\u ANDROID\u灰色\u帧);

这里,将
CV\u CAP\u ANDROID\u GREY\u FRAME
传递到
CV::VideoCapture::retrieve(CV::Mat,int)
通道
参数会导致YUV NV21(又称yuv420sp)图像颜色转换为灰度。这只是Y通道到灰度图像的映射,不涉及任何实际转换或
memcpy
,因此速度非常快。您可以在中检查此行为,并在中检查“颜色转换”。我同意这种行为根本没有文档记录,非常尴尬,但它为我节省了大量CPU时间

当然,颜色转换在OpenCV中没有什么大不了的,除非你在嵌入式系统中,CPU的能力是至关重要的,而且每个循环中的CVT颜色可能会使fps下降。就像Raspberry Pi一样。这不是完全正确的,请看我的答案。实际上,在YUV上检索帧并转换为灰度与仅在Y通道上使用spit()函数的CPU成本几乎相同。在使用split函数而不是cvtColor(在ARM cortex A9 1.1 ghz板上)时,我可能会看到CPU使用率降低了3%
#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);