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