Я работаю над проектом симулятора стрельбы. Я использую IP-камеру для захвата экрана с пулевыми отверстиями. Проблема, с которой я сталкиваюсь, заключается в получении только новых пулевых отверстий. Я попытался SSIM метод для достижения этого:
before = cv2.imread('before.png')
after = cv2.imread('after.png')
# Convert images to grayscale
before_gray = cv2.cvtColor(before, cv2.COLOR_BGR2GRAY)
after_gray = cv2.cvtColor(after, cv2.COLOR_BGR2GRAY)
# Compute SSIM between two images
(score, diff) = compare_ssim(before_gray, after_gray, full=True)
# The diff image contains the actual image differences between the two images
# and is represented as a floating point data type in the range [0,1]
# so we must convert the array to 8-bit unsigned integers in the range
# [0,255] before we can use it with OpenCV
diff = (diff * 255).astype("uint8")
# Threshold the difference image, followed by finding contours to
# obtain the regions of the two input images that differ
thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
contours = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
contour_sizes = [(cv2.contourArea(contour), contour) for contour in contours]
# The largest contour should be the new detected difference
if len(contour_sizes) > 0:
largest_contour = max(contour_sizes, key=lambda x: x[0])[1]
x,y,w,h = cv2.boundingRect(largest_contour)
cv2.rectangle(before, (x, y), (x + w, y + h), (36,255,12), 2)
cv2.rectangle(after, (x, y), (x + w, y + h), (36,255,12), 2)
cv2.imshow('before', before)
cv2.imshow('after', after)
cv2.imshow('diff',diff)
cv2.waitKey(0)
И я получаю этот результат.
Мои изображения до и после были одинаковыми (с небольшим движением из-за наличия воздуха на экране), но метод SSIM всегда обнаруживает изменения в одних и тех же изображениях.
Мое первое изображение:
![enter image description here](https://i.stack.imgur.com/Uvh5G.png)
Второе изображение:
![enter image description here](https://i.stack.imgur.com/9LoVO.png)
И результат, который я получил после обработки,
![enter image description here](https://i.stack.imgur.com/6roDX.png)
Существуют ли другие способы получения новой разницы? Я попытался применить метод Canny к изображению, но он не работает должным образом.