当前位置: 首页 > news >正文

Android修行手册-Chaquopy中opencv、numpy的初步应用

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总
游戏脚本-辅助自动化Android控件全解手册再战Android系列
Scratch编程案例软考全系列Unity3D学习专栏
蓝桥系列ChatGPT和AIGC

👉关于作者

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎底部卡片私我,交流让学习不再孤单

在这里插入图片描述

👉实践过程

😜OpenCV

对于Android开发者而言,使用OpenCV可以实现很多有趣的功能。然而,Android开发中使用OpenCV也存在一些问题,比如对库的导入和集成需要较高的技术门槛。

相比之下,使用Chaquopy集成Python和OpenCV库,可以简化Android开发中对OpenCV库的使用和集成,使得开发人员可以更加轻松地开发应用。使用Chaquopy,开发人员可以直接使用Python编写OpenCV的代码,避免Java语言本身的一些限制。

pip{install "opencv-python"
}

在这里插入图片描述
经由Java读取图片,并转换格式传给python OpenCV进行运算,运算后如何再将python格式转换成Java格式进行显示,达到java与python交互应用。
由于python运行OpenCV运算时,需要将Java的byte格式透过numpy转成OpenCV格式,因此透过以下程式码可进行转换。

opencv_python.py:

import numpy as np
import cv2def opencv_process_image(data):# 读取图片数据image = cv2.imdecode(np.asarray(data),cv2.IMREAD_COLOR)# 将图像转换为灰度图像gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 将处理后的图像转换为png格式并转换为byte数组is_success, im_buf_arr = cv2.imencode(".png", gray_image)byte_im = im_buf_arr.tobytes()# 返回处理后的图像数据return byte_im​

Java


public class MainActivity extends AppCompatActivity {Button Go_btn;ImageView src_image, res_image;BitmapDrawable drawable;Bitmap  bitmap;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Go_btn = findViewById(R.id.Go_button);src_image = (ImageView) findViewById(R.id.source_imageview);res_image = (ImageView) findViewById(R.id.response_imageview);//初始化python环境if(!Python.isStarted()){Python.start(new AndroidPlatform(this));}Python python_cv = Python.getInstance();Go_btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {// 获取源图片并转换为Bitmap对象drawable = (BitmapDrawable) src_image.getDrawable();bitmap = drawable.getBitmap();// 将Bitmap转换为byte[]对象ByteArrayOutputStream stream = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);byte[] byteArray = stream.toByteArray();// 调用Python方法处理图片PyObject cvObject = python_cv.getModule("opencv_python");byte[] bytes = cvObject.callAttr("opencv_process_image",byteArray).toJava(byte[].class);// 将处理后的图片显示到画面上Bitmap bmp = BitmapFactory.decodeByteArray(bytes,0, bytes.length);res_image.setImageBitmap(bmp);}});}
}

在这里插入图片描述

😜numpy

提供两个范例,

  1. 使用numpy计算两个矩阵的乘积。
  2. 使用numpy生成随机数组,并计算其平均值和标准差,除了透过python使用numpy计算外,还能将计算后的数值返回并转成java格式,供使用者能够在java进行后续应用,达到java与python交互应用。

使用numpy计算两个矩阵的乘积: 在hello_python.py档案内增加。

import numpy as np#使用numpy计算两个矩阵的乘积
def matrix_multiply():a = np.array([[1, 2], [3, 4]])b = np.array([[5, 6], [7, 8]])c = np.matmul(a, b)return c

将python内numpy计算完后的数值读取到 Java 中

//初始化python环境
if(!Python.isStarted()){Python.start(new AndroidPlatform(this));
}//使用numpy计算两个矩阵的乘积
Python py = Python.getInstance();//调用hello_python.py里面的matrix_multiply函式
PyObject pyObj = py.getModule("hello_python").get("matrix_multiply");//将matrix_multiply计算完的数值,换成java中的float类型
float[][] result = pyObj.call().toJava(float[][].class);
String resultStr = "";
for (int i = 0; i < result.length; i++) {for (int j = 0; j < result[i].length; j++) {resultStr += result[i][j] + " ";}resultStr += "\n";}
Log.d("Result", resultStr);

使用numpy生成随机数组,并计算其平均值和标准差: 在hello_python.py档案内增加。

import numpy as np#使用numpy生成随机数组,并计算其平均值和标准差。
def numpy_example():# Generate a random array with shape (3, 3)a = np.random.rand(3, 3)# Calculate the mean of the arraymean = np.mean(a)# Calculate the standard deviation of the arraystd = np.std(a)return mean, std​
//使用numpy生成随机数组,并计算其平均值和标准差。
Python np = Python.getInstance();
//调用hello_python.py里面的numpy_example函式
PyObject npObj = np.getModule("hello_python").get("numpy_example");
PyObject npResult = npObj.call();
//numpy_example的返回值有两个,将其分别转换成java中的float类型
float mean = npResult.asList().get(0).toFloat();
float std = npResult.asList().get(1).toFloat();
Log.d("Result"," mean = "+ mean);
Log.d("Result"," std = "+ std);

👉其他

📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

温馨提示点击下方卡片获取更多意想不到的资源。
空名先生

http://www.lryc.cn/news/309175.html

相关文章:

  • VBA将当前打开的表格生成PDF图片
  • 解锁AI大模型秘籍:未来科技的前沿探索
  • 一文带你了解MySQL之B+树索引的原理
  • 【Vue】npm run build 打包报错:请在[.env.local]中填入key后方可使用...
  • 中国电子学会2020年06月真题C语言软件编程等级考试三级(含详细解析答案)
  • WPF的DataGrid自动生成中文列头
  • CSS【详解】居中对齐 (水平居中 vs 垂直居中)
  • 【排序算法】基数排序
  • 解释存储过程和函数的区别,以及它们在MySQL中的用途。如何创建和使用存储过程和函数?
  • 【GPU驱动开发】-GPU架构简介
  • m位数问题(c++题解)
  • 洛谷P1331海战
  • 如何利用Flutter来写后端 服务端应用
  • 数据页和缓存页(BufferPool)
  • LibreOJ 136. 最小瓶颈路 题解 最小生成树 倍增
  • 前端学习第三天-css基础
  • 各种使用chatgpt prompts技巧
  • 基于单片机的企业指纹考勤系统设计
  • JUC(java.util.concuurrent)的常见类介绍
  • 【中科院计算所】WSDM 2024冠军方案:基于大模型进行多文档问答
  • Android提供了多种方式来打开特定文件夹中的视频
  • 基于django的购物商城系统
  • Swagger3 使用详解
  • JVM 第二部分-2(堆,方法区)
  • 蓝桥杯Java B组历年真题(2013年-2019年)
  • 你是谁,便会遇见谁
  • Linux/Centos 部署静态IP,解决无法访问目标主机、Destination Host Unreachable、无法ping通互联网的问题
  • 在学习云原生的时候,一直会报错ImagePullBackOff Back-off pulling image
  • Android Activity跳转详解
  • 计算机网络(2)-----数据链路层