OpenCv-Python学习笔记(一):图片、视频的读取、显示和保存

图片的读取、显示、保存

demo

import cv2

# 读取图片
img = cv2.imread("../data/image/1.jpeg",cv2.IMREAD_COLOR)
#显示图片
cv2.imshow('image',img)
#键盘绑定函数,64位操作系统需要&0xFF,32位则不需要
k = cv2.waitKey(0)&0xFF
#ESC按键按下
if k ==27:
    #删除建立的窗口
    cv2.destroyAllWindows()
    #'S'键按下
elif k == ord('s') :
    #保存图片
    cv2.imwrite("save.bmp",img)
    cv2.destroyAllWindows()

读取

img = cv2.imread("../data/image/1.jpeg",cv2.IMREAD_COLOR)

第一个参数是图片所在的路径,使用绝对路径和相对路径都可以。
第二个参数是要告诉函数应该如何读取这幅图片。

  • cv2.IMREAD_COLOR:读入一幅彩色图像。图像的透明度被忽略,这是默认参数,即当该参数被省略时,默认读取的是彩色图像。
  • cv2.IMREAD_GRAYSCALE:以灰度模式读入图像
  • cv2.IMREAD_UNCHANGED:读入一幅图像,并且包括图像的 alpha 通道

显示

#显示图片
cv2.imshow('image',img)
#键盘绑定函数,64位操作系统需要&0xFF,32位则不需要
k = cv2.waitKey(0)&0xFF

cv2.imshow()显示图像时,窗口会自动调整图像大小。
第一个参数是窗口的名字。
第二个参数是我们的图像。可以创建多个窗口,但是必须给他们不同的名字。
例如:读取2张图片,在2个窗口中显示。

img_1 = cv2.imread("../data/image/1.jpeg",cv2.IMREAD_COLOR)
img_2 = cv2.imread("../data/image/2.jpeg",cv2.IMREAD_COLOR)
cv2.imshow("image1",img_1)
cv2.imshow("image2",img_2)
cv2.waitKey()
  • cv2.waitKey()是一个键盘绑定函数。需要指出的是它的时间尺度是毫秒级。函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果按下任意键,这个函数会返回按键的ASCII 码值,程序将会继续运行。如果没有键盘输入,返回值为 -1,如果我们设置这个函数的参数为 0,那它将会无限期的等待键盘输入。

  • cv2.destroyAllWindows() 可以轻易删除任何我们建立的窗口。如果你想删除特定的窗口可以使用cv2.destroyWindow(),在括号内输入你想删除的窗口名。

  • cv2.namedWindow()是一个创建窗口的函数,第一个参数是窗口的名字,第二个参数是窗口的模式。

    • cv2.WINDOW_AUTOSIZE:根据图片大小自动调整窗口大小。
    • cv2.WINDOW_NORMAL:可以调整窗口大小。

例如:

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
img_1 = cv2.imread("../data/image/1.jpeg",cv2.IMREAD_COLOR)
cv2.imshow('image',img_1)
cv2.waitKey(0)
cv2.destroyAllWindows()

保存

 #保存图片
 cv2.imwrite("save.bmp",img)

第一个参数是保存图像的名称,注意需要包含后缀。
第二个参数是需要保存的图像。

视频的读取、显示、保存

demo

#创建一个VideoCapture对象,0表示电脑内置摄像头
cap = cv2.VideoCapture(0)
#从本地读取视频文件
#cap = cv2.VideoCapture("../data/video/vtest.avi")
# #获取一帧图像的宽
# width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
# #获取一帧图像的高
# height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
# #设置图像的宽为320
# ret = cap.set(cv2.CAP_PROP_FRAME_WIDTH,320)
# #设置图像的高为420
# ret = cap.set(cv2.CAP_PROP_FRAME_HEIGHT,420)
#指定一个FourceCC编码
fourcc = cv2.VideoWriter_fourcc(*'XVID')
#两种写法都可以
#fourcc = cv2.cv.FOURCC(*'DIVX')
#创建一个VideoWrite的对象
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

#当摄像头打开时循环读取帧
while(cap.isOpened()):
    #读取一帧图像
    ret, frame = cap.read()
    if ret == True:
        #显示一帧图像
        cv2.imshow('frame',frame)
        #将一帧图像写入视频文件
        out.write(frame)
         #“q”键按下
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
#释放对象
cap.release()
cv2.destroyAllWindows()

读取

#创建一个VideoCapture对象,0表示电脑内置摄像头
cap = cv2.VideoCapture(0)
#从本地读取视频文件
#cap = cv2.VideoCapture("../data/video/vtest.avi")
#当摄像头打开时循环读取帧
while(cap.isOpened()):
	 #读取一帧图像
    ret, frame = cap.read()
  • cv2.VideoCapture()函数的参数可以是设备的索引号,或者是一个视频文件的路径。设备索引号就是在指定要使用的摄像头。一般的笔记本电脑都有内置摄像头。所以参数就是 0。你可以通过设置成 1 或者其他的来选择别的摄像头。 注意:有时 cap可能不能成功的初始化摄像头设备。这种情况下上面的代码会报错。你可以使cap.isOpened(),来检查是否成功初始化了。如果返回值是True,那就没有问题。否则就要使用函数cap.open()。
  • cap.read() 返回一个布尔值(True/False)。如果帧读取的是正确的,就是True。所以最后你可以通过检查他的返回值来查看视频文件是否已经到了结尾。

获取和设置视频的一些参数信息

#获取一帧图像的宽
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) 
#获取一帧图像的高
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
#设置图像的宽为320
ret = cap.set(cv2.CAP_PROP_FRAME_WIDTH,320)
#设置图像的高为420
ret = cap.set(cv2.CAP_PROP_FRAME_HEIGHT,420)

cap.get(propId)函数获取视频的一些信息,这里propId 可以是 0 到 18 之间的任何整数。每一个数代表视频的一个属性,见下表。(有些我还没能理解,暂时用英文原文)

propId 含义
CV_CAP_PROP_POS_MSEC 当前帧在视频文件中的位置,以毫秒为单位
CV_CAP_PROP_POS_FRAMES 下一步要解码/捕获的帧
CV_CAP_PROP_POS_AVI_RATIO 视频文件的相对位置:0-胶片开始,1:胶片结束
CV_CAP_PROP_FRAME_WIDTH 一帧图像的宽度
CV_CAP_PROP_FRAME_HEIGHT 一帧图像的高度
CV_CAP_PROP_FPS 帧速率
CV_CAP_PROP_FOURCC 4-character code of codec
CV_CAP_PROP_FRAME_COUNT 视频文件中的帧数
CV_CAP_PROP_FORMAT 获取Mat()对象的格式
CV_CAP_PROP_MODE 当前捕获模式
CV_CAP_PROP_BRIGHTNESS 图像的亮度(仅适用于相机)
CV_CAP_PROP_CONTRAST 图像的对比度(仅适用于相机)
CV_CAP_PROP_SATURATION 图像的饱和度(仅适用于相机)
CV_CAP_PROP_HUE Hue 图像的色调(仅适用于相机)
CV_CAP_PROP_GAIN 图像的增益(仅适用于相机)
CV_CAP_PROP_EXPOSURE 曝光(仅适用于相机)
CV_CAP_PROP_CONVERT_RGB 指示是否应将图像转换为RGB的布尔标志
CV_CAP_PROP_WHITE_BALANCE Currently unsupported
CV_CAP_PROP_RECTIFICATION 立体声摄像头的校正标志(注:仅DC1394 v 2.x后端当前支持)

cap.set(propId,value)函数来修改视频的参数,propId和get()函数相同,value是你想要设置成的新值。

显示

 #显示一帧图像
 cv2.imshow('frame',frame)

即图片的显示,显示一帧图片。
注:在播放每一帧时,使用 cv2.waiKey() 设置适当的持续时间。如果设置的太低视频就会播放的非常快,如果设置的太高就会播放的很慢(你可以使用这种方法控制视频的播放速度)。通常情况下 25 毫秒就可以了。

保存视频

#指定一个FourceCC编码
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
#两种写法都可以
#fourcc = cv2.cv.FOURCC(*'DIVX')
#创建一个VideoWrite的对象
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
#将一帧图像写入视频文件
out.write(frame)

第一个参数是视频文件的名称,注意需要包含后缀。
第二个参数FourCC 就是一个 4 字节码,用来确定视频的编码格式。可用的编码列表可以从fourcc.org查到。这是平台依赖的。下面这些编码器对我来说是有用个。

  • In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID is more
    preferable. MJPG results in high size video. X264 gives very small
    size video)
  • In Windows: DIVX (More to be tested and added)
  • In OSX : (I don’t have access to OSX. Can some one fill this?)

第三个参数是播放频率,即帧率。
第四个参数是是isColor标签,如果是 True,每一帧就是彩色图,否则就是灰度图。

猜你喜欢

转载自blog.csdn.net/weixin_44077524/article/details/122970322
今日推荐