2017-08-10 45 views
0

我剛剛學會如何檢測OpenCV Java, Getting region of interest from image中的顏色。Android OpenCV:顏色檢測給出奇怪的結果

最後,我想知道我怎麼可以檢測節AA電池(有或沒有黑膠帶)

現在我嘗試偵測畫面中的電池,但電池不完全黑色,反過來給我怪異的結果:

enter image description here

我所涵蓋的電池用黑色膠帶,並試圖再次結果似乎更好,但它被檢測兩個獨立部分電池:

enter image description here

代碼:

private Bitmap findRoiBlack(Bitmap sourceBitmap) { 
    Bitmap roiBitmap = null; 
    Scalar green = new Scalar(0, 255, 0, 255); 
    Mat sourceMat = new Mat(sourceBitmap.getWidth(), sourceBitmap.getHeight(), CvType.CV_8UC3); 
    Utils.bitmapToMat(sourceBitmap, sourceMat); 
    Mat roiTmp = sourceMat.clone(); 

    final Mat hsvMat = new Mat(); 
    sourceMat.copyTo(hsvMat); 

    // convert mat to HSV format for Core.inRange() 
    Imgproc.cvtColor(hsvMat, hsvMat, Imgproc.COLOR_RGB2HSV); 

    Scalar lowerb = new Scalar(0, 0, 0);   // lower color border for BLACK 
    Scalar upperb = new Scalar(180, 255, 30);  // upper color border for BLACK 

    //Scalar lowerb = new Scalar(0, 0, 200);   // lower color border for WHITE 
    //Scalar upperb = new Scalar(180, 255, 255);  // upper color border for WHITE 
    Core.inRange(hsvMat, lowerb, upperb, roiTmp); // select only blue pixels 

    // find contours 
    List<MatOfPoint> contours = new ArrayList<>(); 
    List<RotatedRect> boundingRects = new ArrayList<>(); 
    Imgproc.findContours(roiTmp, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE); 

    // find appropriate bounding rectangles 
    for (MatOfPoint contour : contours) { 
     MatOfPoint2f areaPoints = new MatOfPoint2f(contour.toArray()); 
     RotatedRect boundingRect = Imgproc.minAreaRect(areaPoints); 

     double rectangleArea = boundingRect.size.area(); 

     // test min ROI area in pixels 
     if (rectangleArea > 400) { 
      Point rotated_rect_points[] = new Point[4]; 
      boundingRect.points(rotated_rect_points); 

      Rect rect = Imgproc.boundingRect(new MatOfPoint(rotated_rect_points)); 

      // test vertical ROI orientation 
      if (rect.height > rect.width) { 
       Imgproc.rectangle(sourceMat, rect.tl(), rect.br(), green, 3); 
      } 
     } 
    } 

    roiBitmap = Bitmap.createBitmap(sourceMat.cols(), sourceMat.rows(), Bitmap.Config.ARGB_8888); 
    Utils.matToBitmap(sourceMat, roiBitmap); 
    return roiBitmap; 
} 

回答

2

最簡單的方法 - 就是添加顏色標記,將電池。其他方式是爲您的安裝垂直通道設置牢固,可區分背景(可能甚至是背光 - 在這種情況下,您應該在白色/高亮度背景上找到黑色/低亮度對象)。如果這是不可能的,並且你有堅實的背景 - 嘗試「顛倒」的方法:不要嘗試找到電池(因爲它有很多顏色) - 找到背景(因爲它有一個純色) - 有「非背景」電池(還有其他提示:電池是1/4比例的「垂直」長方形(AAA電池直徑10.5毫米,長44.6毫米),它大約位於圖像的垂直中心,並且鍍鉻的高亮度元件頂部和底部等)。