Измерение роста трещин в материале - PullRequest
0 голосов
/ 28 мая 2020

Я не программист, у меня первые попытки с 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
...