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
3 Réponses :
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)
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.
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
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)