• Android App开发超实用实例 | OpenCV在Android手机实现在图像上添加文本


     OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,它可以运行在Linux、Windows、Android和Mac OS等操作系统上。OpenCV原本由一系列 C 函数和少量 C++ 类构成,同时提供了Python等其他语言的接口,它实现了图像处理和计算机视觉方面的很多通用算法。下面这个实例演示了使用OpenCV在Android手机实现在图像上绘制文本。本文提供的OpenCV实例使用Java语言编写,并且运行在Android手机上。

    01、实例功能

    此实例主要通过使用Imgproc的putText()方法,实现在图像上绘制(添加)文本。Imgproc是Image和Processing这两个单词的缩写组合,它是OpenCV的图像处理模块,该模块包含如下内容:线性和非线性的图像滤波、图像的几何变换、图像转换、直方图相关、结构分析和形状描述、运动分析和对象跟踪、特征检测、目标检测等。

    当实例运行之后,单击“显示原始图像”按钮,原始图像的效果如图1(a)所示。单击“在图像上添加文本”按钮,在图像上添加文本(OpenCV)之后的效果如图1(b)所示。

     

    02、实现代码

    1. public class MainActivity extends Activity {
    2. ImageView myImageView;
    3. Bitmap myBitmap;
    4. static{ System.loadLibrary("opencv_java3");} //加载OpenCV库
    5. @Override
    6. protected void onCreate(Bundle savedInstanceState) {
    7. super.onCreate(savedInstanceState);
    8. setContentView(R.layout.activity_main);
    9. myImageView = (ImageView) findViewById(R.id.myImageView);
    10. myBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.myimage1);
    11. }
    12. public void onClickButton1(View v) { //响应单击按钮“显示原始图像”
    13. myImageView.setImageBitmap(myBitmap);
    14. }
    15. public void onClickButton2(View v) { //响应单击按钮“在图像上添加文本”
    16. Bitmap myNewBitmap=Bitmap.createBitmap(myBitmap.getWidth(),
    17. myBitmap.getHeight(),Bitmap.Config.RGB_565); //根据原始图像创建空Bitmap
    18. Mat myMat=new Mat();
    19. Utils.bitmapToMat(myBitmap,myMat); //将原始图像保存至myMat
    20. Point myPoint=new Point(300, 700); //定义绘制文本的起始位置
    21. Scalar myScalar=new Scalar(255,0,0,255); //设置绘制文本的颜色
    22. //在图像上添加文本(仅支持英文、符号等,中文暂不支持)
    23. Imgproc.putText(myMat,"OpenCV",myPoint,
    24. Core.FONT_HERSHEY_COMPLEX,4,myScalar,3);
    25. //将添加文本之后的图像输出至myNewBitmap
    26. Utils.matToBitmap(myMat,myNewBitmap);
    27. //通过ImageView控件显示叠加文本之后的图像
    28. myImageView.setImageBitmap(myNewBitmap);
    29. }
    30. }

    03、代码说明

    上面这段代码在MyCode\MySampleK31\app\src\main\java\com\bin\luo\mysample\ MainActivity.java文件中。在这段代码中,Imgproc的putText()方法用于在图像上添加文字(字母),该方法的语法声明如下:

    其中,参数Mat img表示待绘制的图像;参数String text表示待绘制的文字;参数Point org表示文字的起点坐标;参数int fontFace表示字体;参数double fontScale表示文字大小因子,值越大文字越大;参数Scalar color表示文字颜色;参数int thickness表示文字线条宽度。

    Utils.bitmapToMat(myBitmap,myMat)用于将Bitmap输出到Mat,该方法的语法声明如下: 

    其中,参数Bitmap bmp表示源Bitmap,支持ARGB_8888和RGB_565像素类型;参数Mat mat表示目标Mat,默认类型是CV_8UC4类型,大小和Bitmap一样,通道顺序为RGBA。

    Utils.matToBitmap(myMat,myNewBitmap)用于将Mat输出到Bitmap,该方法的语法声明如下: 

    其中,参数Mat mat表示源Mat,支持CV_8UC1,CV_8UC3或CV_8UC4类型;参数Bitmap bmp表示目标Bitmap,支持ARGB_8888或RGB_565类型。

    static{ System.loadLibrary("opencv_java3");}表示加载OpenCV库。默认情况下,在Android中使用OpenCV需要导入相关的库文件,具体操作步骤如下。 

    (1) 从https://opencv.org/releases.html页面中单击Android pack超链接,稍等一会儿即可弹出“新建下载任务”对话框,然后在该对话框中单击“下载”按钮,执行下载操作,如图2所示。在下载完成之后解压文件即可。在此实例中,可以忽略此步骤,直接从源代码中复制openCVLibrary345Copy文件夹到项目即可。

     

    (2) 在Android Studio菜单上依次选择File\New\Import Module...,弹出Import Module from Source对话框。在该对话框中单击“Source directory:”右端的文件夹按钮,然后选择openCVLibrary345Copy文件夹,会出现错误(重复)提示。直接在“Module name:”输入框中将openCVLibrary345Copy修改为openCVLibrary345,错误提示消失,如图3所示。再单击Finish按钮即可。

     (3) 按照如下粗体字所示修改MyCode\MySampleK31\app\build.gradle文件。完成之后同步(Sync Now)即可。

    1. apply plugin: 'com.android.application'
    2. android {
    3. compileSdkVersion 29
    4. buildToolsVersion "29.0.2"
    5. defaultConfig {
    6. applicationId "com.bin.luo.mysample"
    7. minSdkVersion 27
    8. targetSdkVersion 29
    9. versionCode 1
    10. versionName "1.0"
    11. testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    12. }
    13. buildTypes {
    14. release {
    15. minifyEnabled false
    16. proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    17. }
    18. }
    19. sourceSets { main { jniLibs.srcDirs = ['libs'] } }
    20. }
    21. dependencies {
    22. implementation fileTree(dir: 'libs', include: ['*.jar'])
    23. implementation 'androidx.appcompat:appcompat:1.0.2'
    24. implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    25. testImplementation 'junit:junit:4.12'
    26. implementation project(':openCVLibrary345')
    27. androidTestImplementation 'androidx.test:runner:1.2.0'
    28. androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    29. }

     (4) 复制MyCode\MySampleK31\app\libs文件夹下的所有内容到(用户的)项目中即可。该文件夹及其子文件夹的文件与手机CPU的类型有关,缺少这些文件在编译或运行时会报错或无响应。

    特别说明 /

    在测试前必须从MyCode\MySampleK31\app\libs文件夹复制该文件夹中的所有子文件夹及其文件到(用户的)项目的libs文件夹。

    04、补充说明

    在测试代码时,必须保持网络畅通。

  • 相关阅读:
    跟羽夏学 Ghidra ——工具
    使用Python将MySQL查询结果导出到Excel(xlsxwriter)
    linux——环境基础开发工具使用
    Blender色彩管理的关键概念和使用方法
    深度学习入门(八) 多层感知机
    【Python】python使用docxtpl生成word模板
    Godot屏幕抖动效果原理与实现
    【infiniband】 MAD、 uMAD、Verbs、RDMACM
    操作系统安全性实训
    [计算机网络] 虚拟局域网
  • 原文地址:https://blog.csdn.net/qq_41640218/article/details/127644864