一,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,更老的版本没有下载成功。

所以还是按照各自版本的步骤来配置吧,应该就不会有这个问题。

使用OpenCVLoader.initDebug()的方式也会报这个错,但是灰度化是有效的。使用System.loadLibrary("opencv_java4"),不会有这个错。

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

解决:查看以下minSdkVersion是否设置的太低,设置为16的时候出现了这个问题,设置为21后消失。

最新文章

  1. ssh整合问题总结--使用struts2+Ajax+jquery验证用户名是否已被注册
  2. 洛谷P3128 [USACO15DEC]最大流Max Flow [倍增LCA]
  3. Legolas工业自动化平台入门(二)数据响应动作
  4. mysql-5.6.15_winX64在win764位系统下的安装操作步骤总结
  5. session cookie原理及应用
  6. ubuntu系统下创建软件桌面快捷方式
  7. Linq skip skipwhile take takewhile
  8. git 关键词扩展
  9. iOS Button 上文字图片位置的设置
  10. Oracle Rac创建表空间及用户
  11. 【RL-TCPnet网络教程】第9章 RL-TCPnet网络协议栈移植(uCOS-III)
  12. nginx基本配置与参数说明
  13. Mysql MyISAM与InnoDB 表锁行锁以及分库分表优化
  14. jenkins中通过execute shell启动的进程会被杀死的问题
  15. idea 设置console 无1024限制,复制到Excel分隔符\t
  16. BZOJ.5289.[AHOI/HNOI2018]排列(贪心 heap)
  17. 在php cli下可以使用 STDIN 来实现标准输入
  18. 20190315xlVBA_删除无用的区域
  19. EFCore中SQLSERVER 2008 的分页问题
  20. NSZombie 详解 -僵尸对象

热门文章

  1. 问题记录_IDEA版本2021.2.3_debug时变量显示不全(只显示线程附近部分)
  2. python+POM项目设计模式
  3. C# 当页面有很多选择条件时的处理方式
  4. 修改 npm 全局模块及模块缓存存放位置
  5. Intel oneAPI 环境变量设置
  6. Typora的初使用
  7. java连接couchbase的memcache
  8. 关闭 Microsoft Compatibility Telemetry
  9. TCP协议之三次握手(二)
  10. Python生成whl文件