opencv 是否设置灰度?

vfh0ocws  于 2022-11-15  发布在  其他
关注(0)|答案(4)|浏览(198)

我会避免将摄像机拍摄的每个帧转换为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); //< ???
92dk7w1h

92dk7w1h1#

如果您的摄像机支持YUV420,那么您可以只取Y通道:http://en.wikipedia.org/wiki/YUV
如何做到这一点是很好的解释在这里:Access to each separate channel in OpenCV
警告:Y通道可能不是你用split()得到的第一个Mat,所以你应该分别对它们做一个imshow(),并选择看起来像“真实的的”灰色图像的那个。其他的只是没有对比度,所以很明显。对我来说,这是第二个Mat。
通常,任何相机都应该能够做YUV420,因为直接以RGB发送帧速度较慢,所以YUV几乎被每台相机使用。:)

6rqinv9w

6rqinv9w2#

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

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

ggazkfy8

ggazkfy83#

如果您使用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(a.k.a yuv420sp)图像颜色转换为灰度。这只是Y通道到灰度图像的Map,不涉及任何实际转换或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时间。

kg7wmglp

kg7wmglp4#

如果您使用〈raspicam/raspicam_cv.h〉] 1,您可以做到这一点。您需要像这样打开一个设备:

RaspiCam_Cv m_rapiCamera;

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

m_rapiCamera.set(CV_CAP_PROP_FORMAT, CV_8UC1);

然后打开下面的流像:

m_rapiCamera.open();

而且你只会得到一个频道。
祝你好运!

相关问题