I am trying to create random colors and trying to change it according to the different colors of bounding boxes for an individual person
COLORS = np.random.randint(0, 255, [1000, 3])
def visualize_detection_results(img_np, active_actors, prob_dict):
score_th = 0.30
action_th = 0.20
# copy the original image first
disp_img = np.copy(img_np)
H, W, C = img_np.shape
#for ii in range(len(active_actors)):
for ii in range(len(active_actors)):
cur_actor = active_actors[ii]
actor_id = cur_actor['actor_id']
cur_act_results = prob_dict[actor_id] if actor_id in prob_dict else []
try:
cur_box, cur_score, cur_class = cur_actor['all_boxes'][-16], cur_actor['all_scores'][0], 1
except IndexError:
continue
if cur_score < score_th:
continue
top, left, bottom, right = cur_box
left = int(W * left)
right = int(W * right)
top = int(H * top)
bottom = int(H * bottom)
conf = cur_score
#label = bbox['class_str']
# label = 'Class_%i' % cur_class
label = obj.OBJECT_STRINGS[cur_class]['name']
message = '%s_%i: %% %.2f' % (label, actor_id,conf)
action_message_list = ["%s:%.3f" % (actres[0][0:7], actres[1]) for actres in cur_act_results if actres[1]>action_th]
# action_message = " ".join(action_message_list)
color = COLORS[actor_id]
print("######",color) # prints[73 0 234]
cv2.rectangle(disp_img, (left,top), (right,bottom), color, 3)
font_size = max(0.5,(right - left)/50.0/float(len(message)))
cv2.rectangle(disp_img, (left, top-int(font_size*40)), (right,top), color, -1)
cv2.putText(disp_img, message, (left, top-12), 0, font_size, (255,255,255)-color, 1)
#action message writing
cv2.rectangle(disp_img, (left, top), (right,top+10*len(action_message_list)), color, -1)
for aa, action_message in enumerate(action_message_list):
offset = aa*10
cv2.putText(disp_img, action_message, (left, top+5+offset), 0, 0.5, (255,255,255)-color, 1)
return disp_img
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
The color
array is not being accepted as numeric in this case.
I have tried some approaches on StackOverflow but it is not working. I have opencv version 3.3.0
I would appreciate your advice.Thanks
I have tried :
color = np.array((np.asscalar(np.int16(color[0])),np.asscalar(np.int16(color[1])),np.asscalar(np.int16(color[2]))))
To generate random BGR values you can use np.random()
then insert it into cv2.rectangle()
color = list(np.random.random(size=3) * 256)
cv2.rectangle(image, (x, y), (x + w, y + h), color, 4)
Here's an example using this input image
We find contours and draw a random color rectangle around each number
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()
By creating a numpy array with 'asscalar' values you reintroduce the problem you solved with 'asscalar'.
To use a color as a variable, either of the following solutions will work:
# 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)
More specific to your code: you generate colors as a 2d array, But you don't account for this when using asscalar. Try this:
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With