Задумывались ли вы о том, чтобы нарисовать линию из определенной точки контура и искать точки, где линия пересекает ваш контур? Я имею в виду, если вы получите координаты из двух точек, вы можете измерить расстояние. Я сделал образец, чтобы продемонстрировать, что я имею в виду. Обратите внимание, что этот скрипт предназначен только для демонстрации решения и не будет работать с другими картинками, кроме моей. Я бы сказал лучше, но я столкнулся с программированием всего несколько месяцев назад.
![enter image description here](https://i.stack.imgur.com/KAOBQ.png)
Итак, первое, что нужно сделать, это выделить контуры, которые, как вы сказали, вы уже сделали (учтите, что cv2.findContours
находит значения белого). тогда вы можете получить ссылочные координаты с помощью cv2.boundingRect()
- она возвращает координаты x, y, ширину и высоту ограничивающего прямоугольника для вашего контура (вы, конечно, можете сделать что-то подобное, извлекая небольшой излом вашего контура на маску и работая с там). В моем примере я определил центр поля и немного переместил линию, затем сделал линию влево (я сделал это, добавив списки и преобразовав их в массивы, и, вероятно, есть миллион лучших решений). Затем вы ищете точки, которые находятся в вашем контуре и в вашей линии (эти точки являются точками пересечения). Я рассчитал просто по разности двух координат х, потому что это работает для этой демонстрации, но лучший подход будет sqrt(x2-x1)^2+(y2-y1)^2
. Может быть, это даст вам идею. Ура!
Пример кода:
import cv2
import numpy as np
import numpy
img = cv2.imread('Thickness2.png')
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray_image,10,255,cv2.THRESH_BINARY_INV)
im2, cnts, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
font = cv2.FONT_HERSHEY_TRIPLEX
for c in cnts:
two_points = []
coord_x = []
coord_y = []
area = cv2.contourArea(c)
perimeter = cv2.arcLength(c, False)
if area > 1 and perimeter > 1:
x,y,w,h = cv2.boundingRect(c)
cx = int((x+(w/2))) -5
cy = int((y+(h/2))) +15
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
for a in range(cx, cx+70):
coord_x.append(a)
coord_y.append(cy)
coord = list(zip(coord_x, coord_y))
arrayxy = np.array(coord)
arraycnt = np.array(c)
for a in arraycnt:
for b in arrayxy:
if a[:,0] == b[0] and a[:,1] == b[1]:
cv2.circle(img,(b[0],b[1]), 2, (0,255,255), -1)
two_points.append(b)
pointsarray = np.array(two_points)
thickness = int(pointsarray[1,0]) - int(pointsarray[0,0])
print(thickness)
cv2.line(img, (cx, cy), (cx+50, cy), (0,0,255), 1)
cv2.putText(img, 'Thickness : '+str(thickness),(x-20, y-10), font, 0.4,(0,0,0),1,cv2.LINE_AA)
cv2.imshow('img', img)
Выход:
![enter image description here](https://i.stack.imgur.com/vza8e.png)