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()