如何在 ruby 中从网络摄像头拍摄快照?我知道网络摄像头设备位于 /dev/video0,但如何从中获取图片?
5 回答
我是Hornetseye的开发者。您可以使用 HornetEye 的 V4L2 接口捕获图像,如下所示。
require 'rubygems'
require 'hornetseye_v4l2'
require 'hornetseye_xorg'
require 'hornetseye_rmagick'
include Hornetseye
input = V4L2Input.new '/dev/video0'
img = X11Display.show { input.read }
img.to_ubytergb.save_ubytergb 'test.png'
目前支持的色彩空间有 UYVY、YUYV、YUV420、GREY、RGB24。请注意,目前不支持其他色彩空间,例如 MJPEG。
我从来没有真正使用过它,但hornetseye看起来不错。这个问题也已经在这里问过
Video4Linux API涉及向设备发送特殊的ioctl/dev/video*
,数据采用打包结构;用 Ruby 做这件事并不容易。(C 语言也没有那么有趣。)
ruby-v4l是一个扩展库,用于使用 Video4Linux 在 Ruby 中捕获图片。
在 Debian 中成为孤儿,因为它的维护者自 2005 年以来一直没有活跃,所以如果它不起作用,我认为您将无法获得太多支持。
一个更现代的解决方案可能是为 Ruby 创建适当的libv4l绑定。但是,我不知道目前有这方面的工作。
由于您使用的是 Linux,请尝试使用videodog。这是一个小程序,它只做一件事并且做得很好:从 /dev/video0 设备捕获帧。从那时起,您可以使用任何您想要处理从 videodog 获得的 JPEG 图像的 Ruby 技术。
使用ruby-opencv
宝石:
require "opencv"
capture = OpenCV::CvCapture.open
sleep 1 # Warming up the webcam
capture.query.save("image.jpg")
capture.close
并在 macOS 上安装 OpenCV brew install homebrew/science/opencv --HEAD
:.