如何在按位掩码Opencv Python中检测特定对象

如何在按位掩码Opencv Python中检测特定对象,python,opencv,image-processing,object-detection,opencv-python,Python,Opencv,Image Processing,Object Detection,Opencv Python,我试图在我的图像中检测一个对象,并在其周围创建一个边界框 这就是我试图发现的: 以下是您的帮助特点: 它永远是黑色的 它要么在右边,要么在左边 它必须是自动的 这就是我迄今为止所取得的成就: 以下是代码: import cv2 import numpy as np def nothing(x): pass cv2.namedWindow("Tracking") cv2.createTrackbar("LH", "Trackin

我试图在我的图像中检测一个对象,并在其周围创建一个边界框

这就是我试图发现的:

以下是您的帮助特点:

  • 它永远是黑色的
  • 它要么在右边,要么在左边
  • 它必须是自动的
这就是我迄今为止所取得的成就:

以下是代码:

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()

我怎样才能检测到这个物体呢?

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

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获取图像的轮廓。你也可以看看这个。除此之外,您还可以对检索到的轮廓应用各种条件,以便过滤/加强分割

然而,如果您的检测/分割需要的不仅仅是静态的,我强烈建议您将重点转向基于机器学习的算法,但考虑到您感兴趣的对象远不是普通的,您必须通过微调现有架构,使用自定义数据集应用培训


不管怎样,祝你好运

我们需要更多的信息来回答。。。你需要它是自动的还是仅仅在这个特定的图像中?它是否总是位于图像的左侧?它总是像这样黑吗?@Panda50我会编辑答案,但现在详细信息如下:I)它必须是自动的ii)它会在右边或左边iii)它总是黑的这个问题有点过时,因为我已经取得了一些进展,我有一些轮廓,包括包含对象的轮廓,但问题是现在有很多其他轮廓,我不关心,但是它们是max和min,所以我不能使用这些函数进行排序。你知道吗?我也在这里发布了一个问题,你可以在检索到的轮廓的x,y值上应用这些条件,例如,threshold=image.shape[1]-img.shape[1]//3),以便丢弃所有不需要的右轮廓和中心轮廓。我会尝试一下,我会尝试在你的重定向帖子上发布。谢谢你的帮助