3
votes

Comment créer des cadres de délimitation de couleur aléatoires avec cv2.rectangle ()

J'essaie de créer des couleurs aléatoires et j'essaie de les changer en fonction des différentes couleurs des cadres de délimitation pour une personne individuelle

color = np.array((np.asscalar(np.int16(color[0])),np.asscalar(np.int16(color[1])),np.asscalar(np.int16(color[2]))))

Traceback:

Traceback (most recent call last):
  File "detect_actions.py", line 310, in <module>
    main()
  File "detect_actions.py", line 177, in main
    out_img = visualize_detection_results(tracker.frame_history[-16], tracker.active_actors, prob_dict)
  File "detect_actions.py", line 240, in visualize_detection_results
    cv2.rectangle(disp_img, (left,top), (right,bottom), color, 3)
TypeError: Scalar value for argument 'color' is not numeric


0 commentaires

3 Réponses :


1
votes

En créant un tableau numpy avec des valeurs 'asscalar', vous réintroduisez le problème que vous avez résolu avec 'asscalar'.

Pour utiliser une couleur comme variable, l'une des solutions suivantes fonctionnera:

COLORS = np.random.randint(0, 255, [10, 3])
actor_id = 2
color= (np.asscalar(COLORS[actor_id][0]),np.asscalar(COLORS[actor_id][1]),np.asscalar(COLORS[actor_id][2]))
cv2.rectangle(img,(1,1), (30,30),color,3)

Plus spécifique à votre code: vous générez des couleurs sous forme de tableau 2D, mais vous n'en tenez pas compte lorsque vous utilisez asscalar. Essayez ceci:

# without numpy
tmp = [30,15,130]
color= (tmp[0],tmp[1],tmp[2])
cv2.rectangle(img,(1,1), (30,30),color,3)
# with numpy
tmp = np.array([30,15,130])
color= (np.asscalar(tmp[0]),np.asscalar(tmp[1]),np.asscalar(tmp[2]))
cv2.rectangle(img,(1,1), (30,30),color,3)
# without array
color= (30,15,130)
cv2.rectangle(img,(1,1), (30,30),color,3)


2 commentaires

Avez-vous essayé le code exact comme exemple? Parce que cela fonctionne pour moi. Python 3.7 / openCV 3.4. Surtout le dernier, dans lequel color est un tuple codé en dur, qui doit fonctionner normalement.


Il semble que votre question portait sur l'utilisation d'une variable pour stocker la couleur. Mais la réponse réside dans la manière dont les couleurs sont générées. J'ai mis à jour la réponse, maintenant cela devrait fonctionner.



0
votes

La ligne suivante fonctionne:

COLORS = (np.random.randint(0,255), np.random.randint(0,255), np.random.randint(0,255))

and then pass this to the cv2.rectangle as:

cv2.rectangle(org_img, (xmin,ymin), (xmax, ymax), COLORS, 3)

Remarque: OpenCV Version: 4.1.1, Python 3.6


0 commentaires

2
votes

Pour générer des valeurs BGR aléatoires, vous pouvez utiliser np.random () puis insérez-le dans cv2.rectangle()

import cv2
import numpy as np

image = cv2.imread('1.png')
gray = 255 - cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

cnts = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    color = list(np.random.random(size=3) * 256)
    cv2.rectangle(image, (x, y), (x + w, y + h), color, 4)

cv2.imshow('image', image)
cv2.imwrite('image.png', image)
cv2.waitKey()

Voici un exemple utilisant cette image d'entrée

Nous trouvons des contours et dessinez un rectangle de couleur aléatoire autour de chaque nombre

color = list(np.random.random(size=3) * 256)
cv2.rectangle(image, (x, y), (x + w, y + h), color, 4)


0 commentaires