前回に引き続き、ruby-opencv でカメラデバイスをソースにしてリアルタイム検知をやってみたいと思います。
使っているカメラ
Microsoft 社製の USB 接続 HD ウェブカムです。エンドユーザ向けにしてはちょっと高めですが画質も良いです。LMDE2 では UVC で使えています。
コード
カメラデバイスを使うには 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 上のウィンドウを撮影しているせいだと思います。 検知している時より、してない時の方がフレームレートが落ちてる気がするのはなぜだろう…。