🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

529閲覧

競輪選手の検出 アプローチ方法を教えて下さい

AndoJun

総合スコア41

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2019/11/08 15:06

前提・実現したいこと

OpenCVを使い、競輪選手を検出し、選手間の位置を把握したいと考えています。
競輪選手を検出するにはどの手法を用いれば良いでしょうか?
画像解析のアプローチ方法を教えて下さい。

発生している問題・エラーメッセージ

選手は1番から9番まで色分けされている事を利用して色検出させましたが、他のものを検出します。
イメージ説明

該当のソースコード

java

1import org.opencv.core.Core; 2import org.opencv.core.Mat; 3import org.opencv.core.Point; 4import org.opencv.core.Scalar; 5import org.opencv.imgcodecs.Imgcodecs; 6import org.opencv.imgproc.Imgproc; 7 8public class TestRacerColors { 9 10 public static void main(String[] args) { 11 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 12 13 String[] colors = new String[] {"white","black","red","blue","yellow","green","orange","pink","purple"}; 14 15 Scalar[] sBasic = new Scalar[] { new Scalar( 0, 0, 255), new Scalar( 0, 0, 0), new Scalar( 0, 255, 255), new Scalar( 80, 255, 255), new Scalar(30, 255, 255), new Scalar(60, 255, 255), new Scalar(20, 255, 255), new Scalar(175, 60, 255), new Scalar(150, 120, 170)}; 16 Scalar[] sStart = new Scalar[] { new Scalar( 0, 0, 0), new Scalar( 0, 0, 0), new Scalar(170, 50, 150), new Scalar(100, 50, 150), new Scalar(10, 50, 150), new Scalar(30, 50, 150), new Scalar( 0, 50, 150), new Scalar(160, 50, 150), new Scalar(120, 50, 80)}; 17 Scalar[] eEnd = new Scalar[] { new Scalar(179, 5, 255), new Scalar(179, 255, 80), new Scalar(180,255, 255), new Scalar(120, 255, 255), new Scalar(25, 255, 255), new Scalar(80, 255, 255), new Scalar(15, 255, 255), new Scalar(170,255, 255), new Scalar(135, 255, 255)}; 18 int idx = 0; 19 20 Mat image = Imgcodecs.imread("image_013.png"); 21 Imgproc.cvtColor(image, image, Imgproc.COLOR_BGR2HSV); 22 Mat result = image.clone(); 23 24 for(String color:colors) { 25 Mat mask = new Mat(); 26 Core.inRange(image, sStart[idx], eEnd[idx], mask); 27 String[] values = MatHelper.getStat(mask); 28 29 // 面積最大ブロブの中心座標を取得 30 Point center = new Point(); 31 center.x = Double.parseDouble(values[0]) + ( Double.parseDouble(values[2]) / 2 ); 32 center.y = Double.parseDouble(values[1]) + ( Double.parseDouble(values[3]) / 2 ); 33 34 // 該当箇所を丸で囲う 35 Imgproc.circle(result, center, 30, sBasic[idx], 3, Imgproc.LINE_AA); 36 37 Imgproc.cvtColor(mask, mask, Imgproc.COLOR_GRAY2BGRA); 38 Imgcodecs.imwrite("image_013_" + color + ".png", mask); 39 idx++; 40 } 41 Imgproc.cvtColor(result, result, Imgproc.COLOR_HSV2BGR); 42 Imgcodecs.imwrite("image_013_new.png", result); 43 } 44} 45

試したこと

Rangeの値を何回か変えて実行しましたが、改善されませんでした。
カスケード分類器によるUpperBody検索を実行しましたが、改善されませんでした。
DNNの利用を検討しています。

補足情報(FW/ツールのバージョンなど)

0penCV 4.1.2
Java 1.8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/11/08 23:05

もっと簡単な題材にしては…
guest

回答2

0

アイディアを適当に羅列してみます。(記載順に意味はありません。)

  • テロップとか不要な部分はマスキングしてから処理をする
  • まずは2値化して形状を検出してから色判定する
  • 楕円を検出して自転車の位置を当たり付ける(横からの画像が多くないと出来ない)
  • トラック(コース)を検出してからその領域内だけを選手検出対象にする

投稿2019/11/09 01:19

oikashinoa

総合スコア2826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AndoJun

2019/11/09 12:20 編集

ご回答ありがとうございます。 コースのどの部分を走っているかを知る必要があり、トラックの検出は別途行ないました。 色による単純な二値化しか試していなかったので適応的しきい値処理を試そうと思います。
oikashinoa

2019/11/09 12:33

おもしろい題材なんでぜひ頑張ってみて下さい!
guest

0

ベストアンサー

Java使いではありませんが手法は参考になると思います。

カスケード分類器によるUpperBody検索を実行しましたが、改善されませんでした。

人の上部のみの検索、ということでしょうか?
自転車に乗っていますので、自転車と人をコミコミで物体検出をしてはいかがでしょうか?
正解画像をもとに背景と合成して、データ増強した画像で学習させる、
ということが(少なくともPythonでは)OpenCVでできます。
HAAR-LIKEのキーワードで探すと色々出てきます。

人が移っていると思しき部分からさらに同アルゴリズムの頭の検出をすれば、
それなりの確率で頭の位置のみを検出できるはずです。
そこから何色に近い?をHSVか何かで比較したらよさそうです。

この方法にはDNNほどの精度や検出漏れのなさはないかもしれませんが、
これが現実的な線引きではないかと思います。

DNNの利用を検討しています。

既存のデータがそのまま使えるかどうかわかりませんが、
上記の方法より処理は重くデータをそろえるのも大変かと思います。
OpenPoseで人っぽい部分、その人の頭っぽい部分を検出、さらにそこの色が何に近いかを検出というような流れでしょうか。

投稿2019/11/09 00:33

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AndoJun

2019/11/09 09:02

ご回答ありがとうございます。 ご認識の通り、OpenCVに同梱されているカスケードファイルの(haarcascade_upperbody.xml)を使用して上半身の検出を行いました。 ご提案いただいた案(自転車と人->頭->色)の検出器の構築した場合、どのぐらいの精度になるものかわかりますでしょうか? 感覚的なもので構いませんのでお教え頂けると助かります。 目指すところとしては8割(1枚の画像で9人中7人)検出させたいと考えております。
退会済みユーザー

退会済みユーザー

2019/11/09 23:49

> 自転車と人->頭->色)の検出器の構築した場合、どのぐらいの精度になるものかわかりますでしょうか? 根拠はありませんが、恐らく七割くらいは見分けられると思います。 検出対象の「人と自転車の見た目」はそれほど変わらないので、手動でアノテーションしていけばもっと制度は上がると思います。
AndoJun

2019/11/11 14:10

実際の検証はできていませんが、アプローチ方法がわかりましたのでベストアンサーとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問