1. 程式人生 > 其它 >OpenCV 4.5.2環境配置 + 圖片灰度化處理

OpenCV 4.5.2環境配置 + 圖片灰度化處理

一,OpenCV環境配置

注意:以下配置內容為Android開發環境配置好的基礎上的OpenCV配置環境

1.官網下載OpenCV的sdk包,下載的是4.5.2的Android版本

Releases - OpenCV(https://opencv.org/releases/)

2. zip解壓後,如下所示

3.將sdk作為module匯入工程(File-New-Import Module)

4.在app模組中加入opencv模組的依賴

右擊app-Open Module Settings-Dependencies-「+」-Module Dependencies-選擇剛剛匯入的opencv即可

或者直接在app模組的build.gradle中加入下面的程式碼

dependencies {
implementation project(path: ':opencv')
}

5.最後檢查以下app模組和opencv模組的build.gradle中定義的minSdkVersion是否一致,如果不一致的話,修改為一致,不然編譯的時候會報錯

此處將app的minSdkVersion(16)修改為opencv模組定義的minSdkVersion(21)

二,測試程式碼(圖片灰度化)

有部分程式碼是建立ndk工程的時候,自動建立的,紅色部分是我新增的

 1 package com.example.ocr
 2 
 3 import android.graphics.BitmapFactory
4 import android.os.Bundle 5 import androidx.appcompat.app.AppCompatActivity 6 import com.example.ocr.databinding.ActivityMainBinding 7 import org.opencv.android.Utils 8 import org.opencv.core.Mat 9 import org.opencv.imgproc.Imgproc 10 11 class MainActivity : AppCompatActivity() { 12 13 private
lateinit var binding: ActivityMainBinding 14 15 override fun onCreate(savedInstanceState: Bundle?) { 16 super.onCreate(savedInstanceState) 17 18 binding = ActivityMainBinding.inflate(layoutInflater) 19 setContentView(binding.root) 20 21 // Example of a call to a native method 22 binding.sampleText.text = stringFromJNI() 23 24 binding.toGrayBtn.setOnClickListener { 25 toGray() 26 } 27 } 28 29 /** 30 * 灰度化 31 */ 32 private fun toGray() { 33 val bitmap = BitmapFactory.decodeResource(resources, R.drawable.ocr) 34 val rgbMat = Mat() 35 val grayMat = Mat() 36 37 Utils.bitmapToMat(bitmap, rgbMat) 38 Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_BGR2GRAY) 39 Utils.matToBitmap(grayMat, bitmap) 40 binding.bitmapView.setImageBitmap(bitmap) 41 rgbMat.release() 42 grayMat.release() 43 } 44 45 /** 46 * A native method that is implemented by the 'native-lib' native library, 47 * which is packaged with this application. 48 */ 49 external fun stringFromJNI(): String 50 51 companion object { 52 // Used to load the 'native-lib' library on application startup. 53 init { 54 System.loadLibrary("native-lib") 55 System.loadLibrary("opencv_java4") 56 } 57 } 58 }

原圖: 灰度化後的圖:

三,Tips

雖然按照上面的步驟建立測試下來,用不了多長時候,但是在發現這個正確步驟之前,我按照網上部落格的步驟,一直不成功。主要原因在於版本升級之後,以前的手順不適用了,會報各種型別的錯誤。

如果按照上面的手順不成功的,可以看一下下載的sdk目錄下面的build檔案,4.5.2的版本里面寫了正確的步驟。

官方網址裡面的步驟(OpenCV: Android Development with OpenCV)是舊的,導致我一直以為這個方式能成功。

四,用不適用的步驟匯入過程中遇到的問題

1.java.lang.UnsatisfiedLinkError: dlopen failed: library "libopencv_java4.so" not found:

解決:將\OpenCV-android-sdk\sdk\native\libs目錄下的libopencv_java4.so包複製到app模組的libs資料夾下時,so包上層的資料夾,如x86也要一併複製到libs下面,否則so不會被編譯到apk中

2. java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found:

解決:新增下方的arguments

    defaultConfig {
        externalNativeBuild {
            cmake {
                cppFlags ''
                arguments "-DANDROID_STL=c++_shared"
            }
        }
    }

3.java.lang.UnsatisfiedLinkError: No implementation found for long org.opencv.core.Mat.n_Mat() (tried Java_org_opencv_core_Mat_n_1Mat and Java_org_opencv_core_Mat_n_1Mat__)

解決:新增OpenCVLoader.initAsync()相關的方法,此方法是和OpenCV Manager一起使用的,現在已經廢棄了。

官方現在推薦使用"System.loadLibrary("opencv_java4")" or "OpenCVLoader.initDebug()"

4.2021-07-13 14:36:58.402 7174-7174/com.example.socket E/OpenCV/StaticHelper: OpenCV error: Cannot load info library for OpenCV

解決:這個問題查了好久,有方案說去就版本里面下載opencvInfo.so,我下載了3.4.0裡面還是沒有這個so,更老的版本沒有下載成功。

所以還是按照各自版本的步驟來配置吧,應該就不會有這個問題。

5.but it set OpenCV_FOUND to FALSE so package "OpenCV" is considered to beNOT FOUND.

解決:檢視以下minSdkVersion是否設定的太低,設定為16的時候出現了這個問題,設定為21後消失。