实时摄像头馈送中的差异检测
difference detection in live camera feed
我面临一个挑战,给我一张图片,我需要找出图片中的对象与我将使用 python 通过 IP 摄像机看到的我面前的对象之间的区别.
这是原来递过来的照片
这是来自 IP 摄像机的提要的样子
现在我应该编写一个程序来检测两个对象之间的差异,并对每个不同部分进行颜色编码。
如果它只包含那两张图片,一切都很容易,但后者应该是来自相机的实时馈送,所以我编写的程序会因不同的相机位置或不同的曝光而产生差异。
#!/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()
现在彩色视频源上的输出应该像 这个
颜色编码不是问题
我试着给绘制的轮廓一个设定的区域来绘制,显然它没有用,ssim 分数计算也没有。
我应该如何处理这个问题,因为感觉我正在尝试重新发明已经构建的东西,但在尝试了 2 周后我找不到。
我把我放在你other post. You can use 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))
参考图片:
注册第二张图片:
阈值差异:
抱歉后来的回答,但我的一位团队成员使用了@fmw42 的评论并且有效。
很抱歉没有详细信息,因为脚本丢失了
我面临一个挑战,给我一张图片,我需要找出图片中的对象与我将使用 python 通过 IP 摄像机看到的我面前的对象之间的区别. 这是原来递过来的照片
这是来自 IP 摄像机的提要的样子
现在我应该编写一个程序来检测两个对象之间的差异,并对每个不同部分进行颜色编码。 如果它只包含那两张图片,一切都很容易,但后者应该是来自相机的实时馈送,所以我编写的程序会因不同的相机位置或不同的曝光而产生差异。
#!/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()
现在彩色视频源上的输出应该像 这个
颜色编码不是问题
我试着给绘制的轮廓一个设定的区域来绘制,显然它没有用,ssim 分数计算也没有。 我应该如何处理这个问题,因为感觉我正在尝试重新发明已经构建的东西,但在尝试了 2 周后我找不到。
我把我放在你other post. You can use 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))
参考图片:
注册第二张图片:
阈值差异:
抱歉后来的回答,但我的一位团队成员使用了@fmw42 的评论并且有效。
很抱歉没有详细信息,因为脚本丢失了