Numpy выдает ошибку формы, когда я пытаюсь создать изображение, используя области изображения, извлеченные из разных мест (для создания гистограммы) - PullRequest
0 голосов
/ 20 апреля 2020

Используя функцию 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)

Что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...