【问题标题】:How To Detect A Specific Object In A Bitwise Mask Opencv Python如何在按位掩码 Opencv Python 中检测特定对象
【发布时间】:2021-07-29 17:04:12
【问题描述】:

我正在尝试检测图像中的对象并在其周围制作一个边界框

这是我想要检测的:

以下是对您的帮助的特征:

  • 它永远是黑色的
  • 它将在右侧或左侧
  • 必须是自动的

这是我迄今为止所取得的成就:

这是它的代码:

import cv2
import numpy as np

def nothing(x):
    pass

cv2.namedWindow("Tracking")
cv2.createTrackbar("LH", "Tracking", 0, 255, nothing)
cv2.createTrackbar("LS", "Tracking", 0, 255, nothing)
cv2.createTrackbar("LV", "Tracking", 0, 255, nothing)
cv2.createTrackbar("UH", "Tracking", 255, 255, nothing)
cv2.createTrackbar("US", "Tracking", 255, 255, nothing)
cv2.createTrackbar("UV", "Tracking", 255, 255, nothing)

while True:
    frame = cv2.imread('resultImages/imgCropped.png')
    img = frame.copy()

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    l_h = cv2.getTrackbarPos("LH", "Tracking")
    l_s = cv2.getTrackbarPos("LS", "Tracking")
    l_v = cv2.getTrackbarPos("LV", "Tracking")

    u_h = cv2.getTrackbarPos("UH", "Tracking")
    u_s = cv2.getTrackbarPos("US", "Tracking")
    u_v = cv2.getTrackbarPos("UV", "Tracking")

    l_b = np.array([l_h, l_s, l_v])
    u_b = np.array([u_h, u_s, u_v])

    mask = cv2.inRange(hsv, l_b, u_b)

    res = cv2.bitwise_and(frame, frame, mask=mask)

    cv2.imshow("frame", frame)
    cv2.imshow("mask", mask)
    cv2.imshow("res", res)

    key = cv2.waitKey(1)
    if key == 27:
        break

cv2.destroyAllWindows()

我怎样才能检测到这个对象?

【问题讨论】:

  • 我们需要更多信息来回答...您需要它是自动的还是只在这个特定的图像中?它总是位于图像的左侧吗?总是这样黑吗?
  • @Panda50 我将编辑答案,但现在这里有详细信息:i)它必须是自动的 ii)它会在右边或左边 iii)它永远是黑色的

标签: python opencv image-processing object-detection opencv-python


【解决方案1】:

我不太确定您到底想做什么,但是我会尽力揭示一些可能对您有所帮助的关键方面..

1.首先,您可以利用对象位置的提示应用侧面图像的课程裁剪。这将减轻图像中存在的其他类似对象的存在。那就是:

while True:
    frame = cv2.imread('resultImages/imgCropped.png')#this returns a numpy array
    img = frame.copy()

    #define a thresshold let's say 1/4rth of the full image
    width = frame.shape[1]
    thress = int(np.ceil(width/4))
    left= img[:,:thress]#full height,cropped width 
    right = img[:,-thress:]
    #cropped=np.concatenate([left,right])#actually you don't have to merge

2.由于您能够区分所需的信息(黑色/白色),您可以尝试使用 opencv contour features 获取图像的轮廓。你也可以看看这个tutorial。除此之外,您可以在检索到的轮廓上应用各种条件,以过滤/加强您的分割。

但是,如果您的检测/分割需要不仅仅是静态的,我强烈建议您将注意力转向基于机器学习的算法,但考虑到您感兴趣的对象远非普通的事实,您将拥有通过微调现有架构,使用您的自定义数据集应用训练..

不管怎样,祝你好运!

【讨论】:

  • 这个问题有点过时了,因为我已经取得了一些进展,我有一些轮廓,包括其中包含对象的轮廓,但现在的问题是还有许多其他我不在乎的轮廓,但是最大值和最小值,所以我不能使用这些函数来排序。你有什么想法吗我也在这里发布了这个问题link
  • 您实际上可以将这些条件应用于检索到的轮廓的 x,y 值,例如 >threshold(例如 threshold=image.shape[1] - img.shape[1]//3) ,从而丢弃所有不需要的右轮廓和中心轮廓。我会试一试,我会尝试在你重定向的帖子上发帖..
猜你喜欢
  • 2017-07-09
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
相关资源
最近更新 更多