私はandroidstudioでアプリ開発を行っています。
#実現したいこと
opencvで赤い色を検知して赤色を白に、それ以外を黒にしてそのあとに赤い物の輪郭の中心座標を返したいです。
#問題点
onCameraViewStopped()の中のinRangeで赤を白に、それ以外を黒にすることはできましたがfindContoursがうまくいっていないのか、輪郭に線を引くことができていません。これでは中心点も出せないですよね?実行しても黒と白の映像しか出てきません
#当該のコード
java
1 2import android.app.Activity; 3import android.os.Bundle; 4import android.util.Log; 5import android.view.MenuItem; 6import android.view.SurfaceView; 7import android.view.WindowManager; 8import org.opencv.android.BaseLoaderCallback; 9import org.opencv.android.CameraBridgeViewBase; 10import org.opencv.android.LoaderCallbackInterface; 11import org.opencv.android.OpenCVLoader; 12import org.opencv.core.Core; 13import org.opencv.core.CvType; 14import org.opencv.core.Mat; 15import org.opencv.core.MatOfInt; 16import org.opencv.core.MatOfInt4; 17import org.opencv.core.MatOfPoint; 18import org.opencv.core.MatOfPoint2f; 19import org.opencv.core.Point; 20import org.opencv.core.Scalar; 21import org.opencv.core.Size; 22import org.opencv.imgproc.Imgproc; 23import org.opencv.imgproc.Moments; 24 25 26import java.util.ArrayList; 27import java.util.List; 28 29import static org.opencv.core.CvType.CV_8U; 30import static org.opencv.core.CvType.CV_8UC1; 31 32 33public class MainActivity extends Activity implements CameraBridgeViewBase.CvCameraViewListener { 34 private static final String TAG = "OCVSample::Activity"; 35 36 int i =0; 37 38 private CameraBridgeViewBase mOpenCvCameraView; 39 private boolean mIsJavaCamera = true; 40 private MenuItem mItemSwitchCamera = null; 41 42 43 private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 44 @Override 45 public void onManagerConnected(int status) { 46 switch (status) { 47 // 読み込みが成功したらカメラプレビューを開始 48 case LoaderCallbackInterface.SUCCESS: 49 { 50 Log.i(TAG, "OpenCV loaded successfully"); 51 mOpenCvCameraView.enableView(); 52 } break; 53 default: { 54 super.onManagerConnected(status); 55 }break; 56 } 57 } 58 }; 59 60 public MainActivity() { 61 Log.i(TAG, "Instantiated new " + this.getClass()); 62 } 63 64 @Override 65 protected void onCreate(Bundle savedInstanceState) { 66 Log.i(TAG, "called onCreate"); 67 super.onCreate(savedInstanceState); 68 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 69 setContentView(R.layout.activity_main); 70 71 mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.camera_view); 72 73 mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); 74 75 mOpenCvCameraView.setCvCameraViewListener(this); 76 } 77 78 @Override 79 protected void onPause() { 80 super.onPause(); 81 if (mOpenCvCameraView != null) 82 mOpenCvCameraView.disableView(); 83 } 84 85 @Override 86 protected void onResume() { 87 super.onResume(); 88 if (!OpenCVLoader.initDebug()) { 89 Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization"); 90 OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback); 91 } else { 92 Log.d(TAG, "OpenCV library found inside package. Using it!"); 93 mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); 94 } 95 } 96 97 98 @Override 99 protected void onDestroy() { 100 super.onDestroy(); 101 if (mOpenCvCameraView != null) 102 mOpenCvCameraView.disableView(); 103 } 104 105 106 @Override 107 public void onCameraViewStarted(int width, int height) {// カメラプレビュー開始時に呼ばれる 108 } 109 110 @Override 111 public void onCameraViewStopped() {// カメラプレビュー終了時に呼ばれる 112 } 113 114 @Override 115 public Mat onCameraFrame(Mat inputFrame) { 116 Mat src = inputFrame; 117 Mat dst = Mat.zeros(inputFrame.width(),inputFrame.height(),CV_8U); 118 Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2HSV);//HSVに変換 119 Imgproc.medianBlur(dst, dst, 5); 120 Mat mask = Mat.zeros(inputFrame.width(),inputFrame.height(),CV_8U); 121 Core.inRange(dst, new Scalar(150,100,100),new Scalar(180,255,255),mask); 122 123 Mat hierarchy=Mat.zeros(new Size(5,5), CvType.CV_8UC1); 124 Mat invsrc=mask.clone(); 125 126 List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); 127 Imgproc.findContours(invsrc, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_TC89_L1); 128 Scalar color=new Scalar(255,0,0); 129 Imgproc.drawContours(mask, contours, -1, color,1); 130 131 return mask; 132 } 133} 134
なぜうまくいかないのかわかる方がいましたらご教授願います。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。