python实现opencv学习三:调用摄像头或打开视频文件

调用摄像头

代码:

# -*- coding=GBK -*-
import cv2 as cv


# 打开摄像头获取图片
def video_demo():
    capture = cv.VideoCapture(0, cv.CAP_DSHOW)  # 打开摄像头,0代表的是设备id,如果有多个摄像头,可以设置其他数值
    while True:
        ret, frame = capture.read()  # 读取摄像头,它能返回两个参数,第一个参数是bool型的ret,其值为True或False,代表有没有读到图片;第二个参数是frame,是当前截取一帧的图片
        frame = cv.flip(frame, 1)  # flip():图像翻转函数   第二个参数 小于0: 180°旋转,等于0: 上下颠倒,大于0: 水平颠倒(镜像图)
        cv.imshow("video", frame)
        if cv.waitKey(10) & 0xFF == ord('q'):  # 详见备注
            break
        # key = cv.waitKey(10)
        # if key == 27 :
        #     break



video_demo()
cv.destroyAllWindows()

结果:

备注:

while True 实现无限循环,保证read()函数能一帧一帧读取视频图像

其中 cv.waitKey(10) & 0xFF == ord('q') 这句代码不是cv.waitKey(10) + & + 0xFF == ord('q') 这样理解的而是cv.waitKey(10) & 0xFF + == ord('q')这样理解的,cv.waitKey(10)表示待用户10ms内触发键盘按键并返回按键对应的SACII码,与0xFF做&/位与运算是为了避免waitKey()返回负数的值,当然在一定情况下可以把 & 0xFF删除也没问题

“& 0xFF”问题详见:https://blog.csdn.net/i6223671/article/details/88924481

ord()函数为键盘按键接收函数,简单来说就是接收键盘上按键对应的字符,并返回字符对应的ASCII码,输入参数要求为字符型

 


打开视频文件

代码:

# -*- coding=GBK -*-
import cv2 as cv


capture = cv.VideoCapture('HeartMake.mp4')  # 读取视频文件
fps = capture.get(cv.CAP_PROP_FPS)  # 获取码率
size = (int(capture.get(cv.CAP_PROP_FRAME_WIDTH)), int(capture.get(cv.CAP_PROP_FRAME_HEIGHT)))  # 获取尺寸
fNUMS = capture.get(cv.CAP_PROP_FRAME_COUNT)  # 获取帧数

def video_demo():

    cv.namedWindow("video", 0)
    cv.resizeWindow("video", 1000, 600) # 设置播放窗口长和宽

    # ret, frame = capture.read()  # 读取第一帧

    while True:
        ret, frame = capture.read()  # 读取下一帧
        cv.imshow("video", frame) # 显示目前帧
        cv.waitKey(int(fps)) # 设置延迟,便于观看体验
        # if cv.waitKey(10) & 0xFF == ord('q'): 
        #     break
        if cv.waitKey(1) == 27 :
            break
        # ret, frame = capture.read()  # 读取下一帧
    capture.release()


video_demo()
cv.destroyAllWindows()

结果:

备注:

无论时调用摄像头进行实时播放还是打开视频文件播放,capture.read()这个函数读取的是一帧,并且是一帧一帧读取。而且.read是capture的一个属性,意味着当capture只有一帧时,capture.read()只能返回一帧,当capture有多帧时,capture.read()是按顺序一帧一帧返回,而while循环是提供了一帧一帧之间的连贯性

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值