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代碼實時編譯為本機代碼。
評論