我自己在寫影像辨識時,都是先使用Python撰寫好後再寫一個到Android studio的java語言,主要這兩者語法不同,多寫就可以更加熟悉辨識流程差異,但當用顏色像素辨識時,Android studio就不像python那麼順利了,以下會先說明兩者針對顏色通道辨識差異後,再測試Chaquopy 這個強大插建,當發現能將Android studio結合python時就迫不及待來玩看看了!
Chaquopy插建安裝
專案的minSdk必須至少為21,Android 5以上id("com.chaquo.python") version "15.0.1" apply false
id("com.chaquo.python")
打開cmd,輸入where python可以查看路徑ndk { abiFilters "arm64-v8a", "x86", "x86_64"}
python { buildPython "C:\\Users\\123\\AppData\\Local\\。。。。。python.exe"}
sourceSets { main{ python.srcDir "src/main/python" }
之後點擊上方sync now等待更新,好了後打開project-main會發現有創建一個python資料夾,sourceSets { main{ python.srcDir "src/main/python" }
這行作用添加了一個名為python的源代碼目錄到項目的主源代碼集main中,名稱可以更改。
點擊此資料夾創建py檔案,如沒有顯示也可以直接到資料夾新增
E:....\Androidstdio\import_python\app\src\main\python(到此新增.py檔)
測試
xml只要有textView就可,主要測試python是否能執行
package com.example.import_python;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import com.chaquo.python.PyObject;
import com.chaquo.python.Python;
import com.chaquo.python.android.AndroidPlatform;
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
if (!Python.isStarted()) {
Python.start(new AndroidPlatform(this));
}
Python python = Python.getInstance();
// 調用 script1.py 裡面的 add_numbers 函數
PyObject pyObject = python.getModule("test");
PyObject result = pyObject.callAttr("add_numbers", 3, 5);
// 將返回值設置到 TextView 上
textView.setText("Result: " + result.toString());
}
}
.py檔
# test.py
def add_numbers(a, b):
return a + b
顯示結果如圖下方結果8就代表你安裝成功了。
詳細資料在這網站
https://chaquo.com/chaquopy/doc/current/android.html
Android studio與python數據類型差異
Android studio與python顏色通道差異
Java:Android使用 RGB(紅綠藍)顏色空間,但在OpenCV中是使用BGR(藍綠紅)顏色空間,兩著順序需要變更才可以讀取到你要的色相。
Python:Python 的 OpenCV 使用 BGR 顏色空間。如果在 Python 中讀取了一張圖像,直接進行處理時,顏色通道順序不會改變。而且也可以透過OpenCV的函數如cvtColor來進行顏色空間的轉換。
Android studio讀取資源文件夾圖片與讀取imageView中的圖像差異
//指定xml中的imageView
imageView = findViewById(R.id.imageView);
//讀取資源文件夾圖片
imageView.setImageResource(R.drawable.sample_image);
//轉換為Bitmap
Drawable drawable = imageView.getDrawable();
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
//將Bitmap轉換為Mat
Mat mat = new Mat(bitmap.getHeight(), bitmap.getWidth(), CvType.CV_8UC4);
Utils.bitmapToMat(bitmap, mat);
//透過opencv將Mat格式轉換為灰階
Mat grayMat = new Mat();
Imgproc.cvtColor(mat, grayMat, Imgproc.COLOR_BGR2GRAY);
//將灰階Mat轉換為Bitmap供Androidstudio顯示
Bitmap grayBitmap = Bitmap.createBitmap(grayMat.cols(), grayMat.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(grayMat, grayBitmap);
//將處理後的Bitmap顯示在ImageView中
imageView.setImageBitmap(grayBitmap);
//指定xml中的imageView
imageView = findViewById(R.id.imageView);
//從資源文件夾中加載圖像並轉換為Mat
Mat drawable = Utils.loadResource(this, R.drawable.sample_image);
//將圖像轉換為灰階
Mat grayMat = new Mat();
Imgproc.cvtColor(drawable, grayMat, Imgproc.COLOR_BGR2GRAY);
//將灰階Mat轉換為Bitmap供Androidstudio顯示
Bitmap grayBitmap = Bitmap.createBitmap(grayMat.cols(), grayMat.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(grayMat, grayBitmap);
//將處理後的Bitmap顯示在ImageView中
imageView.setImageBitmap(grayBitmap);