opencv笔记-摄像头的调用并保存照片
  xWYnr39PTA9E 2023年11月22日 17 0

导库

import cv2

创建摄像头对象

使用opencv中自带的VideoCapture()函数定义摄像头对象,其参数0表示第一个摄像头。

如果不是笔记本的话(也就是没有自带的摄像头)外接了摄像头的话,就要传入摄像头的地址(字符串形式)

cap = cv2.VideoCapture(0)
"""
函数名:cv2.VideoCapture()
功  能:通过摄像头捕获实时图像数据
返回值:有
参数一:摄像头代号,0为默认摄像头,笔记本内建摄像头一般为 0
       或者填写视频名称直接加载本地视频文件
"""
cap = cv2.VideoCapture(0)  # 创建一个 VideoCapture 对象
'''
功能:创建一个VideoCapture类的实例,如果传入对应的参数,可以直接打开视频文件或者要调用的摄像头。

VideoCapture();
VideoCapture(const string& filename);
VideoCapture(int device);

参数:
filename – 打开的视频文件名。
device – 打开的视频捕获设备id ,如果只有一个摄像头可以填0,表示打开默认的摄像
'''
'''
1)如果默认笔记本/台式机只有一个USB摄像头,Index=0; 如果有2个,一般Index为0和1,根据具体情况区分,摄像头接入和断开会改变Index值 
2)如果接入2个以上,但只想用指定的一个,可以在设备管理器中禁用其他,同时Index设置为0 
'''

opencv笔记-摄像头的调用并保存照片_图片保存


设置视频窗口的大小set()

这里可以设置视频播放的的大小,需要了解摄像头支持的视频大小。

cap.set(3, 960)
cap.set(4, 960)
'''
可以看到下面的两个图的长度对比,得出3是修改视频图像的宽度的。
第三张图可以看到不设置宽度和高度时我电脑的默认宽高。
好像最多只能设置为1280*720.反正我设置1280*1280的时候就不行了。
'''

opencv笔记-摄像头的调用并保存照片_图片保存_02

opencv笔记-摄像头的调用并保存照片_OpenCV_03

opencv笔记-摄像头的调用并保存照片_摄像头使用_04

当然也可以设置其他的参数(第一个参数就是图中的值),具体参考下图:

opencv笔记-摄像头的调用并保存照片_摄像头使用_05


set()和get()

'''
通过cap.get(propId)可以获取摄像头的一些属性,比如捕获的分辨率,亮度和对比度等。
propId是从0~18的数字,代表不同的属性,完整的属性列表可以参考:VideoCaptureProperties。
也可以使用cap.set(propId,value)来修改属性值。
'''
'''
某些摄像头设定分辨率等参数时会无效,因为它有固定的分辨率大小支持,一般可在摄像头的资料页中找到。
'''
# 获取捕获的分辨率
# propId可以直接写数字,也可以用OpenCV的符号表示
width, height = capture.get(3), capture.get(4)
print(width, height)

# 以原分辨率的一倍来捕获
capture.set(cv2.CAP_PROP_FRAME_WIDTH, width * 2)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, height * 2)

逐帧显示实现视频播放

读取视频的某一帧

利用摄像头对象的read()函数读取视频的某帧,并显示.

ret, frame = cap.read()
cv2.imshow("capture", frame)

函数名:cap.read()

功 能:返回两个值先返回一个布尔值,如果视频读取正确,则为 True,如果错误,则为 False,也可用来判断是否到视频末尾;再返回一个值,为每一帧的图像,该值是一个三维矩阵。

通用接收方法为: ret,frame = cap.read(); 这样 ret 存储布尔值,frame 存储图像。若使用一个变量来接收两个值,如 frame = cap.read() 则 frame 为一个元组,原来使用 frame 处需更改为 frame[1]

返回值:1:布尔值 2:图像的三维矩阵

'''
ret , frame = cap.read()
cap.read()是读取摄像头画面。(因为视频是一帧一帧的显示,所以这也是一帧一阵的传输的)捕获一帧的图像。(将一帧一帧连续起来就形成了视频)
ret代表的是里面有图像有数据的话就为true,没有图像数据的话就为false。【true->打开摄像头,false->关闭摄像头】
frame代表的是图像的数据内容(画面)。所以后面显示的时候是传入这个frame的。
'''

打开窗口显示画面

cv2.imshow("窗口名称",要传入窗口的画面变量参数)
cv2.imshow("Video",frame)

将一帧一帧图像连续起来显示为视频画面

'''
很简单在外层加个while循环即可。
while循环里面反复执行:
    1.读取视频的一帧图像
    2.将一帧图像显示
'''
while(true):
    ret, frame = cap.read()
	cv2.imshow("capture", frame)

加个判断条件来终止摄像头程序的运行(终止循环)

在while循环里面写个if语句,判断用户有没有按下s键或者q键。
k = cv2.waitKey(1) & 0xFF  # 每帧数据延时 1ms,延时不能为 0,否则读取的结果会是静态帧
if k == ord('s'):  # 若检测到按键 ‘s’,打印字符串
    count += 1
    print(cap.get(3))
    print(cap.get(4))
    cv2.imwrite('{}.jpg'.format(count), frame)
elif k == ord('q'):  # 若检测到按键 ‘q’,退出
    break
'''
提问:
if cv2.waitKey(1) & 0xFF == ord('q'):
        break
这段话是什么意思
解答:
这段代码是OpenCV库中的一个常见用法,用于检测用户是否按下了键盘上的某个键。
解析如下:
	cv2.waitKey(1): 这是一个函数调用,它等待一个键盘事件。参数1表示等待的时间(以毫秒为单位)。如果在这个时间内有键盘事件发生,函数会返回该事件的ASCII码值;如果没有发生键盘事件,函数会返回-1。
	& 0xFF: 这是位运算符,用于将结果限制在8位以内。这是因为ASCII码值的范围是0到255,而cv2.waitKey()函数返回的是一个无符号整数。通过与0xFF进行位与运算,可以确保结果始终是一个8位的整数。
	ord('q'): 这是Python内置函数ord()的调用,它返回一个字符的ASCII码值。在这里,'q'是我们要检测的键。
	if cv2.waitKey(1) & 0xFF == ord('q'):: 这是条件判断语句,检查cv2.waitKey(1) & 0xFF的值是否等于ord('q')。如果等于,说明用户按下了'q'键,此时条件成立,执行break语句,跳出循环或退出程序。

总的来说,这段代码的作用是检测用户是否按下了'q'键,如果是,就跳出循环或退出程序。
'''

opencv笔记-摄像头的调用并保存照片_数据_06


ord()

ord(): 这是Python内置函数ord()的调用,它返回一个字符的ASCII码值。
例如:
ord('q'): 在这里,'q'是我们要检测的键。

cv2.isOpened()

"""
函数名:cv2.isOpened()
功  能:返回一个布尔值( True / False ),检查是否初始化成功,成功返回 True
返回值:布尔值
"""
while(cap.isOpened()):

释放摄像头对象和窗口

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

cap.release()
cv2.destroyAllWindows()

完整代码

import cv2

"""
函数名:cv2.VideoCapture()
功  能:通过摄像头捕获实时图像数据
返回值:有
参数一:摄像头代号,0为默认摄像头,笔记本内建摄像头一般为 0
       或者填写视频名称直接加载本地视频文件
"""
cap = cv2.VideoCapture(0)  # 创建一个 VideoCapture 对象

"""
函数名:cap.set( propId , value )
功  能:设置视频参数,设置视频的宽高值和摄像头有关使用笔记本内置摄像头时只能设置为 1280*720 以及 640*480,
       哪怕设置值不同时都会自动校正过来,并且仍然返回 True
返回值:布尔值
参数一:需要设置的视频参数
参数二:设置的参数值
"""
cap.set(3, 960)
cap.set(4, 960)

count = 1  # 设置一个标志,用来输出视频信息
"""
函数名:cv2.isOpened()
功  能:返回一个布尔值( True / False ),检查是否初始化成功,成功返回 True
返回值:布尔值
"""
while(cap.isOpened()):  # 循环读取每一帧
    """
    函数名:cap.read()
    功  能:返回两个值
           先返回一个布尔值,如果视频读取正确,则为 True,如果错误,则为 False,也可用来判断是否到视频末尾
           再返回一个值,为每一帧的图像,该值是一个三维矩阵
           通用接收方法为:
           ret,frame = cap.read();
           这样 ret 存储布尔值,frame 存储图像
           若使用一个变量来接收两个值,如
           frame = cap.read()
           则 frame 为一个元组,原来使用 frame 处需更改为 frame[1]
    返回值:R1:布尔值
           R2:图像的三维矩阵
    """
    ret, frame = cap.read()

    cv2.imshow("Capture_Test", frame)  # 窗口显示,显示名为 Capture_Test

    k = cv2.waitKey(1) & 0xFF  # 每帧数据延时 1ms,延时不能为 0,否则读取的结果会是静态帧
    if k == ord('s'):  # 若检测到按键 ‘s’,打印字符串
        count += 1
        """
        函数名:cap.get( propId )
        功  能:查询视频的参数
        返回值:无
        参数一:查询的视频参数,其中部分值可以使用 cap.set() 进行修改
        """
        print(cap.get(3))
        print(cap.get(4))
        #保存一帧图片
        cv2.imwrite('{}.jpg'.format(count), frame)

    elif k == ord('q'):  # 若检测到按键 ‘q’,退出
        break

cap.release()  # 释放摄像头
cv2.destroyAllWindows()  # 删除建立的全部窗口
import cv2

cap = cv2.VideoCapture(0)  
cap.set(3, 960) # 宽度
cap.set(4, 960) # 高度
count = 0  
while(cap.isOpened()):  
    ret, frame = cap.read()
    cv2.imshow("Capture_Test", frame)
    k = cv2.waitKey(1) & 0xFF  
    if k == ord('s'):
        count += 1
        print('视频参数为:',cap.get(3),cap.get(4),'保存照片{}.jpg'.format(count))
        cv2.imwrite('opencv\\request\\{}.jpg'.format(count), frame)
    elif k == ord('q'):
        break
print('程序退出!已保存{}个照片'.format(count),'请在request文件夹中查看~')
cap.release()
cv2.destroyAllWindows()

学习链接

gjnet 的python控制usb摄像头拍照 python 控制摄像头https://blog.51cto.com/u_12891/7163401?articleABtest=0

小U的领航团图像分类课程 OpenCV基础知识点总结https://aistudio.baidu.com/projectdetail/1627554?channelType=0&channel=0

sunrongpic的OpenCV基础https://aistudio.baidu.com/projectdetail/2269322?channelType=0&channel=0


笔记图片

opencv笔记-摄像头的调用并保存照片_图片保存_07

opencv笔记-摄像头的调用并保存照片_图片保存_08

opencv笔记-摄像头的调用并保存照片_ide_09

opencv笔记-摄像头的调用并保存照片_数据_10



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月22日 0

暂无评论

推荐阅读
xWYnr39PTA9E
最新推荐 更多