开发者

Grabbing snapshots from webcams in ruby

How can I take snapshots from a webcam in ruby? I kno开发者_JAVA技巧w the webcam device is on /dev/video0, but how do I get a picture from it?


I'm the developer of Hornetseye. You can capture images with the V4L2-interface of HornetsEye as follows.

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'

Currently supported colourspaces are UYVY, YUYV, YUV420, GREY, RGB24. Note that other colourspaces such as MJPEG are not supported at the moment.


I've never actually used it but hornetseye looks good. This question has also already been asked here


Since you're using Linux, try videodog. It's a small program, which does one thing and does that well: capturing a frame from your /dev/video0 device. From that point you can use any Ruby technique you want to process the JPEG image you got from videodog.


The Video4Linux API involves sending special ioctls to the /dev/video* device, with data in packed structures; not something easy to do from Ruby. (It's not all that much fun from C, either.)

ruby-v4l is an extension library for capture pictures in Ruby using Video4Linux.

Orphaned in Debian because its maintainer hasn't been active since 2005, so if it doesn't work I don't think you'll be able to get much support.

A more modern solution would probably be to create proper libv4l binding for Ruby. However, I don't know of any present work on that.


With the ruby-opencv gem:

require "opencv"

capture = OpenCV::CvCapture.open
sleep 1 # Warming up the webcam
capture.query.save("image.jpg")
capture.close

And to install OpenCV on macOS: brew install homebrew/science/opencv --HEAD.


I've written a small wrapper-gem for the new OpenCV since ruby-opencv is stuck at OpenCV2, which isn't available on some modern systems. It should work on both macOS and Linux, provided OpenCV is installed.

Here it is: https://github.com/khasinski/framegrabber

In your case it would be:

Framegrabber.open(0) # 0 is the device id
image = Framegrabber.grab_image # Gets you a Magick::Image object
Framegrabber.release # turns off the webcam
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜