Opencv показывает неправильную ширину и высоту изображения - PullRequest
1 голос
/ 11 апреля 2019

У меня есть изображение с размером 612x408 (widthxheight).

Когда я открываю его с помощью opencv cv2.imread(/path/to/img), оно показывает мне (408,612,3).

Это не проблема

Когда я cv2.imshow() показывает правильное изображение с шириной, превышающей высоту, как нормальный горизонтальный прямоугольник

Я добавил mouseCallback, чтобы получить положение пикселя, поэтому, когда я помещаю свою мышь ближе кПравый край изображения Я получаю ошибку IndexError: index 560 is out of bounds for axis 0 with size 408, хотя я нажал на изображение.

Я искал на SO, но не смог найти похожий вопрос

import cv2
def capture_pos(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDOWN:
        mouseX = x
        mouseY = y
        print('mouse clicked at x={},y={}'.format(mouseX,mouseY))
        h,s,v = img[mouseX,mouseY]
        print('h:{} s:{} v:{}'.format(h,s,v))
img = cv2.imread('./messi color.png')
img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.namedWindow('get pixel color by clicking on image')
cv2.setMouseCallback('get pixel color by clicking on image',capture_pos)
cv2.imshow('get pixel color by clicking on image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

1 Ответ

3 голосов
/ 11 апреля 2019

Размеры, которые вы получаете, кажутся правильными. Вы можете проверить размеры изображения с помощью

print(img.shape)

Вы получите изображение как (height, width), но это может немного сбить с толку, поскольку мы обычно указываем изображения в терминах ширина x высота . Это потому, что изображения хранятся в виде массива Numpy в OpenCV. Поэтому, чтобы проиндексировать изображение, вы можете просто использовать img[Y:X], так как height - это первая запись в форме, а ширина - second .

Поскольку это массив Numpy, мы получаем (rows,cols), что эквивалентно (height,width).

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