threshold 值可以调节图片的对比率。
代码如下
import cv2
import os
import time
import numpy as np
# 创建保存图片的目录
if not os.path.exists("captured_images"):
os.makedirs("captured_images")
print("已创建 'captured_images' 目录。")
def images_are_different(img1, img2, threshold=0.001):
# 计算两张图片的差异
diff = cv2.absdiff(img1, img2)
# 计算差异的比例
non_zero_count = np.count_nonzero(diff)
total_count = diff.size
difference_ratio = non_zero_count / total_count
print(f"差异比例: {difference_ratio:.6f}")
return difference_ratio > threshold
def capture_and_compare(interval=1):
# 打开摄像头
print("正在打开摄像头...")
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("错误: 无法打开摄像头。")
return
prev_img = None
img_counter = 0
try:
while True:
print(f"正在捕捉第 {img_counter} 张图片...")
ret, frame = cap.read()
if not ret:
print("错误: 捕捉图片失败。")
break
if prev_img is not None:
print(f"正在比较第 {img_counter} 张图片与上一张图片...")
if images_are_different(prev_img, frame):
img_name = f"captured_images/image_{img_counter:04d}.jpg"
cv2.imwrite(img_name, frame)
print(f"图片不同。已保存 {img_name}。")
# 使用 flush() 方法确保文件写入磁盘
with open(img_name, 'rb') as f:
f.flush()
img_counter += 1
else:
print(f"第 {img_counter} 张图片与上一张图片相同,跳过。")
else:
img_name = f"captured_images/image_{img_counter:04d}.jpg"
cv2.imwrite(img_name, frame)
print(f"捕捉到第一张图片。已保存 {img_name}。")
# 使用 flush() 方法确保文件写入磁盘
with open(img_name, 'rb') as f:
f.flush()
img_counter += 1
prev_img = frame
print(f"等待 {interval} 秒后捕捉下一张图片...")
time.sleep(interval)
except KeyboardInterrupt:
print("用户中断。")
finally:
print("释放摄像头并关闭所有窗口。")
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
capture_and_compare(interval=1)