Ruby と OpenCV でチェッカーボード検知

前日に引き続き、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 でチェッカーボード検知」への1件のフィードバック

コメントを残す

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