这篇文章上次修改于 249 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

Matplotib操作

在使用opencv的过程中,通常会使用到Matplotib这个函数库,Matplotib 是 python 的一个绘图库,里面内置了各式各样的绘图方法,类似于Maltab中的绘图功能。
下面演示一下Matplotib的基本使用方法:

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('cat.jpg')
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # 隐藏x轴和y轴上的刻度值
plt.show()

这里使用cv2读取了一张猫的图片,使用plt.imshow展示出来,其中cmap为颜色,gray代表显示灰度图,interpolation为插值方法
显示效果:
image.png

有关plt.imshow的一些相关参数,参考:这里

下面上一组对比代码:

import cv2
import matplotlib.pyplot as plt
o = cv2.imread('dog.jpg')
g=cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
plt.figure("灰度图像显示演示")
plt.subplot(221)
plt.imshow(o),plt.axis('off')
plt.subplot(222)
plt.imshow(o,cmap=plt.cm.gray),plt.axis('off')
plt.subplot(223)
plt.imshow(g),plt.axis('off')
plt.subplot(224)#灰度正常
plt.imshow(g,cmap=plt.cm.gray),plt.axis('off')

显示效果如下:
image.png

从图中可以看出,图片的显示颜色并不正确,本该显示原图和灰度图的图片并没有正常的显示。
这里就是需要注意的一点了!opencv默认读取的图片是以BGR形式排列图层的,而matplotlib则是以目前流行的RGB形式排列图层,因此,当opencv和matplotlib同时使用的时候,需要通过转换函数:
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
将opencv读取的BGR图片转化为RGB图片,以获得正常的显示效果。

转换效果如下:
image.png

数组显示操作

opencv读取的图片本质上都是数组,下面展示一些常用的数组方法:
首先使用opencv读入一张图片:

img=cv2.imread('cat.jpg')#相对路径

直接输入img,可以查看该图片的数组信息:

array([[[142, 151, 160],
        [146, 155, 164],
        [151, 160, 169],
        ...,
        [156, 172, 185],
        [155, 171, 184],
        [154, 170, 183]],

       [[107, 118, 126],
        [112, 123, 131],
        [117, 128, 136],
        ...

可以看出,读入的图片本质为三维数组,同理,灰度图片的实质是二维数组。

  • img.shape 通过shape函数可以显示图片的长宽和通道数:(414, 500, 3)
  • cv2.imwrite('mycat.png',img) 此函数用于保存图片
  • np.min(img),np.max(img) 此函数用于查看数组最大最小值
  • img.dtype 此函数用于查看数组类型

视频数据操作

视频读取操作

视频的本质与图片类似,每一帧视频都是由十几张甚至几十张照片组成。根据人眼的视觉暂留现象形成视频。
因此,视频的本质也是数组。
这里先读取一段视频数据进行示例:

import cv2
vc = cv2.VideoCapture('test.mp4')#视频文件
vc.read()

输出结果(属于数组):

(True,
 array([[[189, 179, 174],
         [189, 179, 174],
         [189, 179, 174],
         ...,
         [220, 213, 210],
         [220, 213, 210],
         [220, 213, 210]],
 
        [[189, 179, 174],
         [189, 179, 174],
         [189, 179, 174],
         ...

现在使用opencv播放视频文件:

#while open:
while(True):
    ret, frame = vc.read()
    if frame is None:
        break
    if ret == True:
        gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2GRAY)
        # gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2RGB)
        cv2.imshow('result', gray)
        if cv2.waitKey(100) & 0xFF == 27:#设置播放视频时每一帧的持续(停留)时间
            break
vc.release()#记得释放
cv2.destroyAllWindows()

这里vc.read() 返回一个布尔值(True/False)。如果帧读取的是正确的,就是 True。所以最后你可以通过检查他的返回值来查看视频文件是否已经到了结尾。
gray这里使用的是cv2.COLOR_BGR2GRAY函数转为灰度视频播放,若想播放彩色视频,记得使用cv2.COLOR_BGR2RGB转为RGB形式。

摄像头数据操作

捕获摄像头数据使用的函数是cv2.VideoCapture.read()
该函数的语法为:retval,image=cv2.VideoCapture.read()
关闭摄像头使用的函数是:cv2.VideoCapture.release()
该函数的语法是:None=cv2.VideoCapture.release()
例如,当前有一个 VideoCapture 类的对象 cap,要将其释放,可以使用语句:
cap.release()

下面放一段代码示例:

import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(cap.isOpened()):#isOpened()函数可以用来检查是否成功初始化
    ret, frame = cap.read()
    cv2.imshow('frame',frame)
    c = cv2.waitKey(1)
    if c==27: #ESC 键
        break
cap.release()
cv2.destroyAllWindows()

运行后,python将打开电脑自带摄像头,并注册ESC键,按ESC键销毁。
补充:cv2.waitKey这个函数会返回按键的 ASCII 码值,程序将会继续运行。如果没有键盘输入,返回值为 -1,如果我们设置这个函数的参数为 0,那它将会无限期的等待键盘输入。

下面为录制视频的示例代码:

import numpy as np
import cv2
cap = cv2.VideoCapture(0)#初始化当前的摄像头
# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')#MPEG4 
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
#fourcc = -1
#out = cv2.VideoWriter('output.avi',fourcc, 20, (640,480))
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame,-1)#绕x轴翻转,使用此函数录制翻转的视频
        # 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.flip,以下是第二个参数值对于摄像头录制的影响:
image.png