Я не программист, у меня первые попытки с Python и CV
В моем эксперименте мне нужно измерить распространение трещин в образце, подверженном расслоению. Как видно из следующего изображения, сила, приложенная к левым краям образца, заставляет трещину (начиная с нулевой длины) расти до правого края. (черное изображение проходит через эту точку).
настройка образца
Я пытался измерить длину трещины как разницу между общей длиной образца и длиной расстояние от вершины трещины до крайней правой точки (потому что с левой стороны образец изгибается, поэтому расстояние от вершины трещины до крайней левой точки нереально).
Пока мне удалось подготовить- Обработав изображение с помощью порогового значения и фильтра Кэнни, мы получили контуры и выпуклую оболочку образца. Конечная цель - применить его к потоковому видео теста в реальном времени, чтобы получить рост трещины в реальном времени.
Порог
Контур
Я застрял в поиске положения кончика трещины.
Прошу прощения за следующий запутанный код!
Пожалуйста, посоветуйте
import cv2
import numpy as np
def midpoint(ptA,ptB):
return ((ptA[0]+ptB[0])*0.5,(ptA[1]+ptB[1])*0.5)
def preProcessing(img):
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray,(5,5),0)
imgCanny = cv2.Canny(imgBlur,150,150)
kernel = np.ones((5, 5))
imgDial = cv2.dilate(imgCanny, kernel, iterations=1)
imgErode = cv2.erode(imgDial, kernel, iterations=1)
imgCanny, imgThres = cv2.threshold(imgErode,70,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
return imgThres
def getMax(myPoints):
myCoord = np.zeros((4,2),np.int32)
myCoord[0] = tuple(myPoints[myPoints[:,:,0].argmin()][0]) # left
myCoord[1] = tuple(myPoints[myPoints[:, :, 0].argmax()][0]) # right
myCoord[2] = tuple(myPoints[myPoints[:,:,1].argmin()][0]) # top
myCoord[3] = tuple(myPoints[myPoints[:, :, 1].argmax()][0]) # bottom
return myCoord
def getContours(img):
contours,hierarchy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
area = cv2.contourArea(cnt)
if area>5000:
cv2.drawContours(imgContours, cnt, -1, (0,0,255), 3)
biggest = cnt
hull = []
hull.append(cv2.convexHull(biggest))
cv2.drawContours(imgContours, hull, -1, (0, 255, 0), 2)
# print(len(hull))
# print(len(biggest))
return biggest
while True:
img = cv2.imread("Resources/my_image.png")
imgThres = preProcessing(img)
imgContours = img.copy()
biggest = getContours(imgThres)
myCoord = getMax(biggest)
cv2.imshow("Original", img)
cv2.imshow("Result",imgThres)
cv2.imshow("ResultC", imgContours)
if cv2.waitKey(0) & 0xFF == ord('q'):
break