调用电脑摄像头每隔一秒拍照,对比前后照片,留下不同的照片

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值