обнаружение разницы в прямом эфире камеры - PullRequest
0 голосов
/ 23 января 2020

Я сталкиваюсь с проблемой, когда мне дают изображение, и мне нужно найти разницу между объектом на этом изображении и объектом передо мной, который я буду видеть через IP-камеру, используя python. это оригинальная фотография

original handed photo

так выглядит канал с IP-камеры

enter image description here

Теперь я должен написать программу для обнаружения различий между двумя объектами и цветовым кодом каждой отдельной детали. все просто, если в него включены только эти 2 изображения, но последнее должно быть в прямом эфире с камеры, поэтому написанная мною программа перегружена различиями из-за разного положения камеры или различной освещенности.

#!/usr/bin/env python
import cv2
from skimage import measure
import imutils

cap = cv2.VideoCapture(0)
img_gray = cv2.imread("pic1.png", 0)
img = cv2.imread("pic1.png")

while True:
    _, frame = cap.read()

    frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    (score, diff) = measure.compare_ssim(img_gray, frame_gray, full=True)#we won't use the score
    diff = (diff * 255).astype("uint8") # converting the float score from a (-1,1) range to 8 bit 0-255 range

    thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

    contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    contours = imutils.grab_contours(contours)



    for cnt in contours:
        area = cv2.contourArea(cnt)
        if 3150 < area:
            (x,y,w,h) = cv2.boundingRect(cnt)
            cv2.rectangle(frame, (x,y), (x+w, y+h), (0,255,0))

    cv2.imshow("Current", frame)
    cv2.imshow("Back then", img)
    cv2.imshow("mask", thresh)


    if cv2.waitKey(1) & 0xFF == ord('q'):
        break



cap.release()
cv2.destroyAllWindows()

сейчас вывод на цветной видео поток должен быть как это

enter image description here

цветное кодирование не является проблемой

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

1 Ответ

0 голосов
/ 24 января 2020

Я снова пишу ответ, который я поставил на ваш другой пост . Вы можете использовать SimpleElastix . Я обновил код для этих новых изображений. Обратите внимание, что часть изображения отсутствует в верхней трубе, поэтому мы фактически не знаем, что происходит после границы изображения, и текущий алгоритм оценивает разницу только для небольшой части.

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    import SimpleITK as sitk

    movingImage = sitk.ReadImage('b1.png', sitk.sitkFloat32)
    fixedImage = sitk.ReadImage('b2.png', sitk.sitkFloat32)

    elastixImageFilter = sitk.ElastixImageFilter()

    affine_registration_parameters = sitk.GetDefaultParameterMap('affine')
    affine_registration_parameters["NumberOfResolutions"] = ['6']
    affine_registration_parameters["WriteResultImage"] = ['false']
    affine_registration_parameters["MaximumNumberOfSamplingAttempts"] = ['4']

    spline_registration_parameters = sitk.GetDefaultParameterMap('bspline')
    spline_registration_parameters["NumberOfResolutions"] = ['1']
    spline_registration_parameters["WriteResultImage"] = ['false']
    spline_registration_parameters["MaximumNumberOfSamplingAttempts"] = ['4']
    spline_registration_parameters["Metric"] = ['AdvancedMattesMutualInformation']
    spline_registration_parameters["GridSpacingSchedule"] = ['3']

    print(spline_registration_parameters["Registration"])

    parameterMapVector = sitk.VectorOfParameterMap()
    parameterMapVector.append(affine_registration_parameters)
    parameterMapVector.append(spline_registration_parameters)

    elastixImageFilter.SetFixedImage(fixedImage)
    elastixImageFilter.SetMovingImage(movingImage)
    elastixImageFilter.SetParameterMap(parameterMapVector)
    elastixImageFilter.Execute()

    registeredImage = elastixImageFilter.GetResultImage()
    transformParameterMap = elastixImageFilter.GetTransformParameterMap()

    resultImage = sitk.Subtract(registeredImage, fixedImage)
    resultImageNp = (np.sqrt(sitk.GetArrayFromImage(resultImage) ** 2)  > 60)*255

    cv2.imwrite('b_1.png', sitk.GetArrayFromImage(fixedImage))
    cv2.imwrite('b_2.png', sitk.GetArrayFromImage(movingImage))
    cv2.imwrite('b_2r.png', sitk.GetArrayFromImage(registeredImage))
    cv2.imwrite('b_diff.png', resultImageNp.astype(np.uint8))

Ссылка изображение:
enter image description here
Зарегистрированные вторые изображения:
enter image description here
Разница с пороговым значением:
enter image description here

...