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次,發文人進小黑屋喔~

評論