Python库无法在使用网络摄像头捕获的两个移动图像之间进行详细的图像比较
我想有详细的图像比较,这是使用网络摄像头捕获 我尝试了OpenCV和其他Python库来进行图像比较,当我使用PC(使用Paint)对图像进行任何数字更改时,它们都能很好地工作 但是,当我使用钢笔或其他物体对图像进行物理更改,并使用网络摄像头拍摄图像时,同一个库无法检测到对图像所做的更改 导致此类问题的因素:Python库无法在使用网络摄像头捕获的两个移动图像之间进行详细的图像比较,python,opencv,image-processing,image-comparison,Python,Opencv,Image Processing,Image Comparison,我想有详细的图像比较,这是使用网络摄像头捕获 我尝试了OpenCV和其他Python库来进行图像比较,当我使用PC(使用Paint)对图像进行任何数字更改时,它们都能很好地工作 但是,当我使用钢笔或其他物体对图像进行物理更改,并使用网络摄像头拍摄图像时,同一个库无法检测到对图像所做的更改 导致此类问题的因素: 摄像头(我使用的是罗技c310) 外部噪音(我在LED管灯下拍摄图像) 当改变设计时,它可能会移动一点,这也会显示为差异 我的代码: from skimage.measure import
from skimage.measure import compare_ssim
import argparse
import imutils
import cv2
import numpy as np
# load the two input images
imageA = cv2.imread('./t_0.png')
cv2.imwrite("./test/org.jpg", imageA)
# imageA = cv2.medianBlur(imageA,29)
imageB = cv2.imread('./t_1.png')
cv2.imwrite("./test/test.jpg", imageB)
# imageB = cv2.medianBlur(imageB,29)
# convert the images to grayscale
grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)
##########################################################################################################
difference = cv2.subtract(grayA,grayB)
result = not np.any(difference)
if result is True:
print ("Pictures are the same")
else:
cv2.imwrite("./test/open_cv_subtract.jpg", difference )
print ("Pictures are different, the difference is stored.")
##########################################################################################################
diff = cv2.absdiff(grayA, grayB)
cv2.imwrite("./test/absdiff.png", diff)
##########################################################################################################
grayB=cv2.resize(grayB,(grayA.shape[1],grayA.shape[0]))
(score, diff) = compare_ssim(grayA, grayB, full=True)
diff = (diff * 255).astype("uint8")
print("SSIM: {}".format(score))
#########################################################################################################
thresh = cv2.threshold(diff, 25, 255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
#s = imutils.grab_contours(cnts)
count = 0
# loop over the contours
for c in cnts:
# images differ
count=count+1
(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(imageA, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.rectangle(imageB, (x, y), (x + w, y + h), (0, 0, 255), 2)
##########################################################################################################
print (count)
cv2.imwrite("./test/original.jpg", imageA)
# cv2.imshow("Modified", imageB)
cv2.imwrite("./test/test_image.jpg", imageB)
cv2.imwrite("./test/compare_ssim.jpg", diff)
cv2.imwrite("./test/thresh.jpg", thresh)
cv2.waitKey(0)
- 我不想使用
,因为这样会降低图像质量cv2.medianBlur
- 无需调整图像大小或裁剪图像,因为使用网络摄像头捕获的所有图像大小相同
- 对于图像捕获,环境将始终保持不变,只有设计会随着微小的变化而变化(如设计上的小点)
请帮助我找到使用Python的解决方案。
cv2.absdiff
是正确的方法,但您需要从差异中删除非常小的区域(一个像素不同并不意味着什么,您无法测量如此小的变化),并且需要包含一个阈值(亮度的微小变化是由噪声引起的,而不是物体的变化)@CrisLuengo我已经为absdiff添加了图像,我这边的问题是,在更改设计时,它可能会移动位,这也会显示为差异。好吧,如果图像移动,你必须先找到该移动并更正它。查找互相关,这是最简单的方法,如果只是一个移动,它会很好地工作(没有旋转或改变视角)。为了考虑旋转,傅里叶-梅林变换是最简单的方法。随着透视图的变化,事情变得复杂得多。@UjwalaPatil要处理移动,您需要使用cv2.drawContours
。为两幅图像制作模板后,您可以使用cv2.matchTemplate
。您可以找到许多可用于匹配模板的代码。您需要搜索用于标记模板的代码。我希望cv2.drawContours
可以帮助您标记模板。您的意思是如何检查图像[i+1,j]的值
当您在位置i,j
迭代图像时?使用普通索引…您只需首先确保i+1
仍在图像域中。cv2.absdiff
是正确的方法,但您需要从差异中删除非常小的区域(一个像素不同并不意味着什么,你不能测量这么小的变化),你需要包括一个阈值(亮度的微小变化是由噪声引起的,而不是对象的变化)@CrisLuengo我已经为absdiff添加了图像,我这边的问题是,在更改设计时,它可能会移动位,这也会显示为差异。好吧,如果图像移动,你必须先找到该移动并更正它。查找互相关,这是最简单的方法,如果只是一个移动,它会很好地工作(没有旋转或改变视角)。为了考虑旋转,傅里叶-梅林变换是最简单的方法。随着透视图的变化,事情变得复杂得多。@UjwalaPatil要处理移动,您需要使用cv2.drawContours
。为两幅图像制作模板后,您可以使用cv2.matchTemplate
。您可以找到许多可用于匹配模板的代码。您需要搜索用于标记模板的代码。我希望cv2.drawContours
可以帮助您标记模板。您的意思是如何检查图像[i+1,j]的值
当您在位置i,j
迭代图像时,使用普通索引…您只需首先确保i+1
仍在图像域中。