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

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

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

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

Java

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

Android

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

1回答

846閲覧

Matをトリミングしようとするとエラーが発生してしまう。

m-mega

総合スコア56

OpenCV

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

Java

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

Android

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2022/04/05 08:21

実現したいこと

以前に質問させていただいた内容1
以前に質問させていただいた内容2
と同じように、OpenCVのプレビューを指定範囲でトリミングする処理を、MainActivityで実装したいです。

わからないこと

これまでと同じ方法で、「Mat(Mat!, Rect!)」関数を使用して指定した矩形範囲でMatをトリミングしたいのですが、Mat()関数の部分でエラーが出てしまいます。
これまで実装した内容と比較してどこが問題なのかが分からない状態です。

エラー内容
None of the following functions can be called with the arguments supplied. <init>(IntArray!, Int) defined in org.opencv.core.Mat <init>(Mat!, Array<(out) Range!>!) defined in org.opencv.core.Mat <init>(Mat!, Range!) defined in org.opencv.core.Mat <init>(Mat!, Rect!) defined in org.opencv.core.Mat <init>(Size!, Int) defined in org.opencv.core.Mat

内容としては、「以下の関数はいずれも、指定された引数では呼び出すことができません。」となっています。
現在のコードでは引数をMatとRectで指定しているはずなのですが、なぜか上記のエラーが出てしまいます。

MainActivity.kt

kotlin

1import ... 2 3private var trimLeft = 0 4private var trimTop = 0 5private var trimRight = 100 6private var trimBottom = 100 7private var mMat: Mat? = null 8private var mMatChange: Mat? = null 9private var mMatTrim: Mat? = null 10private var trimArea: Rect? = null 11private var newBitmap: Bitmap? = null 12 13class MainActivity : AppCompatActivity(), CvCameraViewListener2 { 14 // カメラの設定 15 private var mOpenCvCameraView: CameraBridgeViewBase? = null 16 17 override fun onStart() { 18 super.onStart() 19 var havePermission = true 20 if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 21 requestPermissions( 22 arrayOf(Manifest.permission.CAMERA), 23 CAMERA_PERMISSION_REQUEST_CODE 24 ) 25 havePermission = false 26 } 27 if (havePermission) { 28 mOpenCvCameraView!!.setCameraPermissionGranted() 29 } 30 } 31 32 @TargetApi(Build.VERSION_CODES.M) 33 override fun onRequestPermissionsResult( 34 requestCode: Int, 35 permissions: Array<String>, 36 grantResults: IntArray 37 ) { 38 if (requestCode == CAMERA_PERMISSION_REQUEST_CODE && grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 39 mOpenCvCameraView!!.setCameraPermissionGranted() 40 } 41 super.onRequestPermissionsResult(requestCode, permissions, grantResults) 42 } 43 44 @SuppressLint("ClickableViewAccessibility") 45 override fun onCreate(savedInstanceState: Bundle?) { 46 super.onCreate(savedInstanceState) 47 setContentView(R.layout.activity_main) 48 49 val textLeft: TextView = findViewById(R.id.txtRectLeft) 50 val textTop: TextView = findViewById(R.id.txtRectTop) 51 val textRight: TextView = findViewById(R.id.txtRectRight) 52 val textBottom: TextView = findViewById(R.id.txtRectBottom) 53 val trimView = findViewById<TrimView>(R.id.trim_view) 54 55 // 矩形のサイズをテキストに変換してxmlに反映する 56 trimView.setOnActionUpListener { rect: Rect -> 57 val strLeft = """${rect.left}""".trimIndent() 58 val strTop = """${rect.top}""".trimIndent() 59 val strRight = """${rect.right}""".trimIndent() 60 val strBottom = """${rect.bottom}""".trimIndent() 61 // 矩形のサイズをxmlに反映 62 textLeft.text = strLeft 63 textTop.text = strTop 64 textRight.text = strRight 65 textBottom.text = strBottom 66 } 67 68 // ボタンを押したらゲーム画面へ 69 val btnStart :Button = findViewById(R.id.btnStart) // Viewの取得 70 btnStart.setOnClickListener { 71 val intent = Intent(this,GamePlayActivity::class.java) // 遷移元と遷移先の設定 72 // 矩形の情報を受け渡す 73 intent.putExtra("RECT_LEFT",textLeft.text.toString()) 74 intent.putExtra("RECT_TOP",textTop.text.toString()) 75 intent.putExtra("RECT_RIGHT",textRight.text.toString()) 76 intent.putExtra("RECT_BOTTOM",textBottom.text.toString()) 77 startActivity(intent) // 遷移の実行 78 } 79 80 ... 81 82 // OpenCVの設定 83 ... 84 } 85 86 public override fun onResume() { 87 super.onResume() 88 mOpenCvCameraView!!.enableView() 89 } 90 91 public override fun onDestroy() { 92 super.onDestroy() 93 if (mOpenCvCameraView != null) mOpenCvCameraView!!.disableView() 94 } 95 96 override fun onCameraViewStarted(width: Int, height: Int) { 97 mMatChange = Mat(height, width, CvType.CV_8UC4) 98 } 99 100 override fun onCameraViewStopped() { 101 mMatChange?.release() 102 } 103 104 private fun detectOrange(img:Mat):Boolean { 105 Core.inRange(img, Scalar(5.0, 100.0, 100.0), Scalar(15.0, 255.0, 255.0), img) 106 return compareContourOrange(detectContour(img)) 107 } 108 109 private fun detectContour(img:Mat): Int { // 輪郭の情報を取得 110 ... 111 return contours.size 112 } 113 114 private fun compareContourOrange(size:Int):Boolean { // 取得したオレンジ色の輪郭サイズを比較 115 val maxarea = 20.0 116 if(size > maxarea){ 117 ... 118 return true 119 } 120 else { 121 return false 122 } 123 } 124 125 override fun onCameraFrame(inputFrame: CameraBridgeViewBase.CvCameraViewFrame): Mat? { 126 mMat = inputFrame.rgba() 127 Imgproc.cvtColor(mMat, mMatChange, Imgproc.COLOR_RGBA2BGR) 128 Imgproc.cvtColor(mMatChange, mMatChange, Imgproc.COLOR_BGR2HSV) 129 130 trimArea = Rect(trimLeft, trimTop, trimRight, trimBottom) // トリミング範囲指定 131 mMatTrim = Mat(mMatChange, trimArea) // トリミング 132// mMatTrim = mMatChange 133 // オレンジ色の輪郭面積に応じた処理を実行 134 detectOrange(mMatTrim!!) 135 136 newBitmap = Bitmap.createBitmap(mMatTrim!!.width(), mMatTrim!!.height(), Bitmap.Config.ARGB_8888) 137 Utils.matToBitmap(mMatTrim, newBitmap) 138 return mMat 139 } 140 141 // カメラのパーミッション 142 companion object { 143 ... 144 } 145}
該当箇所

kotlin

1 override fun onCameraFrame(inputFrame: CameraBridgeViewBase.CvCameraViewFrame): Mat? { 2 mMat = inputFrame.rgba() 3 Imgproc.cvtColor(mMat, mMatChange, Imgproc.COLOR_RGBA2BGR) 4 Imgproc.cvtColor(mMatChange, mMatChange, Imgproc.COLOR_BGR2HSV) 5 6 trimArea = Rect(trimLeft, trimTop, trimRight, trimBottom) 7// trimArea = Rect(0, 0, 200, 200) // トリミング範囲指定テスト 8 mMatTrim = Mat(mMatChange, trimArea) // トリミング 9// mMatTrim = mMatChange // 引数mMatChangeがMat型であることのテスト 10 11 detectOrange(mMatTrim!!) 12 13 newBitmap = Bitmap.createBitmap(mMatTrim!!.width(), mMatTrim!!.height(), Bitmap.Config.ARGB_8888) 14 Utils.matToBitmap(mMatTrim, newBitmap) 15 return mMat 16 }

trimAreaはRect型で宣言しています。
変数の値に問題があるのかと思い直接値を設定してもみましたが(コメントアウトの部分)、エラーは解消されませんでした。

そのため、mMatChange変数に問題があると思い、変数がMat型であるかどうか確認するために、Mat型を引数にとる「detectOrange()」関数に値を渡してみましたが、問題なくOpenCVの処理が実行されました。
つまり、mMatChange変数もMat型が指定されていると思われます。

また、別のActivityで同じようにトリミングの処理を実装してみましたが、そちらでは問題なくトリミングしたエリアに対してOpenCVの処理が実行されていました。

GamePlayActivity.kt

kotlin

1package jp.gr.java_conf.coskx.targetinggame 2 3import ... 4 5private var ... 6 7class GamePlayActivity: Activity(), CvCameraViewListener2 { 8 // カメラの設定 9 private var mOpenCvCameraView: CameraBridgeViewBase? = null 10 11 override fun onStart() { 12 ... 13 } 14 15 @TargetApi(Build.VERSION_CODES.M) 16 override fun onRequestPermissionsResult( 17 ... 18 ) { 19 ... 20 } 21 22 @RequiresApi(Build.VERSION_CODES.R) 23 override fun onCreate(savedInstanceState: Bundle?) { 24 super.onCreate(savedInstanceState) 25 setContentView(R.layout.activity_game_play) 26 27 // 遷移前のactivityから値を受け取る 28 trimLeft = intent.getStringExtra("RECT_LEFT")!!.toInt() 29 trimTop = intent.getStringExtra("RECT_TOP")!!.toInt() 30 trimRight = intent.getStringExtra("RECT_RIGHT")!!.toInt() 31 trimBottom = intent.getStringExtra("RECT_BOTTOM")!!.toInt() 32 33 val view = findViewById<View>(R.id.view) 34 view.post { 35 // MainActivityで取得したbitmap単位での値をMat用に変換する 36 ... 37 } 38 39 // OpenCVの設定 40 System.loadLibrary("opencv_java4") 41 mOpenCvCameraView = findViewById<View>(R.id.camera_view) as CameraBridgeViewBase 42 mOpenCvCameraView!!.setCvCameraViewListener(this) 43 mOpenCvCameraView!!.setMaxFrameSize(960, 720) 44 } 45 46 public override fun onResume() { 47 super.onResume() 48 mOpenCvCameraView!!.enableView() 49 } 50 51 public override fun onDestroy() { 52 super.onDestroy() 53 if (mOpenCvCameraView != null) mOpenCvCameraView!!.disableView() 54 } 55 56 override fun onCameraViewStarted(width: Int, height: Int) { 57 mMatChange = Mat(height, width, CvType.CV_8UC4) 58 } 59 override fun onCameraViewStopped() { 60 mMatChange?.release() 61 } 62 63 private fun detectOrange(img:Mat):Boolean { 64 Core.inRange(img, Scalar(5.0, 100.0, 100.0), Scalar(15.0, 255.0, 255.0), img) 65 // オレンジ色の輪郭の面積に応じた処理を実行 66 return compareContourGreen(detectContour(img)) 67 } 68 69 private fun detectContour(img:Mat): Int { // 輪郭の情報を取得 70 ... 71 return contours.size 72 } 73 74 private fun compareContourGreen(size:Int):Boolean { 75 val maxarea = 20.0 76 if(size > maxarea){ 77 ... 78 return true 79 } 80 else { 81 return false 82 } 83 } 84 85 override fun onCameraFrame(inputFrame: CameraBridgeViewBase.CvCameraViewFrame): Mat? { 86 mMat = inputFrame.rgba() 87 Imgproc.cvtColor(mMat, mMatChange, Imgproc.COLOR_RGBA2BGR) 88 Imgproc.cvtColor(mMatChange, mMatChange, Imgproc.COLOR_BGR2HSV) 89 90 trimArea = Rect(trimLeft, trimTop, trimRight, trimBottom) 91 mMatTrim = Mat(mMatChange, trimArea) // トリミング 92 93 detectOrange(mMatTrim!!) 94 95 newBitmap = Bitmap.createBitmap(mMatTrim!!.width(), mMatTrim!!.height(), Bitmap.Config.ARGB_8888) 96 Utils.matToBitmap(mMatTrim, newBitmap) 97 return mMat 98 } 99 100 // カメラのパーミッション 101 companion object { 102 ... 103 } 104}

2つのコードの相違点を比較してみたのですが、現状原因がわかっていない状態です。

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

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

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

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

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

hoshi-takanori

2022/04/05 12:35

Rect の import はどうなってますか?
jimbe

2022/04/05 15:44

つまり、 "Rect" というクラスは、org.opencv.core パッケージと android.graphics パッケージに存在します。同じ名前で使い方が同じでも、パッケージが違えば異なるクラスです。 Mat の第2引数は org.opencv.core.Rect のはずですが、 trimArea はどちらの Rect でしょうか。
m-mega

2022/04/06 05:00 編集

ご回答いただきありがとうございます。 MainActivityで使用しているRectは、「import android.graphics.Rect」で宣言しております。 そのため、ご指摘の通り別パッケージの別クラスを呼び出してしまっているようです。 Rectの宣言の際に、型を「org.opencv.core.Rect」と指定してみます。 ありがとうございます。一度試してみます。
m-mega

2022/04/06 06:51

上記の通り修正を加えることで、問題なくRectでトリミングを行うことができました。 ご回答いただき誠にありがとうございました!
guest

回答1

0

※すいません、このご質問とは直接関係ありません。
MainActivity以外のクラスからfindViewByIdを実行する方法からの続き的な件です。

TrimView で設定された矩形を MainActivity で得て GamePlayActivity に渡す過程で、テキストビューに値を表示する為に setOnActionUpListener というのを作って…という回答をしましたが、表示は(必要であれば)そのままとしまして、本件のように表示とは関係無い(スタートボタンを押した)タイミングで GamePlayActivity へその矩形を渡すに至っては、テキストビューから間接的に得るよりも直接 TrimView から得て、しかも Rect をそのまま Intent に入れて送ってしまったほうが良いように思います。

TrimView

java

1 private Rect rect; //android.graphics.Rect 2 Rect getRect() { return rect; } //ゲッター

MainActivity(スタートボタン押下時処理)

java

1 Intent intent = new Intent(this, GamePlayActivity.class); 2 // 矩形の情報を受け渡す 3 intent.putExtra("RECT", trimView.getRect()); 4 startActivity(intent);

GamePlayActivity(onCreate でのパラメータ受け取り)

java

1 private android.graphics.Rect trimRect; //パッケージに注意 2 //... 3 public void onCreate(Bundle savedInstanceState) { 4 //... 5 // 遷移前のactivityから値を受け取る 6 trimRect = getIntent().getParcelableExtra("RECT"); 7 //以後は必要な場所で trimRect.top 等で個々の値を得られる

また、 MainActivity から受け取った Rect の情報は trimArea になるしか無いのであれば(そして他で trimArea が更新されないのであれば)、 onCreate メソッド内で即 trimArea を作ってしまえば trimRect をフィールドとして持つ必要がありません。

java

1inport org.opencv.core.Rect; //既存 2//... 3 private Rect trimArea; //既存 4 //... 5 public void onCreate(Bundle savedInstanceState) { 6 //... 7 // 遷移前のactivityから値を受け取る 8 android.graphics.Rect trimRect = getIntent().getParcelableExtra("RECT"); 9 trimArea = new Rect(trimRect.left, trimRect.top, trimRect.right, trimRect.bottom);

投稿2022/04/05 16:30

編集2022/04/06 05:13
jimbe

総合スコア12670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問