Android App开发新选择(三):透过Chaquopy结合Python第三方库opencv安装与应用

1.      前言

前一篇已经教大家如何在Android Studio上如何进行Python第三方库numpy的安装与应用;这次要来教大家Python第三方库OpenCV的安装与应用;对于Android开发者而言,使用OpenCV可以实现很多有趣的功能。然而,Android开发中使用OpenCV也存在一些问题,比如对库的导入和集成需要较高的技术门槛。

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

2.      Android Studio安装Python第三方库OpenCV

 以下环境是在Windows 10下建置。

a.       在appabuild.gradleadefaultConfigapython区块添加文件添加。(图1) 

pip{
install "opencv-python"
}​

图1

b.       设定完后记得,点击Sync Now进行同步,完成之后,Python的第三方库OpenCV套件就成功加入项目内。(图2)

 

图2

3.      Android内使用 Python第三方库OpenCV套件范例

以下提供一个范例,让各位看官们可以了解如何经由Java读取图片,并转换格式传给python OpenCV进行运算,运算后如何再将python格式转换成Java格式进行显示,达到java与python交互应用。

a. 此范例会使用numpy与OpenCV两种第三方库,因此看官们也需要将numpy进行安装。(图3)

 

图3

b. 增加一个py档案,由于python运行OpenCV运算时,需要将Java的byte格式透过numpy转成OpenCV格式,因此透过以下程式码可进行转换。(图4)

import numpy as np
import cv2

def 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​

 

图4

c. 在Android layout的activity_main档案进行UI设计,增加两个ImageView及一个Button功能;source_imageview显示原始图片,当Button按下后,response_imageview则显示OpenCV处理完后的图片。(图5)

<ImageView
android:id="@+id/source_imageview"
android:layout_width="200dp"
android:layout_height="206dp"
android:layout_marginStart="8dp"
android:layout_marginTop="68dp"
android:src="@drawable/test"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<ImageView
android:id="@+id/response_imageview"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_marginStart="31dp"
android:layout_marginTop="68dp"
android:layout_marginEnd="105dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.233"
app:layout_constraintStart_toEndOf="@+id/source_imageview"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/Go_button"
android:layout_width="146dp"
android:layout_height="48dp"
android:layout_marginStart="142dp"
android:layout_marginEnd="123dp"

android:layout_marginBottom="331dp"
android:text="Go"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />​
 

图5

e. 在Java主程式MainActivity档案内增加以下程式码,各位看官可以看程式码内的注解了解相关应用。(图6)

public class MainActivity extends AppCompatActivity {
Button Go_btn;
ImageView src_image, res_image;

BitmapDrawable drawable;
Bitmap bitmap;
@Override
protected 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() {
@Override
public 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);
}
});
}
}​

 

图6

f. 结果显示(图7)

 

图7

结语

透过以上的教学,相信各位已经能够成功透过Android Studio轻松地结合Chaquopy使用Python第三方库OpenCV,这让习惯使用Python OpenCV方式的看官们提供更多的功能应用选择,使得开发过程更加灵活和高效,有问题的看官们欢迎联系我,我们一同讨论。

喜欢我的帖子,请帮我按个”收藏”,我们下回见。

 

Q&A

1. 为什么要使用Chaquopy结合OpenCV进行Android开发?

Ans:结合Chaquopy和OpenCV可以方便地在Android应用程序中使用Python代码和OpenCV图像处理功能,从而简化开发过程并提高应用程序的性能。 

2. Chaquopy支援其他Python第三方库吗?

Ans:Chaquopy 可以支援多种常用的Python第三方库,例如:SciPy、Pandas、Matplotlib、Scikit-learn等。详细第三方库可参考Chaquopy package repository网站 

3. 在使用Chaquopy时需要注意哪些问题?

Ans:需要确保Python代码和OpenCV库文件与应用程序的其他组件相容,并确保使用正确的Python版本。 

4. Chaquopy的Python是否支持多线程?

Ans:是的,Chaquopy的Python支持多线程,并且可以通过简单的配置进行优化。 

5. 需要为Python脚本编译.so文件吗?

Ans:不需要,Chaquopy将Python代码实时编译为本机代码。

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论