web-dev-qa-db-fra.com

Trouver et dessiner le plus grand contour à l'opencv sur une couleur spécifique (Python)

J'essaie d'obtenir le contour le plus large d'un livre rouge. J'ai un petit problème avec le code parce qu'il a les contours des plus petits objets (blobs) au lieu du plus gros et je n'arrive pas à comprendre pourquoi cela se produit

Le code que j'utilise:

camera = cv2.VideoCapture(0)
kernel = np.ones((2,2),np.uint8)

while True:
    #Loading Camera
    ret, frame = camera.read()

    blurred = cv2.pyrMeanShiftFiltering(frame, 3, 3)
    hsv = cv2.cvtColor(blurred, cv2.COLOR_BGR2HSV)

    lower_range = np.array([150, 10, 10])
    upper_range = np.array([180, 255, 255])
    mask = cv2.inRange(hsv, lower_range, upper_range)

    dilation = cv2.dilate(mask,kernel,iterations = 1)

    closing = cv2.morphologyEx(dilation, cv2.MORPH_GRADIENT, kernel)
    closing = cv2.morphologyEx(dilation, cv2.MORPH_CLOSE, kernel)

    #Getting the Edge of morphology
    Edge = cv2.Canny(closing, 175, 175)
    _, contours,hierarchy = cv2.findContours(Edge, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    # Find the index of the largest contour
    areas = [cv2.contourArea(c) for c in contours]
    max_index = np.argmax(areas)
    cnt=contours[max_index]

    x,y,w,h = cv2.boundingRect(cnt)
    cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)


    cv2.imshow('threshold', frame)
    cv2.imshow('Edge', Edge)

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


camera.release()
cv2.destroyAllWindows()

Comme vous pouvez le voir sur cette image

J'espère qu'il y a quelqu'un qui peut aider

15
Zaptimist

Vous pouvez commencer par définir un masque dans la plage des tons rouges du livre que vous recherchez.

Ensuite, vous pouvez simplement trouver le contour avec la plus grande surface et dessiner la forme rectangulaire du livre.

import numpy as np
import cv2

# load the image
image = cv2.imread("path_to_your_image.png", 1)

# red color boundaries [B, G, R]
lower = [1, 0, 20]
upper = [60, 40, 200]

# create NumPy arrays from the boundaries
lower = np.array(lower, dtype="uint8")
upper = np.array(upper, dtype="uint8")

# find the colors within the specified boundaries and apply
# the mask
mask = cv2.inRange(image, lower, upper)
output = cv2.bitwise_and(image, image, mask=mask)

ret,thresh = cv2.threshold(mask, 40, 255, 0)
im2,contours,hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

if len(contours) != 0:
    # draw in blue the contours that were founded
    cv2.drawContours(output, contours, -1, 255, 3)

    #find the biggest area
    c = max(contours, key = cv2.contourArea)

    x,y,w,h = cv2.boundingRect(c)
    # draw the book contour (in green)
    cv2.rectangle(output,(x,y),(x+w,y+h),(0,255,0),2)

# show the images
cv2.imshow("Result", np.hstack([image, output]))

cv2.waitKey(0)

En utilisant votre image:

enter image description here

Si vous voulez que le livre tourne, vous pouvez utiliser rect = cv2.minAreaRect(cnt) comme vous pouvez le trouver ici .

20
João Cartucho