如何使用Opencv检测另一个轮廓?

时间:2019-05-06 03:04:21

标签: python opencv

我正在尝试在黄色轮廓(出租车)内绘制白色轮廓(汽车的白板),但我什至无法识别HSV中该板的白色,如何解决呢?在代码中,我使用轨迹栏将RGB的值更改为我的自由意志。 谢谢!

import cv2
import numpy as np
kernel = np.ones((5,5),np.uint8)


def dibujarblanco(maskblanco,color):


    _,contornos,_=cv2.findContours(maskblanco, 
cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

    for c in contornos:
                area = cv2.contourArea(c)
                    if area > 200:

                        nuevocontorno = cv2.convexHull(c)
                        cv2.drawContours(frame, [nuevocontorno], 0, color,3)


def nothing(x):
    pass
video = cv2.VideoCapture("taxismenor.mp4")

cv2.namedWindow("Barras Blanco")

cv2.createTrackbar("B", "Barras Blanco", 0, 255, nothing)
cv2.createTrackbar("G", "Barras Blanco", 0, 255, nothing)
cv2.createTrackbar("R", "Barras Blanco", 0, 255, nothing)

while(1):
    _, frame=video.read()
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)  

    B = cv2.getTrackbarPos("B", "Barras Blanco")
    G = cv2.getTrackbarPos("G", "Barras Blanco")
    R = cv2.getTrackbarPos("R", "Barras Blanco")

    blanco = np.uint8([[[B, G, R]]])
    hsvBlanco = cv2.cvtColor(blanco,cv2.COLOR_BGR2HSV)
    lowerLimitb = np.uint8([hsvBlanco[0][0][0]-10,100,100])
    upperLimitb = np.uint8([hsvBlanco[0][0][0]+10,255,255])


    maskblanco = cv2.inRange(hsv, lowerLimitb, upperLimitb)                    


    dibujarblanco(maskblanco,(0,0,255))

    cv2.imshow("frame", frame)
    cv2.imshow("maskblanco", maskblanco)

    key = cv2.waitKey(1)

    if key == 27:
        break

cv2.destroyAllWindows()

This是尝试印版轮廓为白色的结果。没事,那行不通。

2 个答案:

答案 0 :(得分:0)

我想您可以先将轮廓(一个taix)设置为图像背景的颜色,然后复制此图像以检测下一个轮廓。

答案 1 :(得分:0)

您可以使用cv.findContours()提取整个轮廓线层次结构

image, contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
  

层次结构

     

可选的输出向量(例如std :: vector),其中包含有关图像拓扑的信息。它具有与轮廓数量一样多的元素。对于每个第i个轮廓轮廓[i],元素等级[i] [0],等级[i] [1],等级[i] [2]和等级[i] [3]均设置为0-在相同的层次级别上,基于下一个和上一个轮廓的轮廓的索引,分别是第一个子轮廓和父轮廓。如果对于轮廓i,没有下一个,上一个,父级或嵌套的轮廓,则等级[i]的相应元素将为负。