前提・実現したいこと
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
回答2件
あなたの回答
tips
プレビュー