android 如何使用OpenCV排除遮挡对象?

jtjikinw  于 2023-04-10  发布在  Android
关注(0)|答案(2)|浏览(169)

我是一名准备参加一个涉及使用OpenCV等库进行识别和处理的比赛的学生。我已经学习了一个多月的OpenCV基础知识,现在我遇到了一个非常棘手的问题。我能够使用OpenCV识别具有五种随机类型和七种颜色的多边形。我已经解决了识别颜色和形状的问题,但是我不知道如何排除被遮挡的多边形。请参阅第二列了解更多细节。
我正在尝试使用Android版OpenCV来解决多边形识别的问题,目前使用的方法是使用inRange()方法获得二值图像,然后使用findContours()方法寻找轮廓,对获得的轮廓进行开闭操作,然后使用approxPolyDP()方法进行多边形近似,最后,使用convexHull()方法检测角点并确定多边形的类型。此方法可以识别简单的多边形,但也可以识别被前景覆盖的多边形,这些多边形是无效的(应排除)。我应该如何排除这些覆盖的多边形?

示例图片:enter image description here

有人能帮我一下吗?非常感谢!

wsewodh2

wsewodh21#

要排除被前景遮挡或覆盖的多边形,您可以尝试使用OpenCV中的蒙版概念。蒙版是与原始图像具有相同尺寸的二进制图像,其中对应于感兴趣区域的像素设置为1,其余像素设置为0。

nbnkbykc

nbnkbykc2#

要排除被前景对象遮挡的多边形,可以使用一种称为轮廓过滤的技术。轮廓过滤是一个分析每个轮廓的属性并过滤掉不符合标准的轮廓的过程。
过滤被遮挡多边形的一种方法是计算轮廓的面积,并将其与其外接矩形的面积进行比较。如果轮廓面积与外接矩形面积的比值小于某个阈值,则可以假定轮廓被遮挡并将其排除。
下面是演示此技术的示例代码:

import org.opencv.android.Utils;
import org.opencv.core.*;
import org.opencv.imgproc.Imgproc;

// Load the image
Mat img = Utils.loadResource(this, R.drawable.your_image, Imgcodecs.CV_LOAD_IMAGE_COLOR);

// Convert the image to grayscale
Mat gray = new Mat();
Imgproc.cvtColor(img, gray, Imgproc.COLOR_BGR2GRAY);

// Apply thresholding to obtain a binary image
Mat thresh = new Mat();
Imgproc.threshold(gray, thresh, 0, 255, Imgproc.THRESH_BINARY_INV + Imgproc.THRESH_OTSU);

// Find contours
List<MatOfPoint> contours = new ArrayList<>();
Mat hierarchy = new Mat();
Imgproc.findContours(thresh, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE);

// Iterate through each contour and filter out the ones that are occluded
for (MatOfPoint cnt : contours) {
    // Calculate the area of the contour
    double area = Imgproc.contourArea(cnt);

    // Calculate the area of the bounding rectangle
    Rect rect = Imgproc.boundingRect(cnt);
    double rectArea = rect.width * rect.height;

    // Calculate the ratio of the contour area to the bounding rectangle area
    if (rectArea > 0 && area / rectArea > 0.5) {
        // This contour is not occluded
        // Perform further processing on the contour
    }
}

相关问题