iT邦幫忙

3

我自己在寫影像辨識時,都是先使用Python撰寫好後再寫一個到Android studio的java語言,主要這兩者語法不同,多寫就可以更加熟悉辨識流程差異,但當用顏色像素辨識時,Android studio就不像python那麼順利了,以下會先說明兩者針對顏色通道辨識差異後,再測試Chaquopy 這個強大插建,當發現能將Android studio結合python時就迫不及待來玩看看了!

  • 流程:
  1. Chaquopy插建安裝
  2. Android studio與python顏色通道差異
  3. Android studio與python數據類型差異
  4. Android studio讀取資源文件夾圖片與讀取imageView中的圖像差異

Chaquopy插建安裝

專案的minSdk必須至少為21,Android 5以上
id("com.chaquo.python") version "15.0.1" apply false
https://ithelp.ithome.com.tw/upload/images/20240708/20167256Lv36jTlQ33.png

id("com.chaquo.python")
https://ithelp.ithome.com.tw/upload/images/20240708/20167256OBrJkxfXjk.png

打開cmd,輸入where python可以查看路徑
https://ithelp.ithome.com.tw/upload/images/20240708/20167256hMCEDoIUBD.png
ndk { abiFilters "arm64-v8a", "x86", "x86_64" }
python { buildPython "C:\\Users\\123\\AppData\\Local\\。。。。。python.exe" }
sourceSets { main{ python.srcDir "src/main/python" }
https://ithelp.ithome.com.tw/upload/images/20240708/20167256Gy6ARazJrR.png

之後點擊上方sync now等待更新,好了後打開project-main會發現有創建一個python資料夾,
https://ithelp.ithome.com.tw/upload/images/20240708/20167256cvxMXoYnbb.png
sourceSets { main{ python.srcDir "src/main/python" }
這行作用添加了一個名為python的源代碼目錄到項目的主源代碼集main中,名稱可以更改。

點擊此資料夾創建py檔案,如沒有顯示也可以直接到資料夾新增
E:....\Androidstdio\import_python\app\src\main\python(到此新增.py檔)
https://ithelp.ithome.com.tw/upload/images/20240708/20167256GyMDEkmDUJ.png

測試

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://ithelp.ithome.com.tw/upload/images/20240708/20167256QslW2cNZQX.png

詳細資料在這網站
https://chaquo.com/chaquopy/doc/current/android.html

Android studio與python數據類型差異

  • Android:使用Bitmap類來表示圖像數據,而在OpenCV中,圖像數據通常表示為Mat對象,轉換流程:Android Studio將Bitmap轉換為OpenCV的Mat進行顏色辨識,然後將處理後的圖像重新轉換為Bitmap並顯示在ImageView 中。
  • Python:使用OpenCV時,圖像數據也表示為Mat對象(NumPy陣列)。

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);
  • 讀取imageView中的圖像
//指定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);

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言