Android OpenCV:颜色检测给出奇怪的结果

Posted

技术标签:

【中文标题】Android OpenCV:颜色检测给出奇怪的结果【英文标题】:Android OpenCV: color detection giving weird result 【发布时间】:2017-08-10 07:49:51 【问题描述】:

我刚刚学会了如何从OpenCV Java, Getting region of interest from image 中检测颜色。

最后,我想知道如何检测 AA 电池(带或不带黑色胶带)

我现在正在尝试检测图片中的电池,但电池并没有完全变黑,这反过来又给了我奇怪的结果:

我用黑色胶带盖住电池并再次尝试,结果似乎更好,但它在两个单独的部分检测电池:

代码:

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;

【问题讨论】:

【参考方案1】:

最简单的方法 - 为电池添加颜色标记。其他方式是为您的安装的垂直通道设置坚实、可区分的背景(甚至可能是背光 - 在这种情况下,您应该在白色/高亮度背景上找到黑色/低亮度物体)。如果不可能并且您有纯色背景-尝试“反转”方法:不要尝试查找电池(因为它有多种颜色)-查找背景(因为它只有一种纯色)-可能具有“非背景”颜色的对象电池(并且您还有其他提示:电池是比例为 1/4 的“垂直”矩形)(AAA 电池的直径为 10.5 毫米,长度为 44.6 毫米),它大约位于图像的垂直中心,并且上面有镀铬的高亮度元素顶部和底部等)。

【讨论】:

以上是关于Android OpenCV:颜色检测给出奇怪的结果的主要内容,如果未能解决你的问题,请参考以下文章

Android OpenCV 绘制霍夫线

如何知道在opencv上是不是检测到颜色[重复]

OpenCV 颜色浓度直方图

OpenCV undistortPoints 和 triangulatePoint 给出奇怪的结果(立体声)

如何在 OpenCV 中实现颜色分割和前景检测?

OpenCV实战——基于反向投影直方图检测图像内容