Opencv需求版本:Opencv>=3.4.4
1.从图片开始
学习如何读取、展示、保存图片
目标:
- 从文件中读取图像(cv.imread)
- 以Opencv窗口展示图像(cv.imshow)
- 将图片写入文件中(cv.imwrite)
源码
import cv2 as cv
import sys
#从文件中读取图片
img = cv.imread('blox.jpg')
if img is None:
sys.exit('Could not read the image.')
#以Opencv窗口显示图片
cv.imshow('Display Window',img)
#等待按键信息传入变量k中
k = cv.waitKey(0)
if k == ord('s'):
cv.imwrite('blox.png',img)
注:使用的图片路径在opencv/sources/samples/data文件夹下
解释
第一步,导入Opencv的python库和其他需要使用的库
import cv2 as cv
import sys
主要代码分析
cv.imread 第一个参数为图片的路径,第二个参数有三个可选项
- IMREAD_COLOR:以BGR通道,位深度为8的格式读取图片,默认选项。数字形式为 1
- IMREAD_UNCHANGED:按原样加载图片(包括存在的Alpha通道)。数字形式为 0
- IMREAD_GRAYSCALE:将图像加载为强度图像(理解为只加载几个通道图像的灰度值)。数字形式为 -1
img = cv.imread('blox.jpg')
#img = cv.imread('blox.jpg',IMREAD_COLOR) 默认为该参数
#img = cv.imread('blox.jpg',IMREAD_UNCHANGED)
#img = cv.imread('blox.jpg',GRAYSCALE)
然后通过调用cv.imshow函数来显示图像,第一个参数是图像窗口的标题,第二个是将要显示的图像对象。
cv.imshow('Display Window',img)
最后,我们希望窗口一直显示到用户按下某个键为止,所以我们使用cv.waitKey函数,唯一的参数是等待用户输入的时间(按照毫秒计算)。零代表永远等待。该函数有返回值为用户按下的键。
k = cv.waitKey(0)
if k == ord('s'):
cv.imwrite('blox.png',img)
如果返回的值为s,即用户按下s键,则调用cv.imwrite函数,将img图像保存到指定路径中,同时关闭图像窗口,程序结束运行。
如果返回值不为s,就会直接关闭图像窗口,程序结束运行。
2.从视频开始
学习展示视频、从相机中获取视频和保存视频
目标:
- 学习读取、展示、保存视频()
- 学习从相机中获取视频并展示它()
源码1 从摄像头中捕获视频
import numpy as np
import cv2 as cv
#此处0为参数代表摄像头设备编号
cap = cv.VideoCapture(0)
#判断摄像头是否打开
if not cap.isOpened():
print('Cannot open camera')
exit()
while True:
# ret -> return value即返回值 代表着是否读取到了视频,frame为截取的视频的一帧图片
ret,frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
#将视频中每一帧图片转换为灰度图
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
cv.imshow('frame',gray)
#此处waitKey中的参数如果为0则会出现按下按键才会刷新下一帧的问题
if cv.waitKey(1) == ord('q'):
break
#释放摄像头捕获程序
cap.release()
cv.destroyAllWindows()
源码2 从文件中打开视频
import numpy as np
import cv2 as cv
cap = cv.VideoCapture('vtest.avi')
while cap.isOpened():
ret,frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
gray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
cv.imshow('frame',gray)
if cv.waitKey(1) == ord('q'):
break
cap.release()
cv.destroyAllWindows()
源码3 保存视频
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
#定义VideoWriter参数中的FourCC,即指定视频编码器的4字节代码
fourcc = cv.VideoWriter_fourcc(*'XVID')
#四个参数分别为保存的路径文件、指定视频编码、帧率、视频长宽
out = cv.VideoWriter('output.avi',fourcc,20.0,(640,480))
if not cap.isOpened():
cap.open()
while cap.isOpened():
ret,frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
#进行帧翻转
frame = cv.flip(frame,0)
#将视频帧写入视频
out.write(frame)
cv.imshow('frame',frame)
if cv.waitKey(1) == ord('q'):
break
cap.release()
out.release()
cv.destroyAllWindows()
相关函数解释
cv.VideoCapture():作用为获取指定文件/编号摄像头中的视频流。参数为视频路径/摄像头编号
cap.IsOpened():判断摄像头是否初始化捕捉或者视频流是否能打开,使用该函数进行判断,打开返回True,反之则返回False
cap.open()::对未打开的摄像头进行打开操作。若cap中包含了视频流,则会报错。
有时摄像头可能未初始化捕捉,所以需要使用cap.IsOpened()判断一下,如果确实未打开,则可以使用cap.open()打开
cv.VideoWriter():定义一个对象来保存视频,参数有5个,分别为输出文件名、FourCC视频编码、FPS(每秒帧率)、帧大小(视频长宽)、isCOLOR(True为彩色帧、False为灰度帧),之后就循环用write方法将帧写入该对象。即完成了保存视频操作
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
out.write(frame)
cap.get(propId):访问视频中的属性,可选参数0-18,代表视频的各个属性。
函数
cap.get(propId)
可以用来获得视频的一些参数信息。这里
propId 可以是 0 到 18 之间的任何整数。每一个数代表视频的一个属性:
• CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds.(0-视频文件的当前位置(毫秒))
• CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next.(1-下一步要解码/捕获的帧的基于0的索引)
• CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file: 0 - start of the film, 1 - end of the film.(2-视频文件的相对位置:0-胶片开始,1-胶片结束)
• CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream.(3-视频流中帧的宽度)
• CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream.(4-视频流中帧的高度)
• CV_CAP_PROP_FPS Frame rate.
(5-帧率)
• CV_CAP_PROP_FOURCC 4-character code of codec.
(6-编解码器的4字符代码)
• CV_CAP_PROP_FRAME_COUNT Number of frames in the video file.
(7-视频文件中的帧数。)
• CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() .
(8-返回mat对象的格式)
• CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode.
(9-后端特定值,指示当前捕获模式)
• CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras).
(10-图像的亮度--仅适用于相机)
• CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras).
(11-对比度--仅用于相机)
• CV_CAP_PROP_SATURATION Saturation of the image (only for cameras).
(12-饱和度--仅用于相机)
• CV_CAP_PROP_HUE Hue of the image (only for cameras).
(13-色调--仅用于相机)
• CV_CAP_PROP_GAIN Gain of the image (only for cameras).
(14-增益--仅用于相机)
• CV_CAP_PROP_EXPOSURE Exposure (only for cameras).
(15-曝光--仅用于相机)
• CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB.
(16-布尔标志,指示是否应将图像转换为RGB。)
• CV_CAP_PROP_WHITE_BALANCE Currently unsupported
(17-当前不受支持)
• CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently)
(18-立体摄像机的校正标志(注:目前仅受DC1394 v 2.x后端支持))
对应的,使用 cap.set(propId,value) 来修改视频属性,value 就是你想要设置成的新值。
cap.set(propId,value):对视频的某个属性进行修改赋值操作。
总结
本篇文章展示了如何使用Opencv进行基本的图像读取、展示、保存以及视频的捕获、展示和保存操作。
注:该文章为一篇学习笔记,可能有什么遗漏或者错误的地方,希望大家帮忙指正,感谢。