前日に引き続き、ruby-opencv でチェッカーボードを認識させてみたいと思います。チェッカーボードとは市松模様のパターンのことで、これを認識することにより映像中の3次元座標系(の行列)を確定させることができ、映像の上に3Dモデルをマッピングする第一歩となります。
1. コード
checkerboard.rb
#!/usr/bin/ruby
require 'opencv'
include OpenCV
if ARGV.size < 1
STDERR.puts "#{$0} srcfile [destfile]"
exit 1
end
src = ARGV.shift
dest = nil
if ARGV.size >= 1
dest = ARGV.shift
end
mat = CvMat.load(src, 1)
gray = mat.BGR2GRAY
pattern_size = CvSize.new(7, 10)
corners, found = gray.find_chessboard_corners(pattern_size, CV_CALIB_CB_ADAPTIVE_THRESH)
if found
puts "found"
corners = gray.find_corner_sub_pix(corners, CvSize.new(3, 3), CvSize.new(-1, -1), CvTermCriteria.new(20, 0.03))
end
img = mat.draw_chessboard_corners(pattern_size, corners, found)
if dest
img.save dest
else
w = GUI::Window.new('Result')
w.show img
GUI::wait_key
end
映像をグレイスケールイメージに変換してから、 find_chessboard_corners
でチェスボードを検知します。チェスボードのパターンはここと同じく 7×10 サイズのものでやってみました。
2. 実行
ruby checkerboard.rb src.jpg dest.jpg
とタイプして実行すると、
のように、ちゃんとパターンを認識できています。カメラから遠ざけると
のように検出した点に沿って線が出てきます。ここで検知した点列と各々の2次元座標値から3次元座標系を逆算していき…たいところですが、また次回です。
あ、部屋が汚いのは見ないでください… _(┐「ε:)_
[…] 前回に引き続き、ruby-opencv でカメラデバイスをソースにしてリアルタイム検知をやってみたいと思います。 […]