OpenCVでスプラトゥーン2の試合中の情報を解析するツールを作っている7
前回: http://blog.jiikko.com/154
前回に宣言した通り、分類器を作っている。
コマンドが動くようになるまではちょっと躓いたけど、いまは教師データの入力支援アプリを作ってひたすらデータを作っている。
データが増えるとたしかに精度があがっているっぽい。
単純なテンプレートマッチングによる判定よりも精度が高くなりそうという気がする。
opencv-rubyで、分類器を読み込む過程でxmlのフォーマット起因のエラーが起きたので、自分がやっている動かし方を書いておく。
分類器を作成するには、opencv_createsamplesでvectorファイルを作成して、opencv_traincascadeで分類器を作成する。
/opt/homebrew/opt/opencv@2/bin/opencv_createsamples -info positive.dat -vec positive.vec -w #{SIZE} -h #{SIZE} -num 2000
/opt/homebrew/opt/opencv@3/bin/opencv_traincascade -data tmp/model -vec positive.vec -bg negative.dat -numPos #{num_pos} -numNeg #{num_neg} -w #{SIZE} -h #{SIZE} -baseFormatSave
opencv@3/bin/opencv_traincascade
と -baseFormatSave
を使っているのがミソ。
生成した分類器は以下のように使う。
paths = ["1621691390.jpg"]
paths.each.with_index(1) do |image_path, index|
image = OpenCV::CvMat.load(image_path).copy
image = ImageProcess::Crop.ikatako_meter_with_padding(image)
if detector.detect_objects(image).size.zero?
puts "ないです"
else
puts "あります"
detector.detect_objects(image).each { |rect|
puts " detectded!!!!!!!!!!!!!"
image.rectangle! rect.top_left, rect.bottom_right, :color => OpenCV::CvColor::Red
}
image.save "./tmp/cascase/#{index}.jpg"
end
end
-
category:
- 日記 tags: