5

C++ コードで画像を読み込もうとしています

LOGD("Loading image '%s' ...\n", (*inFile).c_str());;
Mat img = imread(*inFile, CV_LOAD_IMAGE_GRAYSCALE);
CV_Assert(img.data != 0);

次の出力を取得します。

09-25 17:08:24.798: D/IRISREC(12120): Loading image '/data/data/com.example.irisrec/files/input/osoba1.jpg' ...
09-25 17:08:24.798: E/cv::error()(12120): OpenCV Error: Assertion failed (img.data != 0) in int wahet_main(int, char**), file jni/wahet.cpp, line 4208

ファイルが存在します。しかし奇妙なのは、ルート ファイル ブラウザを使用して画像をプレビューしようとすると、真っ黒になることです。そこにあるファイルを手動でコピーしました。

編集:

このコードは、.png および .jpg 形式の Windows で正常に動作します。虹彩認識用の既存の C++ プロジェクトを Android に移植しようとしています。

4

4 に答える 4

6

imread()ファイル拡張子ではなく、その内容に基づいてファイルの種類を判断します。ファイルのヘッダーが破損している場合、メソッドが失敗するのは理にかなっています。

試してみることができるいくつかのことを次に示します。

  • それらの画像をコンピューターにコピーして、他のアプリで開くことができるかどうかを確認します。デバイスで破損している可能性があります。
  • その場所にファイルがあり、ユーザーがそのファイルを読み取る権限を持っていることを確認してください。
  • 画像の種類 (jpg、png、tiff、bmp など) でテストします。

  • テスト目的では、常により直接的な方がよいでしょう。取り除くinFile

例:

Mat img = imread("/data/data/com.example.irisrec/files/input/osoba1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
if (!img.data) {
    // Print error message and quit
}
于 2014-09-29T03:56:02.593 に答える
1

権限の問題である可能性があります。Android 6.0 以降では、Activity クラスの Java コードから権限を要求する必要があります。また、AndroidManifest.xml に次の行があることを確認してください。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

アクティビティ ファイルに次を追加します。

if (PermissionUtils.requestPermission(
                    this,
                    HOME_SCREEN_ACTIVITY,
                    Manifest.permission.READ_EXTERNAL_STORAGE)) {
     Mat image = Imgcodecs.imread(filePath,Imgcodecs.IMREAD_COLOR);
}

これを見つけるのに長い間苦労し、以前はずっと Mat オブジェクトnullを取得していました。

于 2017-08-09T21:47:44.357 に答える