安装
pip install opencv-python
读入图像
使用函数cv2.imread() 读入图像。这幅图像应该在此程序的工作路径,或者给函数提供完整路径,第二个参数是要告诉函数应该如何读取这幅图片。
cv2.IMREAD_COLOR:读入一副彩色图像。图像的透明度会被忽略,这是默认参数。
cv2.IMREAD_GRAYSCALE:以灰度模式读入图像
cv2.IMREAD_UNCHANGED:读入一幅图像,并且包括图像的alpha 通道
# coding=utf8 import cv2 img = cv2.imread('test.jpg', 0)
警告:就算图像的路径是错的,OpenCV 也不会提醒你的,但是当你使用命令print img时得到的结果是None。
显示图像
使用函数cv2.imshow() 显示图像。窗口会自动调整为图像大小。
第一个参数是窗口的名字,其次才是我们的图像。
你可以创建多个窗口,只要你喜欢,但是必须给他们不同的名字
# coding=utf8 import cv2 img = cv2.imread('test.jpg', 0) cv2.imshow('test.jpg', img) cv2.waitKey(0) cv2.destroyAllWIndows()
cv2.waitKey() 是一个键盘绑定函数。需要指出的是它的时间尺度是毫秒级。
函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果按下任意键,这个函数会返回按键的ASCII 码值,程序将会继续运行。
如果没有键盘输入,返回值为-1,如果我们设置这个函数的参数为0,那它将会无限期的等待键盘输入。
它也可以被用来检测特定键是否被按下,例如按键a 是否被按下,这个后面我们会接着讨论。
cv2.destroyAllWindows() 可以轻易删除任何我们建立的窗口。
如果你想删除特定的窗口可以使用cv2.destroyWindow(),在括号内输入你想删除的窗口名。
一种特殊的情况是, 你也可以先创建一个窗口, 之后再加载图像。
这种情况下, 你可以决定窗口是否可以调整大小。使用到的函数是cv2.namedWindow()。
初始设定函数标签是cv2.WINDOW_AUTOSIZE。但是如果你把标签改成cv2.WINDOW_NORMAL,你就可以调整窗口大小了。
当图像维度太大,或者要添加轨迹条时,调整窗口大小将会很有用
# coding=utf8 import cv2 img = cv2.imread('test.jpg', 0) cv2.namedWindow('image', cv2.WINDOW_NORMAL) cv2.imshow('test.jpg', img) cv2.waitKey(0) cv2.destroyAllWIndows()
保存图像
使用函数cv2.imwrite() 来保存一个图像。
cv2.imwrite('xxx',img)
# coding=utf8 import numpy as np import cv2 # Load an color image in grayscale img = cv2.imread('f:/test.jpg', 0) cv2.imshow('image', img) k = cv2.waitKey(0) & 0xff if k == 27: cv2.destroyAllWindows() elif k == ord('s'): cv2.imwrite('mmm.png', img) cv2.destroyAllWindows()
警告:如果你用的是64 位系统,你需要将 k = cv2.waitKey(0) 这行改成k = cv2.waitKey(0)&0xFF。
使用Matplotlib
Matplotib 是python 的一个绘图库,里头有各种各样的绘图方法。
之后会陆续了解到。现在,你可以学习怎样用Matplotib 显示图像。
你可以放大图像,保存它等等。
# coding=utf8 import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread('test.jpg', 0) plt.imshow(img, cmap='gray', interpolation='bicubic') plt.xticks([]), plt.yticks([]) plt.show()
注意:彩色图像使用OpenCV 加载时是BGR 模式。但是Matplotib 是RGB模式。
所以彩色图像如果已经被OpenCV 读取,那它将不会被Matplotib 正确显示。
pyplot 文档链接 https://matplotlib.org/api/pyplot_api.html
视频
为了获取视频,你应该创建一个VideoCapture 对象。
他的参数可以是设备的索引号,或者是一个视频文件。
设备索引号就是在指定要使用的摄像头。一般的笔记本电脑都有内置摄像头。所以参数就是0。
你可以通过设置成1 或者其他的来选择别的摄像头。
之后,你就可以一帧一帧的捕获视频了。但是最后,别忘了停止捕获视频。
# coding=utf8 import numpy as np import cv2 from matplotlib import pyplot as plt cap = cv2.VideoCapture(0) while(True): ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow('frame', gray) if cv2.waitKey(1) & 0xff == ord('q'): break cap.release() cv2.destroyAllWindows()
cap.read() 返回一个布尔值(True/False)。如果帧读取的是正确的,就是True。
所以最后你可以通过检查他的返回值来查看视频文件是否已经到了结尾。
有时cap 可能不能成功的初始化摄像头设备。这种情况下上面的代码会报错。你可以使用cap.isOpened(),来检查是否成功初始化了。
如果返回值是True,那就没有问题。否则就要使用函数cap.open()。
你可以使用函数cap.get(propId) 来获得视频的一些参数信息。这里propId 可以是0 到18 之间的任何整数。每一个数代表视频的一个属性,见下表
其中的一些值可以使用cap.set(propId,value) 来修改,value 就是你想要设置成的新值。
例如,我可以使用cap.get(3) 和cap.get(4) 来查看每一帧的宽和高。
默认情况下得到的值是640X480。但是我可以使用ret=cap.set(3,320)和ret=cap.set(4,240) 来把宽和高改成320X240。
注意:当你的程序报错时,你首先应该检查的是你的摄像头是否能够在其他程序中正常工作(比如linux 下的Cheese)。
从文件中播放视频
只需要把设备索引号改成视频文件的名字
在播放每一帧时,使用cv2.waiKey() 设置适当的持续时间。
如果设置的太低视频就会播放的非常快,如果设置的太高就会播放的很慢(你可以使用这种方法控制视频的播放速度)。
通常情况下25 毫秒就可以了。