質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

778閲覧

android opencv で色検出

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

1クリップ

投稿2017/11/22 07:19

私はandroidstudioでアプリ開発を行なっており今opencvを使っています。
フレームの中に入っている緑の色をしている領域の中で一番面積が大きいものを選び出し、その輪郭を囲んだものを画面に表示するものを作りたいと思っています。

#問題点
buildとrunはできてandroidにインストールできます。
起動させた時に一瞬だけ領域を枠で囲めていましたが『アプリを終了します』と出てきてすぐにアプリが終了してしまいました。

関数のconvexityDefectsをコメントアウトしてみると枠で囲むことはできませんが、カメラが起動しエラーは起きません。
どこが間違えいるのか教えていただけないでしょうか?

#当該のコード

java

1 2import android.app.Activity; 3import android.os.Bundle; 4import android.support.v7.app.AppCompatActivity; 5import android.util.Log; 6import android.view.MenuItem; 7import android.view.SurfaceView; 8import android.view.WindowManager; 9 10import org.opencv.android.BaseLoaderCallback; 11import org.opencv.android.CameraBridgeViewBase; 12import org.opencv.android.LoaderCallbackInterface; 13import org.opencv.android.OpenCVLoader; 14import org.opencv.core.Core; 15import org.opencv.core.CvType; 16import org.opencv.core.Mat; 17import org.opencv.core.MatOfInt; 18import org.opencv.core.MatOfInt4; 19import org.opencv.core.MatOfPoint; 20import org.opencv.core.MatOfPoint2f; 21import org.opencv.core.Point; 22import org.opencv.core.Scalar; 23import org.opencv.imgproc.Imgproc; 24import org.opencv.imgproc.Moments; 25 26import java.util.ArrayList; 27import java.util.Iterator; 28import java.util.List; 29 30import static org.opencv.core.CvType.CV_8U; 31 32 33public class MainActivity extends Activity implements CameraBridgeViewBase.CvCameraViewListener { 34 35 int i =0; 36 private static final String TAG = "OCVSample::Activity"; 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 // LoaderCallbackInterface.SUCCESSで読み込みが成功したら 45 // enableView()でカメラプレビューを開始できる 46 @Override 47 public void onManagerConnected(int status) { 48 switch (status) { 49 50 case LoaderCallbackInterface.SUCCESS: 51 { 52 Log.i(TAG, "OpenCV loaded successfully"); 53 mOpenCvCameraView.enableView(); 54 } break; 55 default: { 56 super.onManagerConnected(status); 57 }break; 58 } 59 } 60 }; 61 62 //Objectの実行時クラスを送信する 63 public MainActivity() { 64 Log.i(TAG, "Instantiated new " + this.getClass()); 65 } 66 //Activityが初めて生成された時に呼ばれる 67 //画面が消えないようにつけたままにしてactivity_mainで作ったレイアウトを表示 68 //カメラから撮った画像を表示 69 //フレームをキャプチャする毎にonCameraFrameを呼ぶ 70 @Override 71 protected void onCreate(Bundle savedInstanceState) { 72 Log.i(TAG, "called onCreate"); 73 super.onCreate(savedInstanceState); 74 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 75 setContentView(R.layout.activity_main); 76 77 mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.camera_view); 78 79 mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); 80 81 mOpenCvCameraView.setCvCameraViewListener(this); 82 } 83 84 @Override 85 protected void onPause() { 86 super.onPause(); 87 if (mOpenCvCameraView != null) 88 mOpenCvCameraView.disableView(); 89 } 90 //Activityが表示された時に呼ばれる 91 //ライブラリの読み込み,初期化を行う 92 @Override 93 protected void onResume() { 94 super.onResume(); 95 if (!OpenCVLoader.initDebug()) { 96 Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization"); 97 OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_3_0, this, mLoaderCallback); 98 } else { 99 Log.d(TAG, "OpenCV library found inside package. Using it!"); 100 mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); 101 } 102 } 103 104 //Activityが終わる時に呼び出される 105 //映像が残っていた場合消す 106 @Override 107 protected void onDestroy() { 108 super.onDestroy(); 109 110 if (mOpenCvCameraView != null) 111 mOpenCvCameraView.disableView(); 112 } 113 114// カメラプレビュー開始時に呼ばれる 115 @Override 116 public void onCameraViewStarted(int width, int height) { 117 118 } 119 120 // カメラプレビュー終了時に呼ばれる 121 @Override 122 public void onCameraViewStopped() { 123 124 } 125 126 127 @Override 128 public Mat onCameraFrame(Mat inputFrame) { 129 Mat src = inputFrame; 130 Mat dst = Mat.zeros(inputFrame.width(),inputFrame.height(),CV_8U); 131 Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2HSV);//HSVに変換 132 Imgproc.medianBlur(dst, dst, 3); 133 Mat dst2 = greenDetect(dst); 134 135 List<MatOfPoint> contours=new ArrayList<MatOfPoint>(); 136 Mat hierarchy = new Mat(dst2.cols(), dst2.rows(), 137 CvType.CV_32SC1); 138 Imgproc.findContours(dst2,contours,hierarchy,Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); 139 140 //double tmp1 = Imgproc.contourArea(dst2); 141 int index = -1; 142 double area = 0; 143 int n = contours.size(); 144 145 i = i +1; 146 if (i < n){//面積が一番大きいものを探す 147 double tmp = Imgproc.contourArea(contours.get(i)); 148 if (area < tmp) { 149 area = tmp; 150 index = i;//一番面積が大きかったiの番号 151 } 152 } 153 154 if (index != -1) { 155 MatOfInt hull = new MatOfInt(); 156 MatOfPoint contour = contours.get(index); 157 Imgproc.convexHull(contour, hull); 158 159 Point data[] = contour.toArray(); 160 int v = -1; 161 for (int i : hull.toArray()) { 162 if (v == -1) { 163 v = i; 164 } else { 165 Imgproc.line(src, data[i], data[v], new Scalar(0, 255, 0)); 166 v = i; 167 } 168 } 169 convexityDefects(src, contour,hull); 170 Imgproc.drawContours(src, contours, index, new Scalar(255, 0, 0)); 171 } 172 173 return src; 174 175 176 } 177 178 Mat greenDetect(Mat mat){ 179 Mat mat1 = new Mat(); 180 Core.inRange(mat, new Scalar(30,70,70),new Scalar(70,250,250),mat1); 181 return mat1; 182 } 183 184 Point getcenter(MatOfPoint2f map) 185 { 186 Moments moments = Imgproc.moments(map); 187 Point centroid = new Point(); 188 centroid.x = moments.get_m10() / moments.get_m00(); 189 centroid.y = moments.get_m01() / moments.get_m00(); 190 return centroid; 191 } 192 193 void convexityDefects(Mat img,MatOfPoint contour,MatOfInt hull) { 194 Point data[] = contour.toArray(); 195 MatOfInt4 convexityDefects = new MatOfInt4(); 196 Imgproc.convexityDefects(contour, hull, convexityDefects); 197 int cd[] = convexityDefects.toArray(); 198 if(cd==null)return; 199 int j = 0; 200 if (j < cd.length) { 201 j = j + 4; 202 Imgproc.line(img, data[cd[j+1]], data[cd[j+2]], new Scalar(255,255,255)); 203 Imgproc.line(img, data[cd[j]], data[cd[j+2]], new Scalar(255,255,255)); 204 } 205 } 206 207 208 209} 210

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

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

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

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

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

guest

回答1

0

ベストアンサー

java

1import android.app.Activity; 2import android.os.Bundle; 3import android.util.Log; 4import android.view.MenuItem; 5import android.view.SurfaceView; 6import android.view.WindowManager; 7import org.opencv.android.BaseLoaderCallback; 8import org.opencv.android.CameraBridgeViewBase; 9import org.opencv.android.LoaderCallbackInterface; 10import org.opencv.android.OpenCVLoader; 11import org.opencv.core.Core; 12import org.opencv.core.CvType; 13import org.opencv.core.Mat; 14import org.opencv.core.MatOfInt; 15import org.opencv.core.MatOfInt4; 16import org.opencv.core.MatOfPoint; 17import org.opencv.core.MatOfPoint2f; 18import org.opencv.core.Point; 19import org.opencv.core.RotatedRect; 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 29 30import static org.opencv.core.CvType.CV_8U; 31import static org.opencv.core.CvType.CV_8UC1; 32import static org.opencv.core.CvType.CV_8UC3; 33 34 35public class MainActivity extends Activity implements CameraBridgeViewBase.CvCameraViewListener { 36 private static final String TAG = "OCVSample::Activity"; 37 38 int i =0; 39 40 private CameraBridgeViewBase mOpenCvCameraView; 41 private boolean mIsJavaCamera = true; 42 private MenuItem mItemSwitchCamera = null; 43 44 45 private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 46 @Override 47 public void onManagerConnected(int status) { 48 switch (status) { 49 // 読み込みが成功したらカメラプレビューを開始 50 case LoaderCallbackInterface.SUCCESS: 51 { 52 Log.i(TAG, "OpenCV loaded successfully"); 53 mOpenCvCameraView.enableView(); 54 } break; 55 default: { 56 super.onManagerConnected(status); 57 }break; 58 } 59 } 60 }; 61 62 public MainActivity() { 63 Log.i(TAG, "Instantiated new " + this.getClass()); 64 } 65 66 @Override 67 protected void onCreate(Bundle savedInstanceState) { 68 Log.i(TAG, "called onCreate"); 69 super.onCreate(savedInstanceState); 70 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 71 setContentView(R.layout.activity_main); 72 73 mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.camera_view); 74 75 mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); 76 77 mOpenCvCameraView.setCvCameraViewListener(this); 78 } 79 80 @Override 81 protected void onPause() { 82 super.onPause(); 83 if (mOpenCvCameraView != null) 84 mOpenCvCameraView.disableView(); 85 } 86 87 @Override 88 protected void onResume() { 89 super.onResume(); 90 if (!OpenCVLoader.initDebug()) { 91 Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization"); 92 OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback); 93 } else { 94 Log.d(TAG, "OpenCV library found inside package. Using it!"); 95 mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); 96 } 97 } 98 99 100 @Override 101 protected void onDestroy() { 102 super.onDestroy(); 103 if (mOpenCvCameraView != null) 104 mOpenCvCameraView.disableView(); 105 } 106 107 108 @Override 109 public void onCameraViewStarted(int width, int height) {// カメラプレビュー開始時に呼ばれる 110 } 111 112 @Override 113 public void onCameraViewStopped() {// カメラプレビュー終了時に呼ばれる 114 } 115 116 @Override 117 public Mat onCameraFrame(Mat inputFrame) { 118 Mat src = inputFrame; 119 Mat src1 = src.clone(); 120 Imgproc.cvtColor(src, src, Imgproc.COLOR_RGB2HSV);//HSVに変換 121 Imgproc.medianBlur(src, src, 5); 122 Core.inRange(src, new Scalar(150,100,100),new Scalar(180,255,255),src); 123 Mat hierarchy=Mat.zeros(new Size(5,5), CvType.CV_8UC1); 124 List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); 125 Imgproc.findContours(src, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_TC89_L1); 126 Scalar color=new Scalar(200,20,100); 127 // Imgproc.drawContours(src1, contours, -1, color,10); 128 int i=0; 129 int index = -1; 130 double area = 0; 131 for(i=0;i<contours.size();i++) 132 { 133 double tmp = Imgproc.contourArea(contours.get(i)); 134 if (area < tmp) { 135 area = tmp; 136 index = i; 137 } 138 } 139 if (index != -1) { 140 MatOfPoint ptmat= contours.get(index); 141 color=new Scalar(0,200,0); 142 MatOfPoint2f ptmat2 = new MatOfPoint2f( ptmat.toArray() ); 143 RotatedRect bbox=Imgproc.minAreaRect(ptmat2); 144 Imgproc.circle(src1, bbox.center,5, color,-1); 145 } 146 return src1; 147 } 148 149} 150

投稿2017/12/20 15:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問