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

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

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

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

Android

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

Android Studio

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

解決済

android opencv で色検出

削除済ユーザー
削除済ユーザー

総合スコア0

OpenCV

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

Android

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

Android Studio

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

1回答

0評価

0クリップ

20閲覧

投稿2017/11/22 07:19

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

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

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

#当該のコード

java

import android.app.Activity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.MenuItem; import android.view.SurfaceView; import android.view.WindowManager; import org.opencv.android.BaseLoaderCallback; import org.opencv.android.CameraBridgeViewBase; import org.opencv.android.LoaderCallbackInterface; import org.opencv.android.OpenCVLoader; import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.MatOfInt; import org.opencv.core.MatOfInt4; import org.opencv.core.MatOfPoint; import org.opencv.core.MatOfPoint2f; import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.imgproc.Imgproc; import org.opencv.imgproc.Moments; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import static org.opencv.core.CvType.CV_8U; public class MainActivity extends Activity implements CameraBridgeViewBase.CvCameraViewListener { int i =0; private static final String TAG = "OCVSample::Activity"; private CameraBridgeViewBase mOpenCvCameraView; //private boolean mIsJavaCamera = true; //private MenuItem mItemSwitchCamera = null; // ライブラリ初期化完了後に呼ばれるコールバック private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { // LoaderCallbackInterface.SUCCESSで読み込みが成功したら // enableView()でカメラプレビューを開始できる @Override public void onManagerConnected(int status) { switch (status) { case LoaderCallbackInterface.SUCCESS: { Log.i(TAG, "OpenCV loaded successfully"); mOpenCvCameraView.enableView(); } break; default: { super.onManagerConnected(status); }break; } } }; //Objectの実行時クラスを送信する public MainActivity() { Log.i(TAG, "Instantiated new " + this.getClass()); } //Activityが初めて生成された時に呼ばれる //画面が消えないようにつけたままにしてactivity_mainで作ったレイアウトを表示 //カメラから撮った画像を表示 //フレームをキャプチャする毎にonCameraFrameを呼ぶ @Override protected void onCreate(Bundle savedInstanceState) { Log.i(TAG, "called onCreate"); super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setContentView(R.layout.activity_main); mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.camera_view); mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); mOpenCvCameraView.setCvCameraViewListener(this); } @Override protected void onPause() { super.onPause(); if (mOpenCvCameraView != null) mOpenCvCameraView.disableView(); } //Activityが表示された時に呼ばれる //ライブラリの読み込み,初期化を行う @Override protected void onResume() { super.onResume(); if (!OpenCVLoader.initDebug()) { Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization"); OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_3_0, this, mLoaderCallback); } else { Log.d(TAG, "OpenCV library found inside package. Using it!"); mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); } } //Activityが終わる時に呼び出される //映像が残っていた場合消す @Override protected void onDestroy() { super.onDestroy(); if (mOpenCvCameraView != null) mOpenCvCameraView.disableView(); } // カメラプレビュー開始時に呼ばれる @Override public void onCameraViewStarted(int width, int height) { } // カメラプレビュー終了時に呼ばれる @Override public void onCameraViewStopped() { } @Override public Mat onCameraFrame(Mat inputFrame) { Mat src = inputFrame; Mat dst = Mat.zeros(inputFrame.width(),inputFrame.height(),CV_8U); Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2HSV);//HSVに変換 Imgproc.medianBlur(dst, dst, 3); Mat dst2 = greenDetect(dst); List<MatOfPoint> contours=new ArrayList<MatOfPoint>(); Mat hierarchy = new Mat(dst2.cols(), dst2.rows(), CvType.CV_32SC1); Imgproc.findContours(dst2,contours,hierarchy,Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); //double tmp1 = Imgproc.contourArea(dst2); int index = -1; double area = 0; int n = contours.size(); i = i +1; if (i < n){//面積が一番大きいものを探す double tmp = Imgproc.contourArea(contours.get(i)); if (area < tmp) { area = tmp; index = i;//一番面積が大きかったiの番号 } } if (index != -1) { MatOfInt hull = new MatOfInt(); MatOfPoint contour = contours.get(index); Imgproc.convexHull(contour, hull); Point data[] = contour.toArray(); int v = -1; for (int i : hull.toArray()) { if (v == -1) { v = i; } else { Imgproc.line(src, data[i], data[v], new Scalar(0, 255, 0)); v = i; } } convexityDefects(src, contour,hull); Imgproc.drawContours(src, contours, index, new Scalar(255, 0, 0)); } return src; } Mat greenDetect(Mat mat){ Mat mat1 = new Mat(); Core.inRange(mat, new Scalar(30,70,70),new Scalar(70,250,250),mat1); return mat1; } Point getcenter(MatOfPoint2f map) { Moments moments = Imgproc.moments(map); Point centroid = new Point(); centroid.x = moments.get_m10() / moments.get_m00(); centroid.y = moments.get_m01() / moments.get_m00(); return centroid; } void convexityDefects(Mat img,MatOfPoint contour,MatOfInt hull) { Point data[] = contour.toArray(); MatOfInt4 convexityDefects = new MatOfInt4(); Imgproc.convexityDefects(contour, hull, convexityDefects); int cd[] = convexityDefects.toArray(); if(cd==null)return; int j = 0; if (j < cd.length) { j = j + 4; Imgproc.line(img, data[cd[j+1]], data[cd[j+2]], new Scalar(255,255,255)); Imgproc.line(img, data[cd[j]], data[cd[j+2]], new Scalar(255,255,255)); } } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

OpenCV

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

Android

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

Android Studio

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