OpenCV+Python编程笔记1

本文详细介绍如何使用OpenCV进行视频文件的读取与写入,包括不同编码格式的应用,以及如何从摄像头捕获视频帧并实时显示。同时,介绍了处理多路摄像头视频流的技巧,如grab()和retrieve()方法的正确使用。

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

1. OpenvCV读/写视频文件

import cv2

videoCapture = cv2.VideoCapture('MyInputVid.avi')
fps = videoCapture.get(cv2.cv.CV_CAP_PROP_FPS)
size = (int(videoCapture.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)), int(videoCapture.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter('MyOutputVid.avi', cv2.cv.CV_FOURCC('I', '4', '2', '0'), fps, size)  #YUV编码格式

success, frame = videoCapture.read()
while success: # Loop until there are no more frames.
    videoWriter.write(frame)
    success, frame = videoCapture.read()

写视频文件时可用的编码格式如下:

 

cv2.cv.CV_FOURCC('I','4','2','0') : YUV 4:2:0(.avi)
cv2.cv.CV_FOURCC('P','I','M','1') : MPEG-1(.avi)
cv2.cv.CV_FOURCC('M','J','P','G') : motion-JPEG(.avi)
cv2.cv.CV_FOURCC('T','H','E','O') : Ogg-Vorbis(.ogv)
cv2.cv.CV_FOURCC('F','L','V','1') : Flash video(.flv)

 2. 捕获视频帧

import cv2

cameraCapture = cv2.VideoCapture(0)
fps = 30 # an assumption
size = (int(cameraCapture.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)), int(cameraCapture.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter('MyOutputVid.avi', cv2.cv.CV_FOURCC('I','4','2','0'), fps, size)

success, frame = cameraCapture.read()
numFramesRemaining = 10 * fps - 1
while success and numFramesRemaining > 0:
    videoWriter.write(frame)
    success, frame = cameraCapture.read()
    numFramesRemanining -= 1

 videoCapture.get()方法往往获取不到正确的fps,这里给定一个估计值。

若读取不到视频帧时会返回(false, None)。

read()方法对获取一组摄像机的视频帧时使用不够恰当,需要使用grab()和retrieve()方法代替。

success0 = cameraCapture0.grab()
success1 = cameraCapture1.grab()
if success0 and success1:
    frame0 = cameraCapture0.retrieve()
    frame1 = cameraCapture1.retrieve()

对于一个多路摄像机,需要在retrieve()中指明每路的index:

success = multiHeadCameraCapture.grab()
if success:
    frame0 = multiHeadCameraCapture.retrieve(channel = 0)
    frame1 = multiHeadCameraCapture.retrieve(channel = 1)

3.在窗口中显示视频帧

import cv2

clicked = False
def onMouse(event, x, y, flags, param):
    global clicked
    if event == cv2.cv.CV_EVENT_LBUTTONUP:
        click = True

cameraCapture = cv2.VideoCapture(0)
cv2.namedWindow('MyWindow')
cv2.setMouseCallback('MyWindow', onMouse)

print 'Showing camera feeed. Click window or press any key to stop.'
success, frame = cameraCapture.read()
while success and cv2.waitKey(1) == -1 and not clicked:
    cv2.imshow('MyWindow', frame)
    success, frame = cameraCapture.read()

cv2.destroyWindow('MyWindow')

Python提供一个标准函数ord()将字符转换为ASCII码,ord('a') = 97
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值