Как измерить длину (в пикселях) для каждого полюса на изображении

Я хочу измерить высоту и ширину каждого полюса в пикселях.
Но потому что полюса не всегда стоят прямо, но мне нужна высота столба от горизонтальной поверхности. Кто-нибудь может подсказать мне, как справиться с этим?

Примечание: мне, возможно, понадобится узнать угол, который он наклонил позже. Не уверен, что я могу задать так много вопросов здесь. Но очень ценю, если кто-то может помочь.

Образец изображения, который у меня есть, находится по ссылке ниже:

Образец изображения полюсов

1

Решение

Это должно дать вам хорошее представление о том, как это сделать:

#!/usr/local/bin/python3
import cv2

# Open image in greyscale mode
img = cv2.imread('poles.png',cv2.IMREAD_GRAYSCALE)

# Threshold image to pure black and white AND INVERT because findContours looks for WHITE objects on black background
_, thresh = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)

# Find contours
_, contours, _ = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

# Print the contours
for c in contours:
x,y,w,h = cv2.boundingRect(c)
print(x,y,w,h)

В результате получается, что каждая строка соответствует одной вертикальной полосе на вашем изображении:

841 334 134 154   <--- bar 6 is 154 pixels tall
190 148 93 340    <--- bar 2 is 340 pixels tall
502 79 93 409     <--- bar 4 is 409 pixels tall
633 55 169 433    <--- bar 5 is 433 pixels tall
1009 48 93 440    <--- bar 7 is 490 pixels tall
348 48 93 440     <--- bar 3 is 440 pixels tall
46 46 93 442      <--- bar 1 is 442 pixels tall (leftmost bar)

Первый столбец — это расстояние от левого края изображения, а последний столбец — это высота полосы в пикселях.


Поскольку вы, похоже, не знаете, хотите ли вы сделать это на Python или C ++, вы можете предпочесть вообще не писать никакого кода — в этом случае вы можете просто использовать ImageMagick который включен в большинство дистрибутивов Linux и доступен для macOS и Windows.

В основном вы используете «Подключенный компонент» анализ, набрав это в Терминале:

convert poles.png -colorspace gray -threshold 50% \
-define connected-components:verbose=true      \
-connected-components 8 null:

Выход

Objects (id: bounding-box centroid area mean-color):
0: 1270x488+0+0 697.8,216.0 372566 srgb(255,255,255)
1: 93x442+46+46 92.0,266.5 41106 srgb(0,0,0)
2: 93x440+348+48 394.0,267.5 40920 srgb(0,0,0)
3: 93x440+1009+48 1055.0,267.5 40920 srgb(0,0,0)
4: 169x433+633+55 717.3,271.0 40269 srgb(0,0,0)
5: 93x409+502+79 548.0,283.0 38037 srgb(0,0,0)
6: 93x340+190+148 236.0,317.5 31620 srgb(0,0,0)
7: 134x154+841+334 907.4,410.5 14322 srgb(0,0,0)

Это дает вам строку заголовка, которая говорит вам, что все поля, а затем строку для каждого из BLOB-объектов, найденных на изображении. Не обращайте внимания на первый, потому что это белый фон — вы можете увидеть это из последнего поля, которое rgb(255,255,255),

Итак, если мы посмотрим на последнюю строку, то это будет объект с шириной 134 пикселя и высотой 154 пикселя, начиная с x = 841 и y = 334 в верхнем левом углу, то есть он соответствует первому контуру, который OpenCV найденный.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]