蓝线挑战 --python版本

import cv2
import numpy as np

def linear_blend(src1, src2, dst):
    """
    将两幅图像进行线性混合
    :param src1: 生成的定格图像(扫描线以上的部分)
    :param src2: 原视频帧图像
    :param dst: 输出的混合图像
    """
    for i in range(src1.shape[0]):  # 遍历行
        for j in range(src1.shape[1]):  # 遍历列
            if src1[i, j, 0] != 0:  # 如果扫描到的像素不为0
                dst[i, j] = src1[i, j]  # 使用定格图像的像素
            else:
                dst[i, j] = src2[i, j]  # 使用原视频帧的像素

def main():
    # 打开摄像头
    capture = cv2.VideoCapture(0)
    if not capture.isOpened():
        print("无法打开摄像头!")
        return

    # 获取视频帧的宽度和高度
    width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))

    # 定义变量,表示当前扫描高度
    h = 0

    # 用于生成定格图像
    temp = np.zeros((height, width, 3), dtype=np.uint8)

    while True:
        # 读取一帧图像
        ret, frame = capture.read()
        if not ret:
            print("无法读取视频帧!")
            break

        # 将图像拷贝一份,用于每帧更新
        canvas = frame.copy()

        # 从顶向下逐行扫描图像
        if h < height:
            h += 1
            # 将扫描到的图像像素进行重新绘制,生成新图像
            for j in range(width):
                temp[h, j] = canvas[h, j]
            # 绘制扫描过程
            cv2.line(canvas, (0, h), (width, h), (255, 255, 0), 2)

        # 创建结果图像
        result = np.zeros_like(frame)
        linear_blend(temp, canvas, result)  # 将两张图像进行像素叠加

        # 显示图像
        cv2.imshow("定格图像", temp)
        cv2.imshow("原视频帧", canvas)
        cv2.imshow("蓝线挑战", result)

        # 按下ESC键退出
        if cv2.waitKey(10) == 27:
            break

    # 释放摄像头并关闭窗口
    capture.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值