Используя функцию opencv для рисования прямоугольников над изображением, я создал сетку из 5 столбцов * 10 рядов зеленых прямоугольников. Функция для этого такова:
#function to draw rectangles
def draw_rect(frame):
rows, cols, _ = frame.shape
global total_rectangle, hand_rect_one_x, hand_rect_one_y, hand_rect_two_x, hand_rect_two_y
#first row of rectangles
cv2.rectangle(frame, (400, 40),(410, 50), (0, 255, 0), 1)
cv2.rectangle(frame, (420, 40),(430, 50), (0, 255, 0), 1)
cv2.rectangle(frame, (440, 40),(450, 50), (0, 255, 0), 1)
cv2.rectangle(frame, (460, 40),(470, 50), (0, 255, 0), 1)
cv2.rectangle(frame, (480, 40),(490, 50), (0, 255, 0), 1)
# second row of rectangles
cv2.rectangle(frame, (400, 60), (410, 70), (0, 255, 0), 1)
cv2.rectangle(frame, (420, 60), (430, 70), (0, 255, 0), 1)
cv2.rectangle(frame, (440, 60), (450, 70), (0, 255, 0), 1)
cv2.rectangle(frame, (460, 60), (470, 70), (0, 255, 0), 1)
cv2.rectangle(frame, (480, 60), (490, 70), (0, 255, 0), 1)
# third row of rectangles
cv2.rectangle(frame, (400, 80), (410, 90), (0, 255, 0), 1)
cv2.rectangle(frame, (420, 80), (430, 90), (0, 255, 0), 1)
cv2.rectangle(frame, (440, 80), (450, 90), (0, 255, 0), 1)
cv2.rectangle(frame, (460, 80), (470, 90), (0, 255, 0), 1)
cv2.rectangle(frame, (480, 80), (490, 90), (0, 255, 0), 1)
# fourth row of rectangles
cv2.rectangle(frame, (400, 100), (410, 110), (0, 255, 0), 1)
cv2.rectangle(frame, (420, 100), (430, 110), (0, 255, 0), 1)
cv2.rectangle(frame, (440, 100), (450, 110), (0, 255, 0), 1)
cv2.rectangle(frame, (460, 100), (470, 110), (0, 255, 0), 1)
cv2.rectangle(frame, (480, 100), (490, 110), (0, 255, 0), 1)
# fifth row of rectangles
cv2.rectangle(frame, (400, 120), (410, 130), (0, 255, 0), 1)
cv2.rectangle(frame, (420, 120), (430, 130), (0, 255, 0), 1)
cv2.rectangle(frame, (440, 120), (450, 130), (0, 255, 0), 1)
cv2.rectangle(frame, (460, 120), (470, 130), (0, 255, 0), 1)
cv2.rectangle(frame, (480, 120), (490, 130), (0, 255, 0), 1)
# sixth row of rectangles
cv2.rectangle(frame, (400, 140), (410, 150), (0, 255, 0), 1)
cv2.rectangle(frame, (420, 140), (430, 150), (0, 255, 0), 1)
cv2.rectangle(frame, (440, 140), (450, 150), (0, 255, 0), 1)
cv2.rectangle(frame, (460, 140), (470, 150), (0, 255, 0), 1)
cv2.rectangle(frame, (480, 140), (490, 150), (0, 255, 0), 1)
# 7th row of rectangles
cv2.rectangle(frame, (400, 160), (410, 170), (0, 255, 0), 1)
cv2.rectangle(frame, (420, 160), (430, 170), (0, 255, 0), 1)
cv2.rectangle(frame, (440, 160), (450, 170), (0, 255, 0), 1)
cv2.rectangle(frame, (460, 160), (470, 170), (0, 255, 0), 1)
cv2.rectangle(frame, (480, 160), (490, 170), (0, 255, 0), 1)
# 8th row of rectangles
cv2.rectangle(frame, (400, 180), (410, 190), (0, 255, 0), 1)
cv2.rectangle(frame, (420, 180), (430, 190), (0, 255, 0), 1)
cv2.rectangle(frame, (440, 180), (450, 190), (0, 255, 0), 1)
cv2.rectangle(frame, (460, 180), (470, 190), (0, 255, 0), 1)
cv2.rectangle(frame, (480, 180), (490, 190), (0, 255, 0), 1)
# 9th row of rectangles
cv2.rectangle(frame, (400, 200), (410, 210), (0, 255, 0), 1)
cv2.rectangle(frame, (420, 200), (430, 210), (0, 255, 0), 1)
cv2.rectangle(frame, (440, 200), (450, 210), (0, 255, 0), 1)
cv2.rectangle(frame, (460, 200), (470, 210), (0, 255, 0), 1)
cv2.rectangle(frame, (480, 200), (490, 210), (0, 255, 0), 1)
#10th row of rectangles
cv2.rectangle(frame, (400, 220), (410, 230), (0, 255, 0), 1)
cv2.rectangle(frame, (420, 220), (430, 230), (0, 255, 0), 1)
cv2.rectangle(frame, (440, 220), (450, 230), (0, 255, 0), 1)
cv2.rectangle(frame, (460, 220), (470, 230), (0, 255, 0), 1)
cv2.rectangle(frame, (480, 220), (490, 230), (0, 255, 0), 1)
return frame
Теперь, когда я нарисовал эти прямоугольники над изображением, я пытаюсь выделить области изображения, заключенные в эти прямоугольники, и поместить их вместе в один массив numpy, чтобы создать изображение. Я хочу передать это изображение в функцию calcHist для расчета его гистограммы.
Вот функция, которую я написал для этого:
#function to generate Histogtram using the ROI created from the area captured from green rectangles
def hand_histogram(frame):
global hand_rect_one_x, hand_rect_one_y
hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
roi = np.zeros([50, 10, 3], dtype=hsv_frame.dtype)
t = 0
roi[ 0: 10, 0: 10] = hsv_frame[400:410, 40:50]
roi[10: 20, 0: 10] = hsv_frame[420:430, 40:50]
roi[20: 30, 0: 10] = hsv_frame[440:450, 40:50]
roi[30: 40, 0: 10] = hsv_frame[460:470, 40:50]
roi[40: 50, 0: 10] = hsv_frame[480:490, 40:50]
roi[50: 60, 0: 10] = hsv_frame[400:410, 60:70]
roi[60: 70, 0: 10] = hsv_frame[420:430, 60:70]
roi[70: 80, 0: 10] = hsv_frame[440:450, 60:70]
roi[80: 90, 0: 10] = hsv_frame[460:470, 60:70]
roi[90: 100, 0: 10] = hsv_frame[480:490, 60:70]
roi[100: 110, 0: 10] = hsv_frame[400:410, 80:90]
roi[110: 120, 0: 10] = hsv_frame[420:430, 80:90]
roi[120: 130, 0: 10] = hsv_frame[440:450, 80:90]
roi[130: 140, 0: 10] = hsv_frame[460:470, 80:90]
roi[140: 150, 0: 10] = hsv_frame[480:490, 80:90]
roi[150: 160, 0: 10] = hsv_frame[400:410, 100:110]
roi[160: 170, 0: 10] = hsv_frame[420:430, 100:110]
roi[170: 180, 0: 10] = hsv_frame[440:450, 100:110]
roi[180: 190, 0: 10] = hsv_frame[460:470, 100:110]
roi[190: 200, 0: 10] = hsv_frame[480:490, 100:110]
roi[200: 210, 0: 10] = hsv_frame[400:410, 120:130]
roi[210: 220, 0: 10] = hsv_frame[420:430, 120:130]
roi[220: 230, 0: 10] = hsv_frame[440:450, 120:130]
roi[230: 240, 0: 10] = hsv_frame[460:470, 120:130]
roi[240: 250, 0: 10] = hsv_frame[480:490, 120:130]
roi[250: 260, 0: 10] = hsv_frame[400:410, 140:150]
roi[260: 270, 0: 10] = hsv_frame[420:430, 140:150]
roi[270: 280, 0: 10] = hsv_frame[440:450, 140:150]
roi[280: 290, 0: 10] = hsv_frame[460:470, 140:150]
roi[290: 300, 0: 10] = hsv_frame[480:490, 140:150]
roi[300: 310, 0: 10] = hsv_frame[400:410, 160:170]
roi[310: 320, 0: 10] = hsv_frame[420:430, 160:170]
roi[320: 330, 0: 10] = hsv_frame[440:450, 160:170]
roi[330: 340, 0: 10] = hsv_frame[460:470, 160:170]
roi[340: 350, 0: 10] = hsv_frame[480:490, 160:170]
roi[350: 360, 0: 10] = hsv_frame[400:410, 180:190]
roi[360: 370, 0: 10] = hsv_frame[420:430, 180:190]
roi[370: 380, 0: 10] = hsv_frame[440:450, 180:190]
roi[380: 390, 0: 10] = hsv_frame[460:470, 180:190]
roi[390: 400, 0: 10] = hsv_frame[480:490, 180:190]
roi[400: 410, 0: 10] = hsv_frame[400:410, 200:210]
roi[410: 420, 0: 10] = hsv_frame[420:430, 200:210]
roi[420: 430, 0: 10] = hsv_frame[440:450, 200:210]
roi[430: 440, 0: 10] = hsv_frame[460:470, 200:210]
roi[440: 450, 0: 10] = hsv_frame[480:490, 200:210]
roi[450: 460, 0: 10] = hsv_frame[400:410, 220:230]
roi[460: 470, 0: 10] = hsv_frame[420:430, 220:230]
roi[470: 480, 0: 10] = hsv_frame[440:450, 220:230]
roi[480: 490, 0: 10] = hsv_frame[460:470, 220:230]
roi[490: 500, 0: 10] = hsv_frame[480:490, 220:230]
hand_hist = cv2.calcHist([roi], [0, 1], None, [180, 256], [0, 180, 0, 256])
return cv2.normalize(hand_hist, hand_hist, 0, 255, cv2.NORM_MINMAX)
Однако, когда я пытаюсь запустить программу для создания гистограммы, я получаю сообщение об ошибке:
**roi[40: 50, 0: 10] = hsv_frame[480:490, 40:50]**
ValueError: не удалось передать входной массив из фигуры (0,10,3) в фигуру (10,10,3)
Что я делаю не так?