Я хочу найти объекты на изображениях и провести красную линию через их оси. Проблема в том, что есть изображения ярких и темных объектов. Освещение изображений не является оптимальным. Я могу настроить значения в cv2.threshold()
, чтобы программа могла находить яркие или темные объекты, но как мне найти оба? Я думал о выражении if, но на что оно будет похоже?
Код:
img = cv2.imread('image.png')
img_gs = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_gs = cv2.GaussianBlur(img_gs,(5,5),0)
_, thresh = cv2.threshold(img_gs,
0,
255,
cv2.THRESH_BINARY+cv2.THRESH_OTSU)
mat = np.argwhere(thresh != 0)
mat[:, [0, 1]] = mat[:, [1, 0]]
mat = np.array(mat).astype(np.float32)
m, e = cv2.PCACompute(mat, mean = np.array([]))
center = tuple(m[0])
endpoint1 = tuple(m[0] + e[0]*100)
endpoint3 = tuple(m[0] - e[0]*100)
red_color = (0, 0, 255)
cv2.circle(img, center, 5, red_color)
cv2.line(img, center, endpoint1, red_color)
cv2.line(img, center, endpoint3, red_color)
cv2.imwrite('savedimage.png', img)
ErrorMessage:
m, e = cv2.PCACompute(mat, mean = np.array([]))
cv2.error: OpenCV(3.4.2) /io/opencv/modules/core/src/matmul.cpp:2557: error: (-215:Assertion failed) nsamples > 0 in function 'calcCovarMatrix'
Хорошее изображение:
Плохое изображение (ErrorMessage):
Результат должен быть таким: