Ruby と OpenCV でカメラを使う

前回に引き続き、ruby-opencv でカメラデバイスをソースにしてリアルタイム検知をやってみたいと思います。

使っているカメラ

Microsoft 社製の USB 接続 HD ウェブカムです。エンドユーザ向けにしてはちょっと高めですが画質も良いです。LMDE2 では UVC で使えています。

camera

コード

カメラデバイスを使うには OpenCV::CvCapture.open() メソッドを使います。引数の番号はデバイス番号。対象のデバイスが /dev/video0 だったら 0 を指定すれば良いようです。

camera.rb

#!/usr/bin/env ruby

require 'opencv'
include OpenCV

camera = CvCapture.open(0)
camera.width = 320
camera.height = 240

window = GUI::Window.new('camera')
pattern_size = CvSize.new(7, 10)

while true

  image = camera.query
  gray = image.BGR2GRAY
  corners, found = gray.find_chessboard_corners(pattern_size, CV_CALIB_CB_ADAPTIVE_THRESH)

  if found
    corners = gray.find_corner_sub_pix(corners, CvSize.new(3, 3), CvSize.new(-1, -1), CvTermCriteria.new(20, 0.03))
    result = image.draw_chessboard_corners(pattern_size, corners, found)
    window.show result
  else
    window.show image
  end

  key = GUI::wait_key 100
  break if key == 'q'
end

CvCapture#query() メソッドで取得すると IplImage オブジェクトが返ってくるので、あとは前回と同様にチェッカーボード検知・描画を行なっているだけです。タイムアウト付きのキー入力待ち GUI::wait_key() で 100 ミリ秒待って、 Q キーが押下されなければ繰り返します。

実行

ruby camera.rb

実行するとこんな感じ↓

画面がちらついているのは、GTK recordMyDesktop で Cinnamon 上のウィンドウを撮影しているせいだと思います。 検知している時より、してない時の方がフレームレートが落ちてる気がするのはなぜだろう…。

コメントを残す

メールアドレスが公開されることはありません。