第十二篇【传奇开心果系列】Python的OpenCV技术点案例示例:视频流处理

最后

不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~

给大家准备的学习资料包括但不限于:

Python 环境、pycharm编辑器/永久激活/翻译插件

python 零基础视频教程

Python 界面开发实战教程

Python 爬虫实战教程

Python 数据分析实战教程

python 游戏开发实战教程

Python 电子书100本

Python 学习路线规划

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

以下是使用OpenCV对视频帧进行处理的示例代码:

import cv2

# 打开视频文件
cap = cv2.VideoCapture('video.mp4')

while cap.isOpened():
    # 逐帧读取视频
    ret, frame = cap.read()

    # 如果视频读取成功
    if ret:
        # 在窗口中显示原始视频帧
        cv2.imshow('Original Frame', frame)

        # 进行视频帧处理,例如图像滤波、边缘检测等
        processed_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 在窗口中显示处理后的视频帧
        cv2.imshow('Processed Frame', processed_frame)

        # 按下 'q' 键退出循环
        if cv2.waitKey(25) & 0xFF == ord('q'):
            break
    else:
        break

# 释放视频资源
cap.release()

# 关闭窗口
cv2.destroyAllWindows()

在这个示例中,我们首先使用cv2.VideoCapture函数打开视频文件。

然后,我们进入一个循环,使用cap.read()逐帧读取视频。函数返回值ret表示读取是否成功,frame是读取到的视频帧。

接着,我们可以在窗口中显示原始视频帧,使用cv2.imshow('Original Frame', frame)

然后,我们进行视频帧处理,例如将彩色帧转换为灰度帧,使用cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

最后,我们可以在窗口中显示处理后的视频帧,使用cv2.imshow('Processed Frame', processed_frame)

在循环中,我们还检查按键事件,如果按下了键盘上的 ‘q’ 键,就退出循环。

最后,我们释放视频资源,使用cap.release()函数,关闭窗口,使用cv2.destroyAllWindows()函数。

通过这段代码,你可以打开并读取视频文件的每一帧,并对每一帧进行处理,如图像滤波、边缘检测等。你可以根据需要进行各种图像处理操作,并在窗口中显示原始视频帧和处理后的视频帧。
在这里插入图片描述

  1. 目标检测与跟踪示例代码
    以下是使用OpenCV进行目标检测和跟踪的示例代码:
import cv2

# 加载预训练的目标检测模型和跟踪器
net = cv2.dnn.readNetFromCaffe('deploy.prototxt', 'res10\_300x300\_ssd\_iter\_140000.caffemodel')
tracker = cv2.TrackerCSRT_create()

# 打开摄像头
cap = cv2.VideoCapture(0)

# 选择要跟踪的目标
ret, frame = cap.read()
bbox = cv2.selectROI('Select Target', frame)
tracker.init(frame, bbox)

while True:
    # 逐帧捕捉视频
    ret, frame = cap.read()

    if ret:
        # 对当前帧进行目标检测
        blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 1.0, (300, 300), (104.0, 177.0, 123.0))
        net.setInput(blob)
        detections = net.forward()

        # 获取检测到的目标框
        for i in range(detections.shape[2]):
            confidence = detections[0, 0, i, 2]
            if confidence > 0.5:
                box = detections[0, 0, i, 3:7] \* np.array([frame.shape[1], frame.shape[0], frame.shape[1], frame.shape[0]])
                (startX, startY, endX, endY) = box.astype("int")

                # 在图像中绘制目标框
                cv2.rectangle(frame, (startX, startY), (endX, endY), (0, 255, 0), 2)

        # 更新跟踪器
        ret, bbox = tracker.update(frame)
        if ret:
            # 在图像中绘制跟踪框
            (x, y, w, h) = [int(v) for v in bbox]
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 255), 2)

        # 显示视频帧
        cv2.imshow('Object Detection and Tracking', frame)

        # 按下 'q' 键退出循环
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

# 释放摄像头资源
cap.release()

# 关闭窗口
cv2.destroyAllWindows()

在这个示例中,我们首先加载预训练的目标检测模型和跟踪器。net使用了基于SSD的Caffe模型进行目标检测,tracker使用了CSRT算法进行目标跟踪。你需要提前下载并指定相应的模型文件。

然后,我们打开摄像头,并选择要跟踪的目标。通过cv2.selectROI函数在窗口中选择一个感兴趣的区域作为目标框,并使用tracker.init方法初始化跟踪器。

接着,我们进入一个循环,逐帧捕捉视频。对于每一帧,我们首先使用目标检测模型对当前帧进行目标检测,得到检测到的目标框。然后,我们在图像中绘制检测到的目标框。

接着,我们使用跟踪器对目标进行跟踪。tracker.update方法会更新目标框的位置,并返回一个布尔值表示是否成功跟踪。

最后,我们在图像中绘制跟踪框,并显示视频帧。同时,我们还检查按键事件,如果按下了键盘上的 ‘q’ 键,就退出循环。

最后,我们释放摄像头资源,使用cap.release()函数,关闭窗口,使用cv2.destroyAllWindows()函数。

通过这段代码,你可以打开摄像头并实时进行目标检测和跟踪,将检测到的目标框和跟踪框绘制在视频帧中,实现目标的实时跟踪。
在这里插入图片描述

  1. 运动检测示例代码
    以下是使用OpenCV进行运动检测的示例代码:
import cv2

# 打开摄像头
cap = cv2.VideoCapture(0)

# 读取第一帧作为背景帧
ret, background = cap.read()
background_gray = cv2.cvtColor(background, cv2.COLOR_BGR2GRAY)
background_gray = cv2.GaussianBlur(background_gray, (21, 21), 0)

while True:
    # 逐帧捕捉视频
    ret, frame = cap.read()

    if ret:
        # 将当前帧转换为灰度图像
        gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        gray_frame = cv2.GaussianBlur(gray_frame, (21, 21), 0)

        # 计算当前帧与背景帧的差异
        frame_delta = cv2.absdiff(background_gray, gray_frame)
        threshold = cv2.threshold(frame_delta, 30, 255, cv2.THRESH_BINARY)[1]

        # 对阈值图像进行轮廓检测
        contours, _ = cv2.findContours(threshold.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        # 绘制检测到的运动目标框
        for contour in contours:
            if cv2.contourArea(contour) > 1000:
                (x, y, w, h) = cv2.boundingRect(contour)
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

        # 显示视频帧
        cv2.imshow('Motion Detection', frame)

        # 按下 'q' 键退出循环
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

# 释放摄像头资源
cap.release()

# 关闭窗口
cv2.destroyAllWindows()

在这个示例中,我们首先打开摄像头。

然后,我们读取第一帧作为背景帧,并将其转换为灰度图像。通过使用高斯模糊cv2.GaussianBlur来减少噪声对后续运动检测的影响。

接着,我们进入一个循环,逐帧捕捉视频。对于每一帧,我们将其转换为灰度图像,并进行高斯模糊处理。

然后,我们计算当前帧与背景帧之间的差异,通过cv2.absdiff函数得到差值图像。然后,使用阈值处理cv2.threshold将差值图像转换为二值图像。

接着,我们使用轮廓检测cv2.findContours对阈值图像进行运动目标的检测。通过设置面积阈值来过滤掉较小的轮廓。

最后,我们在原始视频帧中绘制检测到的运动目标框,并显示视频帧。同时,我们还检查按键事件,如果按下了键盘上的 ‘q’ 键,就退出循环。

最后,我们释放摄像头资源,使用cap.release()函数,关闭窗口,使用cv2.destroyAllWindows()函数。

通过这段代码,你可以打开摄像头并实时进行运动检测,将检测到的运动目标框绘制在视频帧中,实现对运动目标的实时检测。
在这里插入图片描述

  1. 视频编解码示例代码
    以下是使用OpenCV进行视频编解码的示例代码:

视频编码示例代码:

import cv2

# 打开摄头
cap = cv2.VideoCapture(0)

# 获取摄像头的宽度和高度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 创建视频编码器
fourcc = cv2.VideoWriter_fourcc(\*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (width, height))

while True:
    # 逐帧捕捉视频
    ret, frame = cap.read()

    if ret:
        # 将视频帧写入视频文件
        out.write(frame)

        # 显示视频帧
        cv2.imshow('Video Encoding', frame)

        # 按下 'q' 键退出循环
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

# 释放资源
cap.release()
out.release()

# 关闭窗口
cv2.destroyAllWindows()

视频解码示例代码:

import cv2

# 打开视频文件
cap = cv2.VideoCapture('video.mp4')

while True:
    # 逐帧读取视频
    ret, frame = cap.read()

    if ret:
        # 显示视频帧
        cv2.imshow('Video Decoding', frame)

        # 按下 'q' 键退出循环
        if cv2.waitKey(25) & 0xFF == ord('q'):
            break
    else:
        break

# 释放资源
cap.release()

# 关闭窗口
cv2.destroyAllWindows()

视频编码示例代码中,我们首先打开摄像头。

然后,我们获取摄像头的宽度和高度,以便后续创建视频编码器。

接着,我们进入一个循环,逐帧捕捉视频。对于每一帧,我们将其写入到视频文件中,使用out.write(frame)

同时,我们显示视频帧,使用cv2.imshow('Video Encoding', frame)

在循环中,我们还检查按键事件,如果按下了键盘上的 ‘q’ 键,就退出循环。

最后,我们释放资源,包括摄像头和视频编码器,使用cap.release()out.release()函数,关闭窗口,使用cv2.destroyAllWindows()函数。

通过这段代码,你可以打开摄像头并实时进行视频编码,将视频帧写入到指定的视频文件中。

视频解码示例代码中,我们首先打开视频文件。

然后,我们进入一个循环,逐帧读取视频。对于每一帧,我们显示视频帧,使用cv2.imshow('Video Decoding', frame)

在循环中,我们还检查按键事件,如果按下了键盘上的 ‘q’ 键,就退出循环。

最后,我们释放资源,包括视频文件,使用cap.release()函数,关闭窗口,使用cv2.destroyAllWindows()函数。

通过这段代码,你可以打开视频文件并逐帧读取视频,实现视频的解码和播放。
在这里插入图片描述

  1. 光流估计示例代码
    以下是使用OpenCV进行光流估计的示例代码:
import cv2

# 打开视频文件
cap = cv2.VideoCapture('video.mp4')

# 创建Lucas-Kanade光流算法对象
lk_params = dict(winSize=(15, 15), maxLevel=2, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))

# 读取第一帧
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)

# 创建用于绘制光流的颜色
color = (0, 255, 0)

while True:
    # 逐帧读取视频
    ret, frame = cap.read()

    if ret:
        # 将当前帧转换为灰度图像
        frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 计算光流
        p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, None, None, \*\*lk_params)

        # 选择良好的跟踪点
        good_new = p1[st == 1]
        good_old = p0[st == 1]

        # 绘制光流轨迹
        for i, (new, old) in enumerate(zip(good_new, good_old)):
            a, b = new.ravel()
            c, d = old.ravel()
            frame = cv2.line(frame, (a, b), (c, d), color, 2)
            frame = cv2.circle(frame, (a, b), 3, color, -1)

        # 更新上一帧的图像和追踪点
        old_gray = frame_gray.copy()
        p0 = good_new.reshape(-1, 1, 2)

        # 显示视频帧
        cv2.imshow('Optical Flow', frame)

        # 按下 'q' 键退出循环
        if cv2.waitKey(25) & 0xFF == ord('q'):
            break
    else:
        break

# 释放资源
cap.release()

# 关闭窗口
cv2.destroyAllWindows()

在这个示例中,我们首先打开视频文件。

然后,我们创建Lucas-Kanade光流算法对象,并设置相关参数。

接着,我们读取第一帧,并将其转换为灰度图像。

进入一个循环,逐帧读取视频。对于每一帧,我们将其转换为灰度图像。

然后,使用cv2.calcOpticalFlowPyrLK函数计算光流,得到新的跟踪点和状态。

接着,我们选择良好的跟踪点,通过筛选状态为1的跟踪点。

然后,我们绘制光流轨迹,在当前帧上绘制线条和圆点。

最后,我们更新上一帧的图像和跟踪点,将当前帧的灰度图像赋值给上一帧的灰度图像,并更新跟踪点。

同时,我们显示视频帧,使用cv2.imshow('Optical Flow', frame)

在这里插入图片描述

感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:

① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值