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代码实时编译为本机代码。