OpenCV于1999年由加里·布拉斯基(Gary Bradsky)在英特尔创立,并于2000年发布了第一个版本。Vadim Pisarevsky加入Gary Bradsky,管理英特尔俄罗斯软件OpenCV团队。2005年,OpenCV被用于斯坦利,赢得了2005年DARPA大挑战赛。后来,在Gary Bradsky和Vadim Pisarevsky领导的Willow Garage的支持下,该项目继续积极发展。OpenCV现在支持大量与计算机视觉和机器学习相关的算法,并且每天都在扩展。
OpenCV支持多种编程语言,如c++、Python、Java等,可在Windows、Linux、OS X、Android和iOS等不同平台上使用。基于CUDA和OpenCL的高速GPU操作接口也在积极开发中。
OpenCV-Python是OpenCV的Python API,结合了OpenCV c++ API和Python语言的最佳品质。
安装
pip3 install opencv-python
图片操作
imread()
imread(filename, flags=None)
用于读取图像,返回一个numpy.ndarray
对象。该函数接收两个参数:第一个参数为图片,图像应位于工作目录当中,或提供完整的工作目录;第二个为指定读取图像的方式:
- cv2.IMREAD_COLOR: 值为1,加载彩色图像,图像的透明度将被忽略。这是默认项
- cv2.IMREAD_GRAYSCALE: 值为0,加载灰色图像
- cv2.IMREAD_UNCHANGED: 值为-1,加载图像,包括alpha通道
import cv2
img = cv2.imread('b.png', 0)
值得注意的是,即使图像路径错误,也不会引发任何错误,但是返回的img将会是None
imwrite()
imwrite(filename, img, params=None)
用于保存图像。
- filename: 将要保存的图片文件全路径
- img:
numpy.ndarray
对象
import cv2
im = cv2.imread('b.png', 0)
cv2.imwrite('b_copy.png', im)
imshow()
imshow(winname, mat)
在窗口中显示图像,窗口自动适合图像尺寸
- winname: 窗口名称
- mat:
numpy.ndarray
对象
cv2.imshow('image', im)
waitKey()
waitKey(delay=None)
是键盘绑定功能,它的参数是以毫秒为单位的时间。如果在此期间按任意键,程序将继续。如果传递了0,它将无限期地等待击键。
destroyAllWindows()
destroyAllWindows()
只会销毁我们创建的所有窗口。如果要销毁指定的窗口,我们可以使用cv2.destroyWindow()
方法,然后需要传递指定的窗口名称即可
import cv2
cv2.destroyAllWindows()
视频操作
绘图操作
line
画线操作。line(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
函数参数说明如下:
- img:
numpy.ndarray
对象 - pt1: 矩形左上角坐标点,为一个元组或列表
- pt2: 矩形右下角坐标点,为一个元组或列表
- color: 线条颜色
- thickness: 线宽, -1表示填充
import cv2
import numpy as np
# 创建一个黑色背景板
img = np.zeros((512,512,3), np.uint8)
print(type(img)) # <class 'numpy.ndarray'>
# 画一条绿线, 从0,0开始,到400,400结束,线宽为1
cv2.line(img, (0, 0), (400, 400), (117, 251, 76), 1)
cv2.imshow('line', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
rectangle
绘制矩形操作。rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
函数参数说明如下:
- img:
numpy.ndarray
对象 - pt1: 矩形左上角坐标点,为一个元组或列表
- pt2: 矩形右下角坐标点,为一个元组或列表
- color: 线条颜色
- thickness: 线宽, -1表示填充
import cv2
import numpy as np
# 创建一个黑色背景板
img = np.zeros((512,512,3), np.uint8)
print(type(img)) # <class 'numpy.ndarray'>
# 绘制矩形
cv2.rectangle(img, (50, 50), (130, 90), (117, 251, 76), 1)
cv2.imshow('rectangle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
circle
绘制圆形操作。circle(img, center, radius, color, thickness=None, lineType=None, shift=None)
函数参数说明如下:
- img:
numpy.ndarray
对象 - center: 圆心坐标点,为一个元组或列表
- radius: 半径长度
- color: 线条颜色
- thickness: 线宽, -1表示填充
import cv2
import numpy as np
# 创建一个黑色背景板
img = np.zeros((512,512,3), np.uint8)
print(type(img)) # <class 'numpy.ndarray'>
# 绘制圆形
cv2.circle(img, (200, 200), 50, (117, 251, 76), 1)
cv2.imshow('circle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
ellipse
绘制椭圆操作。ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness=None, lineType=None, shift=None)
函数参数说明如下:
- img:
numpy.ndarray
对象 - center: 圆心坐标点,为一个元组或列表
- axes: 为一个包含长轴长度, 短轴长度的元组
- angle: 椭圆沿逆时针旋转的角度
- startAngle: 主轴沿顺时针方向测量的椭圆弧的起点
- endAngle: 主轴沿顺时针方向测量的椭圆弧的终点。startAngle为0,endAngle为360时,将给出完整的椭圆
- color: 线条颜色
- thickness: 线宽, -1表示填充
import cv2
import numpy as np
# 创建一个黑色背景板
img = np.zeros((512,512,3), np.uint8)
print(type(img)) # <class 'numpy.ndarray'>
# 绘制椭圆
cv2.ellipse(img, (200, 200), (80, 40), 0, 0, 360, (117, 251, 76), 1)
cv2.imshow('circle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
用鼠标作为画笔
如果我们希望在画布上,鼠标随意点击一个地方就绘制一个圆,我们可以用到cv2.setMouseCallback()
,这是一个监听鼠标事件的回调函数,使用如下:
import cv2
import numpy as np
def draw_circle(event, x, y, flags, params):
if event == cv2.EVENT_LBUTTONDOWN:
cv2.circle(img, (x, y), 100, (255, 0, 0), 1)
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)
while(1):
cv2.imshow('image', img)
if cv2.waitKey(20) & 0xFF == 27: # 按下Esc键
break
cv2.destroyAllWindows()
轨迹栏作为调色板
在这里,我们将创建一个简单的应用程序,以显示你指定的颜色。你有一个显示颜色的窗口,以及三个用于指定B、G、R颜色的跟踪栏。滑动轨迹栏,并相应的更改窗口的颜色。默认情况下,窗口颜色将设置为黑色!代码如下:
import cv2
import numpy as np
def progress_value_changed(x):
pass
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('image')
cv2.createTrackbar('R', 'image', 0, 255, progress_value_changed)
cv2.createTrackbar('G', 'image', 0, 255, progress_value_changed)
cv2.createTrackbar('B', 'image', 0, 255, progress_value_changed)
switch = 'OFF/ON'
cv2.createTrackbar(switch, 'image', 0, 1, progress_value_changed)
while(1):
cv2.imshow('image', img)
if cv2.waitKey(20) & 0xFF == 27:
break
r = cv2.getTrackbarPos('R', 'image')
g = cv2.getTrackbarPos('G', 'image')
b = cv2.getTrackbarPos('B', 'image')
s = cv2.getTrackbarPos(switch, 'image')
if s == 0:
img[:] = 0
else:
img[:] = [b, g, r]
cv2.destroyAllWindows()
下面,来对用到的两个函数进行讲解一下:
createTrackbar(trackbarName, windowName, value, count, onChange): 创建拖动条
- trackbarName: 拖动条名称
- windowName: 窗口名称
- value: 当前拖动条的值
- count: 拖动条最大值
- onChange: 拖动条值变化回调函数
getTrackbarPos(trackbarname, winname): 获取拖动条的值
- trackbarname: 拖动条名称
- winname: 窗口名称