Python-OpenCV 处理视频(一)(二): 输入输出 视频处理

本文介绍了使用OpenCV进行视频处理的基本方法,包括从本地文件和摄像头读取视频、视频帧的显示与处理、视频的录制与保存等。此外,还详细讲解了如何应用Canny算法进行边缘检测以及实现人脸识别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

视频的处理和图片的处理类似,只不过视频处理需要连续处理一系列图片。

一般有两种视频源,一种是直接从硬盘加载视频,另一种是获取摄像头视频。

0x00. 本地读取视频

核心函数:

cv.CaptureFromFile()

代码示例:

import cv2.cv as cv

capture = cv.CaptureFromFile('myvideo.avi')

nbFrames = int(cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_COUNT))

#CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream
#CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream

fps = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FPS)

wait = int(1/fps * 1000/1)

duration = (nbFrames * fps) / 1000

print 'Num. Frames = ', nbFrames
print 'Frame Rate = ', fps, 'fps'
print 'Duration = ', duration, 'sec'

for f in xrange( nbFrames ):
    frameImg = cv.QueryFrame(capture)
    print cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_POS_FRAMES)
    cv.ShowImage("The Video", frameImg)
    cv.WaitKey(wait)

cv2

import numpy as np
import cv2

cap = cv2.VideoCapture('vtest.avi')

while(cap.isOpened()):
    ret, frame = cap.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

0x01. 摄像头视频读取

核心函数:

cv.CaptureFromCAM()

示例代码:

import cv2.cv as cv

capture = cv.CaptureFromCAM(0)

while True:
    frame = cv.QueryFrame(capture)
    cv.ShowImage("Webcam", frame)
    c = cv.WaitKey(1)
    if c == 27: #Esc on Windows
        break

cv2

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

0x02. 写入视频

摄像头录制视频

import cv2.cv as cv

capture=cv.CaptureFromCAM(0)
temp=cv.QueryFrame(capture)
writer=cv.CreateVideoWriter("output.avi", cv.CV_FOURCC("D", "I", "B", " "), 5, cv.GetSize(temp), 1)
#On linux I used to take "M","J","P","G" as fourcc

count=0
while count<50:
    print count
    image=cv.QueryFrame(capture)
    cv.WriteFrame(writer, image)
    cv.ShowImage('Image_Window',image)
    cv.WaitKey(1)
    count+=1

从文件中读取视频并保存

import cv2.cv as cv
capture = cv.CaptureFromFile('img/mic.avi')

nbFrames = int(cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_COUNT))
width = int(cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH))
height = int(cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT))
fps = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FPS)
codec = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FOURCC)

wait = int(1/fps * 1000/1) #Compute the time to wait between each frame query

duration = (nbFrames * fps) / 1000 #Compute duration

print 'Num. Frames = ', nbFrames
print 'Frame Rate = ', fps, 'fps'

writer=cv.CreateVideoWriter("img/new.avi", int(codec), int(fps), (width,height), 1) #Create writer with same parameters

cv.SetCaptureProperty(capture, cv.CV_CAP_PROP_POS_FRAMES,80) #Set the number of frames

for f in xrange( nbFrames - 80 ): #Just recorded the 80 first frames of the video

    frame = cv.QueryFrame(capture)

    print cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_POS_FRAMES)

    cv.WriteFrame(writer, frame)

    cv.WaitKey(wait)

cv2

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame,0)

        # write the flipped frame
        out.write(frame)

        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

# Release everything if job is finished
cap.release()
out.release()

cv2.destroyAllWindows()

————————————————————————————————————喵星人说这是分割线————————————————————————————————————

0x00. 使用 Canny 算法边缘识别

Canny 算法是一种多级边缘识别算法。

Canny边缘识别算法可以分为以下5个步骤:

  1. 应用高斯滤波来平滑图像,目的是去除噪声。

  2. 找寻图像的强度梯度(intensity gradients)。

  3. 应用非最大抑制(non-maximum suppression)技术来消除边误检(本来不是但检测出来是)。

  4. 应用双阈值的方法来决定可能的(潜在的)边界。

  5. 利用滞后技术来跟踪边界。

具体原理性质的东西可以参考这里

读取本地视频处理代码示例:

import cv2.cv as cv

capture = cv.CaptureFromFile('img/myvideo.avi')

nbFrames = int(cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_COUNT))
fps = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FPS)
wait = int(1/fps * 1000/1)

dst = cv.CreateImage((int(cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH)),
                        int(cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT))), 8, 1)

for f in xrange( nbFrames ):

    frame = cv.QueryFrame(capture)

    cv.CvtColor(frame, dst, cv.CV_BGR2GRAY)
    cv.Canny(dst, dst, 125, 350)
    cv.Threshold(dst, dst, 128, 255, cv.CV_THRESH_BINARY_INV)

    cv.ShowImage("The Video", frame)
    cv.ShowImage("The Dst", dst)
    cv.WaitKey(wait)

直接处理摄像头视频:

import cv2.cv as cv

capture = cv.CaptureFromCAM(0)

dst = cv.CreateImage((int(cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH)),
                        int(cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT))), 8, 1)

while True:
    frame = cv.QueryFrame(capture)
    cv.CvtColor(frame, dst, cv.CV_BGR2GRAY)
    cv.Canny(dst, dst, 125, 350)

    cv.Threshold(dst, dst, 128, 255, cv.CV_THRESH_BINARY_INV)
    cv.ShowImage("The Video", frame)
    cv.ShowImage("The Dst", dst)

    c = cv.WaitKey(1)
    if c == 27: #Esc on Windows
        break

0x01. 人脸识别

使用OpenCV可以很简单的检测出视频中的人脸等:

import cv2.cv as cv

capture=cv.CaptureFromCAM(0)

hc = cv.Load("haarcascades/haarcascade_frontalface_alt.xml")

while True:
frame=cv.QueryFrame(capture)
faces = cv.HaarDetectObjects(frame, hc, cv.CreateMemStorage(), 1.2,2, cv.CV_HAAR_DO_CANNY_PRUNING, (0,0) )

for ((x,y,w,h),stub) in faces:
    cv.Rectangle(frame,(int(x),int(y)),(int(x)+w,int(y)+h),(0,255,0),2,0)

    cv.ShowImage("Window",frame)
    c=cv.WaitKey(1)
    if c==27 or c == 1048603: #If Esc entered
        break



from: https://segmentfault.com/a/1190000003804797

https://segmentfault.com/a/1190000003804807

<think>好的,我现在需要帮助用户了解如何使用PythonOpenCV进行视频读取与处理。用户明确要求个示例教程,所以我得确保回答结构清晰,步骤详细,并且提供代码示例。首先,我应该回顾下用户提供的引用内容,看看有哪些信息可以利用。 根据引用[3]和[4],用户提到使用cv.VideoCapture()和cv.VideoWrite()处理视频,以及如何读取视频文件并转换为灰度视频。引用[4]中的代码示例展示了如何读取视频文件,逐帧处理并显示灰度图像,同时控制播放速度。这可以作为基础,我需要将这些内容整合成个连贯的教程。 接下来,我需要确定教程的结构。通常,步骤化的指南更容易理解。首先介绍安装OpenCV,然后讲解视频读取的基本步骤,接着处理帧,最后保存处理后的视频。此外,用户可能关心如何处理实时摄像头输入,所以应该包含摄像头捕获的部分。 在代码示例方面,需要确保语法正确,并且注释详细。例如,使用cv2.VideoCapture()时,参数可以是文件路径或摄像头索引。处理帧时,可能需要颜色转换、边缘检测等操作,这里选择灰度转换作为示例,因为引用中多次提到,同时也可以提及其他处理方式,如Canny边缘检测。 另外,用户提供的引用中提到cv2.waitKey()的作用,控制视频播放速度。需要解释这个参数的意义,比如25毫秒对应的大约40帧每秒,以及如何通过调整它来改变播放速度。 保存处理后的视频需要使用cv2.VideoWriter(),这里需要说明FourCC编码、帧率、分辨率等参数的设置。引用[3]和[4]中提到了保存视频的方法,但可能需要补充FourCC的具体用法,例如在Windows下使用'DIVX'。 还要注意资源释放的问题,比如在结束处理后释放VideoCapture和VideoWriter对象,并关闭所有窗口。这些细节能帮助用户避免常见错误,比如内存泄漏或未正确关闭设备。 用户可能遇到的问题包括无法打开视频文件或摄像头,所以在代码中需要添加错误处理,比如检查cap.isOpened(),并在读取帧失败时退出循环。此外,处理视频时路径问题可能导致错误,需要提醒用户确保文件路径正确。 最后,生成相关问题,帮助用户进步学习。根据引用内容,可能的问题涉及性能优化、实时处理的应用场景、对比其他库如FFmpeg,以及处理中的异常处理。 需要确保所有LaTeX格式正确,行内公式用$...$,独立公式用$$...$$,但在这个回答中可能数学公式较少,主要集中在代码和步骤说明上。所以可能只需要检查是否有需要公式的地方,比如图像处理中的某些算法,但暂时看来不需要。 总结下,教程的结构应该是: 1. 安装OpenCV 2. 读取视频文件 3. 逐帧处理(灰度转换) 4. 显示和保存处理后的视频 5. 摄像头实时处理 6. 注意事项和常见问题 每个部分配合代码示例和解释,确保用户能逐步跟随操作。同时引用提供的参考资料,如引用[3]和[4]中的代码结构,保证回答的可靠性。</think>### Python OpenCV视频读取与处理分步教程 #### 1. 环境准备 安装OpenCV库: ```bash pip install opencv-python ``` #### 2. 基础视频读取流程 ```python import cv2 # 读取视频文件(或摄像头输入) cap = cv2.VideoCapture('input.mp4') # 替换为0可调用摄像头[^4] while cap.isOpened(): ret, frame = cap.read() if not ret: print("视频读取失败或结束") break # 转换为灰度帧 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 显示处理结果 cv2.imshow('Video Processing', gray) # 按Q键退出(25ms帧间隔控制播放速度) if cv2.waitKey(25) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() ``` #### 3. 视频保存功能实现 ```python # 定义视频编码参数 fourcc = cv2.VideoWriter_fourcc(*'XVID') # Windows推荐DIVX/MacOS推荐MJPG out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480)) # 参数:文件名、编码、帧率、分辨率[^3] # 在循环处理中添加写入操作 out.write(processed_frame) ``` #### 4. 高级处理示例(边缘检测) ```python # 在帧处理环节添加Canny算法 edges = cv2.Canny(frame, 100, 200) cv2.imshow('Edges', edges) ``` #### 5. 关键参数说明 1. `cv2.waitKey(25)`:控制视频播放速度,25ms对应约40FPS 2. `cv2.COLOR_BGR2GRAY`:OpenCV默认BGR色彩空间转换 3. 分辨率匹配:输出视频分辨率需与原始帧致[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值