2014-09-25 133 views
4

工作我想在我的C讀取圖像++代碼C++ OpenCV的imread不是在Android的

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 

該文件存在。但奇怪的是,如果我嘗試使用根文件瀏覽器預覽圖像,它只是黑色。我手動將文件複製到那裏。

編輯:

的代碼在Windows下正常工作與.PNG和.jpg格式。我只是試圖將現有的Iris識別C++項目移植到Android上。

回答

0

我只能通過複製代碼中的圖像文件才能解決此問題。我先將它們存儲在我的資產文件夾中,然後將它們複製到this example之後的內部存儲中。 如果有人能向我解釋這一點,請做到這一點。

+1

imread無法從zip文件(您的apk)讀取。這就是爲什麼你必須先把它複製到別處。 – berak 2014-09-30 12:19:25

+0

*請*,開始一個新的問題... – berak 2014-09-30 12:28:14

+0

並重新考慮你的答案 - 我不確定數據/數據文件夾是否與apk有關? – 4ndro1d 2014-09-30 12:31:04

6

imread()根據其內容決定文件類型而不是文件擴展名。如果文件的標頭損壞,則該方法失敗是有意義的。

這裏有一些事情你可以嘗試:

  • 複製這些圖像回電腦,看看他們是否可以被其他應用程序打開。有可能它們在設備中損壞;
  • 確保在該位置有一個文件,並且您的用戶有權讀取該文件;
  • 測試圖像類型(jpg,png,tiff,bmp,...);

  • 出於測試目的,總是更直接。擺脫​​:

例子:

Mat img = imread("/data/data/com.example.irisrec/files/input/osoba1.jpg", CV_LOAD_IMAGE_GRAYSCALE); 
if (!img.data) { 
    // Print error message and quit 
} 
+0

當我將它們複製回來時,它們沒有損壞,並且我看不到任何有關Android內部存儲權限的問題。我試着用JPG和PNG。兩者都不起作用。該代碼在Windows下工作正常。另外我不想更改C++代碼,因爲我試圖將整個項目移植到Android。這是一個虹膜識別工具包,其中有太多的代碼要適應。我相信文件路徑是正確的。 – 4ndro1d 2014-09-30 11:04:59

1

調試時,第一次嘗試獲取有關問題的更多數據。

  • 這是一個不幸的設計,imread()不提供任何錯誤信息。 docs只是說它會失敗,「因爲缺少文件,不正確的權限,不支持或無效的格式」。
  • 如果可以的話,使用調試器進入代碼。你能告訴它失敗的地方嗎?
  • 搜索已知問題,stackoverflow.com/search?q=imread,例如, imread not working in OpenCV

然後生成儘可能多的假設,你可以。對於每一個,想一個方法來測試它。例如。

  • 圖像文件格式錯誤(如@karlphillip提供)。 - 看看其他軟件是否可以打開文件。
  • 圖像文件不是受支持的格式。 - 驗證桌面上的文件格式。測試桌面OpenCV可以讀取它。檢查文檔以驗證AndroidCV可以讀取的圖像格式。
  • 圖像文件未處於預期路徑。 - 編寫代碼來測試該路徑中是否有文件,並驗證其長度。
  • 圖像文件沒有讀取權限。 - 編寫代碼打開文件以供閱讀。
  • imread()參數有問題。 - 嘗試默認第二個參數。
+0

請參閱我對其他答案的評論。 – 4ndro1d 2014-09-30 11:07:25

+0

噢,我會嘗試調試C++代碼。無法正確設置調試器 – 4ndro1d 2014-09-30 11:26:31

0

這可能是一個權限問題。您必須在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之前的所有時間。