首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 圖形識別方案:拍照識別指定顏色三角形/圓形/矩形個數

     編輯:程式設計綜合問答

需求

Android 手機拍攝圖片,畫面包含紅/綠/藍三色的三角形、圓形、矩形,需識別「指定顏色 + 指定形狀」的個數。

處理流程

  1. 顏色分割:將圖像轉 HSV 空間,根據閾值提取紅/綠/藍三個二值掩膜。
  2. 連通域分析:對每個顏色掩膜執行 findContours(OpenCV)或 ConnectedComponents,獲得各連通區域。
  3. 形狀分類:對每個輪廓近似多邊形(approxPolyDP),按頂點數判斷:3→三角形,4→矩形,>8→圓形(或用圓度 4π*Area/Perimeter² 判斷)。
  4. 統計計數:建立 Map<String, Integer> 記錄「顏色_形狀」計數。

關鍵技術棧

  • OpenCV Android SDK(org.opencv:opencv:4.x)
  • Mat、Imgproc、Core 等核心類
  • 相機預覽幀實時處理或靜態圖片處理

偽代碼

Mat src = Imgcodecs.imread(path);
Mat hsv = new Mat();
Imgproc.cvtColor(src, hsv, Imgproc.COLOR_BGR2HSV);

for (ColorDef color : colors) {
    Mat mask = new Mat();
    Core.inRange(hsv, color.lower, color.upper, mask);
    List<MatOfPoint> contours = new ArrayList<>();
    Imgproc.findContours(mask, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
    for (MatOfPoint cnt : contours) {
        MatOfPoint2f approx = new MatOfPoint2f();
        Imgproc.approxPolyDP(new MatOfPoint2f(cnt.toArray()), approx, 0.02 * Imgproc.arcLength(new MatOfPoint2f(cnt.toArray()), true), true);
        int vertices = approx.toArray().length;
        String shape = classify(vertices, cnt); // 三角形/矩形/圓形
        counter.increment(color.name + "_" + shape);
    }
}

注意事項

  • 光照變化大時,HSV 閾值需自適應或引入光照補償。
  • 形狀邊緣模糊會導致頂點數誤判,建議先高斯模糊再邊緣檢測。
  • 實時性要求高時,考慮縮放圖像至 640×480 以下處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved