OpenCV-Python学习笔记(一)图片和视频的读写操作

OpenCV-Python学习笔记系列是我在学习OpenCV-Python Tutorials的笔记,希望对大家有用!


本章学习目标:学习python opencv中图片和视频的读入,显示和保存

一、图片:

(1)读入图片:cv2.imread(par1, #par2)       

         par1: 入读图片的完整路径;

      #par2: 告诉函数如何读取图片:   (a) cv2.IMREAD_COLOR, 读入彩色图,透明度被忽略,这时默认参数;(b)cv2.IMREAD_GRAYSCALE, 以灰度模式读图;(c)cv2.IMREAD_UNCHANGED, 读入一幅图,并且包含图像的alpha通道。

import cv2
import numpy as np

# Load an color image in grayscale
img = cv2.imread('figures/img_1.jpg',0)

(2)显示图像:cv2.imshow(par1, par2)

         par1: 显示窗口的名字;par2: 要显示的图像

         窗口会自动调整为图像大小,创建多个窗口时要用不同的名字,即par1要不同。

cv2.imshow('image',img)  #显示图像
cv2.waitKey()            #按下任意键图像关闭

(3)保存图像:cv2.imwrite(par1, par2)

        par1: 要保存图片的完整路径(包括图片名和格式);par2: 要保存的图片。

cv2.imwrite('figures/img_2.png', img)

此外:

* cv2.destroyALLWindows() 可以删除所有建立的窗口,删除某个特定窗口时在括号中输入窗口名;

* 先创建窗口,再加载图像:cv2.namedWindow()    

cv2.namedWindow('image_new', cv2.WINDOW_NORMAL)
cv2.imshow('image', img)
cv2.waitKey()
cv2.destroyAllWindows()

注意:opencv读入的图片是BGR格式


二、视频

(1)用摄像头捕获视频:cv2.VideoCapture()

        任务:使用摄像头来捕获一段视频,并把它转换成灰度视频显示出来。

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(True):
    # capture frame by frame
    ret, frame = cap.read()
    # Our operation on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # display the resulting frame
    cv2.imshow('frame', gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

#when everything done, release the capture
cap.release()
cv2.destroyAllWindows()

* cap.read() 返回一个布尔值(True/False)。如果帧读取的是正确的,就是True。

* 可以使用cap.isOpened(),来检查是否成功初始化了。如果返回值是True,那就没有问题。否则就要使用函数 cap.open()。

* 可以使用函数cap.get(propId) 来获得视频的一些参数信息。

* 可以使用cap.get(3) 和cap.get(4) 来查看每一帧的宽和高。默认情况下得到的值是640X480。但是我可以使用ret=cap.set(3,320)和ret=cap.set(4,240) 来把宽和高改成320X240。


(2)从文件中播放视频:

#
import cv2
import numpy as np

cap = cv2.VideoCapture('Video.avi')      #要播放视频的路径
while(cap.isOpened()):
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)     #按灰度来显示视频
    cv2.imshow('frame', gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):      # 按下q的时候窗口会被关闭
        break

cap.release()
cv2.destroyAllWindows()
#
#

(3)保存视频

       (来练习一下英语吧)

* This time we create a VideoWriter object. We should specify the output file name (eg: output.avi). Then we should specify the FourCC code (details in next paragraph). Then number of frames per second (fps) and frame size should be passed. And last one is isColorflag. If it is True, encoder expect color frame, otherwise it works with grayscale frame.

FourCC is a 4-byte code used to specify the video codec. 

* FourCC code is passed as cv2.VideoWriter_fourcc('M','J','P','G') or cv2.VideoWriter_fourcc(*'MJPG) for MJPG.

任务:从摄像头获取视频,在垂直方向上翻转每一帧并保存:

#
import cv2
import numpy as np

cap = cv2.VideoCapture(0)   #0代表摄像头编号,可以修改

#define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret == True:
        frame = cv2.flip(frame, 0)

        # write the flipped frame
        out.write(frame)
        cv2.imshow('frame', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

#release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()
#
#

cv2.imread按BGR顺序读图片,cv2.imwrite按RGB顺序写图片。若图片看成数组[:,:,[0,1,2]],则imread时变量存为[:,:,[2,1,0]],imwrite时[:,:,[0,1,2]],总是从后往前操作变量。


三、图像保存为视频

#
import cv2
import glob

fps = 10    #保存视频的帧数,可以调整(10 frames per second
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
videoWrite = cv2.VideoWriter('flamingo.avi',fourcc, fps, (1920, 1080))  #最后一个是保存图片的尺寸
imgs = glob.glob('flamingo/*.jpg')  #glob查找符合提条件的文件

'''
#图片转视频
for image in imgs:
    frame = cv2.imread(image)
    videoWrite.write(frame)
videoWrite.release()

#显示保存的视频
video = cv2.VideoCapture('D:/PycharmProjects/image2video/flamingo.avi')      #要播放视频的路径
while(video.isOpened()):
    ret, frame = video.read()
    #gray = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)     #按灰度来显示视频
    cv2.imshow('frame', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):      # 按下q的时候窗口会被关闭
        break

cap.release()
cv2.destroyAllWindows()
'''

#简单一点
for image in imgs:
    frame = cv2.imread(image)
    videoWrite.write(frame)
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

videoWrite.release()
cv2.destroyAllWindows()
#
#

注意:我的图片命名:00000xx.jpg


四、视频保存为图像

#
import numpy as np
import cv2

video = cv2.VideoCapture('flamingo.avi')  #读入视频
c = 0
rval = video.isOpened()
#timeF = 1       #视频帧计数间隔频率
while rval:      #循环读取视频帧
    c = c + 1
    rval, frame = video.read()
    if rval:
        cv2.imwrite(str(c).zfill(5)+'.jpg', frame)    #整个文件名共5个字符,在c前面补0
        cv2.waitKey(1)
    else:
        break
video.release()
#
#



                   

猜你喜欢

转载自blog.csdn.net/alawaka2018/article/details/80374852