除了Haar级联之外,还有哪些算法或方法可以用于自定义对象的检测?

10 浏览
0 Comments

除了Haar级联之外,还有哪些算法或方法可以用于自定义对象的检测?

为了检测水瓶或汽水罐,我需要进行计算机视觉任务。我将获取水瓶、汽水罐或其他随机物体(逐个)的“正面”图像,并且我的算法应该确定它是瓶子、罐子还是它们中的任何一种。

关于物体检测场景的一些细节:

  • 如上所述,我将在每个图像/视频帧中测试一个单独的物体。
  • 并非所有水瓶都是相同的。塑料、盖子或标签的颜色可能会有所变化。也许有些水瓶没有标签或盖子。
  • 汽水罐也是如此。不会测试有皱纹的汽水罐。
  • 物体之间可能会有小尺寸的变化。
  • 我可能会有一个绿色(或任何自定义颜色)的背景。
  • 我将对图像进行任何必要的滤波。
  • 这将在树莓派上运行。

以防万一,这是每个物体的示例:

enter image description here enter image description here

我已经测试过几次OpenCV人脸检测算法,我知道它的效果非常好,但我需要获取特殊的Haar级联特征XML文件,以便在这种方法中检测每个自定义物体。

因此,我心中有以下几个不同的选择:

我想要一个简单的算法,我认为甚至可能不需要创建自定义的Haar分类器。你有什么建议吗?

更新

我非常考虑了形状/长宽比的方法。

然而,我想我面临一些问题,因为每个瓶子的大小甚至形状都不同。 但是,这让我思考或设定以下考虑因素:

  • 我正在使用THRESH_BINARY方法进行阈值处理。(感谢答案)。
  • 我将在检测时使用白色背景。
  • 汽水罐都是相同大小的。
  • 因此,一个具有高准确性的边界框可能可以区分出罐子。

我已经取得的成就:

阈值处理对我非常有帮助,我注意到在白色背景测试中,我会得到以下结果的罐子:

enter image description here enter image description here enter image description here enter image description here enter image description here

而这是瓶子的结果:

enter image description here enter image description here enter image description here enter image description here

因此,可以注意到较暗区域的占主导地位。在某些情况下,罐子可能会产生误判。对于瓶子来说,光线和角度可能导致结果不一致,但我真的认为这可能是一个更简短的方法。

所以,我现在非常困惑如何评估这种暗度优势,我读到findContours可以实现这一点,但我对如何使用这个函数感到有些迷惑。例如,在汽水罐的情况下,它可能会找到几个轮廓,所以我对要评估的内容感到困惑。

注意:我愿意测试与OpenCV不同的任何其他算法或库。

0
0 Comments

除了Haar级联之外,还可以使用以下算法或方法进行自定义对象检测:

1. 形状匹配(Shape Matching):通过与Haar和特征匹配器(如SIFT/SURF/ORB)相比较,形状匹配可能是更好的选择。首先,从仅包含背景的图像中创建直方图,然后使用calcBackProject函数创建背景和非背景的掩码。最后,可以使用matchTemplate或matchShapes函数将掩码或背投影与一些样本掩码/背投影进行比较,以决定是否匹配。

2. Linemod算法:Linemod算法适用于形状不是很复杂的图像。首先,使用一些样本图像创建/训练检测器,然后进行匹配。

以上是除了Haar级联之外,可以用于自定义对象检测的算法或方法。

0
0 Comments

除了Haar级联之外,还可以使用以下算法或方法来进行自定义对象的检测:

1. 使用轮廓检测和椭圆拟合来获取自定义对象的宽高比、面积和角度等信息。

2. 使用直方图分析或背景减法来比较图像与已知背景之间的透明度差异。

3. 使用轮廓的矩来确定其质心(重心)位置。

4. 对于无法检测到足够数量的特征点的图像,可以尝试应用对比度增强和边缘检测等预处理步骤。

以上方法可以用于检测自定义对象,通过分析对象的特征信息来判断对象的类型和属性。这些方法可以在图像处理库如OpenCV中实现,使用相应的函数和算法进行计算和处理。

需要注意的是,在使用轮廓检测之前,需要对图像进行一些预处理步骤,如对比度增强和边缘检测,以提高检测效果和准确性。

示例代码中的部分代码展示了如何使用OpenCV进行轮廓检测和椭圆拟合,以及如何计算宽高比和质心位置等信息。

总之,除了Haar级联之外,还有许多其他算法和方法可以用于自定义对象的检测,具体选择哪种方法取决于应用场景和需求。

0
0 Comments

除了Haar cascades之外,还可以使用以下算法或方法来进行自定义对象检测:

1. 检查对象的宽度/高度比例。对于罐头来说,大致为2-2.5,对于瓶子来说可能大于3。这是一个非常简单的想法,可以快速测试并具有相当好的准确性。

2. 检查对象是否包含玻璃/透明区域。如果有的话,那肯定是一个瓶子。可以在此处阅读更多关于这个想法的信息。

3. 使用grabcut算法获取对象的掩膜/更精确的形状,并检查顶部的宽度是否与底部的宽度相似。如果是,则为罐头;否则为瓶子(瓶子顶部有螺旋盖)。

对于每个想法,以下是一些可以使用的特定有用函数:

1. 检查宽度/高度比例:

def check_ratio(width, height):
    ratio = width / height
    if ratio >= 2 and ratio <= 2.5:
        return "can"
    elif ratio > 2.5:
        return "bottle"
    else:
        return "unknown"

2. 检查玻璃/透明区域:

import cv2
def check_transparency(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for contour in contours:
        area = cv2.contourArea(contour)
        if area > threshold_value:
            return "bottle"
    return "can"

3. 使用grabcut算法获取对象的掩膜/更精确的形状:

import numpy as np
def check_shape(image):
    mask = np.zeros(image.shape[:2], np.uint8)
    bgdModel = np.zeros((1, 65), np.float64)
    fgdModel = np.zeros((1, 65), np.float64)
    rect = (x, y, width, height)  # Object bounding rect coordinates
    cv2.grabCut(image, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)
    mask = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')
    top_width = np.sum(mask[0:10, :])
    bottom_width = np.sum(mask[-10:, :])
    if abs(top_width - bottom_width) < threshold_value:
        return "can"
    else:
        return "bottle"

这些是针对每个想法的一些可能有用的函数示例。你可以根据实际需求进行调整和改进。希望对你的图像处理和OpenCV学习有所帮助!

0