OpenCV 单目摄像头(python版)

前言

本文主要介绍在OpenCV用使用单目摄像头,包括:打开单目摄像头、设置摄像头参数、拍照、录制视频。

环境:编程语言:Python3        主要依赖库:OpenCV3.x 或 OpenCV4.x

 

目录

1)打开摄像头

2)设置分辨率

3)细节提升

4)摄像头拍照

5)录制视频


 

单目摄像头

1)打开摄像头

OpenCV有VideoCapture()函数,能用来定义“摄像头”对象,0表示第一个摄像头(一般是电脑内置的摄像头);如果有两个摄像头,第二个摄像头则对应VideoCapture(1)。

在while循环中使用“摄像头对象”的read()函数一帧一帧地读取摄像头画面数据。

imshow函数是显示摄像头的某帧画面;cv2.waitKey(1)是等待1ms,如果期间检测到了键盘输入q,则退出while循环。

# -*- coding: utf-8 -*-
import cv2

cap = cv2.VideoCapture(0) # 0表示第一个摄像头
while(1):
    # get a frame
    ret, frame = cap.read()
    # show a frame
    cv2.imshow("capture", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

 调用release()释放摄像头,调用destroyAllWindows()关闭所有图像窗口。

 

2)设置分辨率

有时需要指定摄像头的分辨率,比如1920*1080;

cap.set(3,1920) 设置帧的宽度为1920。cap.set(4,1080) 设置帧的长度为1080。

# -*- coding: utf-8 -*-
import cv2

cap = cv2.VideoCapture(0)
#先设置分辨率,宽:1920 长:1080
cap.set(3,1920)
cap.set(4,1080)
while(1):
    # get a frame
    ret, frame = cap.read()
    # show a frame
    cv2.imshow("capture", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

拓展:当摄像流为 cap,设置参数是cap.set(参数编号,参数);获取参数值的函数是 cap.get(参数编号)。

方法释义
cv2.VideoCapture.get(0)视频文件的当前位置(播放)以毫秒为单位
cv2.VideoCapture.get(1)基于以0开始的被捕获或解码的帧索引
cv2.VideoCapture.get(2)视频文件的相对位置(播放):0=电影开始,1=影片的结尾。
cv2.VideoCapture.get(3)在视频流的帧的宽度
cv2.VideoCapture.get(4)在视频流的帧的高度
cv2.VideoCapture.get(5)帧速率
cv2.VideoCapture.get(6)编解码的4字-字符代码
cv2.VideoCapture.get(7)视频文件中的帧数
cv2.VideoCapture.get(8)返回对象的格式
cv2.VideoCapture.get(9)返回后端特定的值,该值指示当前捕获模式
cv2.VideoCapture.get(10)图像的亮度(仅适用于照相机)
cv2.VideoCapture.get(11)图像的对比度(仅适用于照相机)
cv2.VideoCapture.get(12)图像的饱和度(仅适用于照相机)
cv2.VideoCapture.get(13)色调图像(仅适用于照相机)
cv2.VideoCapture.get(14)图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
cv2.VideoCapture.get(15)曝光(仅适用于照相机)
cv2.VideoCapture.get(16)指示是否应将图像转换为RGB布尔标志
cv2.VideoCapture.get(17)× 暂时不支持
cv2.VideoCapture.get(18)立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)

 

3)细节提升

其实在ret, frame = cap.read() 代码,能通过ret 的值来判断是否成功读取到摄像头的画面数据,加一个判断逻辑更严谨一些;

成功读取摄像头数据时,ret 值返回True;获取失败时返回False。

# -*- coding: utf-8 -*-
import cv2

cap = cv2.VideoCapture(0)
#先设置分辨率,宽:1920 长:1080
cap.set(3,1920)
cap.set(4,1080)
while(1):
    # get a frame
    ret, frame = cap.read()
    if ret:
        # show a frame
        cv2.imshow("capture", frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        print("图像数据获取失败!!")
        break
cap.release()
cv2.destroyAllWindows()

 

4)摄像头拍照

拍照 = 保存图片,使用 cv2.imwrite 把当前摄像头的帧 数据写进去,保存为图片的形式;如果s键按下,则进行图片保存;

# -*- coding: utf-8 -*-
import cv2

cap = cv2.VideoCapture(0)
#先设置分辨率,宽:1920 长:1080
cap.set(3,1920)
cap.set(4,1080)
# 图像计数 从1开始
img_count = 1

while(1):
    # get a frame
    ret, frame = cap.read()
    if ret:
        # show a frame
        cv2.imshow("capture", frame)
        # 等待按键事件发生 等待1ms
        key = cv2.waitKey(1)
        if key == ord('q'):
            # 如果按键为q 代表quit 退出程序
            print("程序正常退出..")
            break
        elif key == ord('s'):
            ## 如果s键按下,则进行图片保存
            # 写入图片 并命名图片为 图片序号.png
            cv2.imwrite("{}.png".format(img_count), frame)
            print("保存图片,名字为  {}.png".format(img_count))
            # 图片编号计数自增1
            img_count += 1

    else:
        print("图像数据获取失败!!")
        break
cap.release()
cv2.destroyAllWindows()

 

5)录制视频

保存图片使用的是cv2.imwrite(),要保存视频,需要创建一个VideoWriter对象,需要传入四个参数。

  • 输出的文件名,如’output.avi’
  • 编码方式FourCC码
  • 帧率FPS
  • 要保存的分辨率大小
# -*- coding: utf-8 -*-
import cv2

cap = cv2.VideoCapture(0)
# 定义编码方式并创建VideoWriter对象
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
outfile = cv2.VideoWriter('output.avi', fourcc, 25., (640, 480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret:
        outfile.write(frame)  # 写入文件
        cv2.imshow('frame', frame)
        if cv2.waitKey(1) == ord('q'):
            break
    else:
        break

使用cv2.VideoCapture()创建视频对象,然后在循环中一帧一阵显示图像。

 

参考:https://www.programcreek.com/python/example/85663/cv2.VideoCapture

https://appdividend.com/2020/06/26/python-cv2-videocapture-how-to-load-video-in-python/

 

 

 

 

一颗小树x CSDN认证博客专家 华为云首席贡献官 华为云-云享专家 研发工程师
计算机专业,从事自动驾驶工作。有幸成为华为云-云享专家,华为云-云创 首席贡献官,CSDN博客专家,华为认证AI工程师,华为云产品”四星级“体验官;GitChat认证作者。
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页
实付 29.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值