学习视频: https://www.bilibili.com/video/av68735378
官方文档: https://docs.opencv.org/master/d6/d00/tutorial_py_root.html
pip3 install opencv-python -i https://pypi.doubanio.com/simple
import cv2 as cv
import numpy as np
from PIL import Image
读取图像
cv.imread()
img1 = cv.imread(filePath+fileName, 0) # 以灰度模式读入图像
img2 = cv.imread(filePath+fileName, 1) # 以彩色模式读入图像,忽略 透明度
img3 = cv.imread(filePath+fileName, -1) # 以彩色模式读入图像,包含 透明度
显示图像
cv.imshow()
method1
cv.imshow("img1", img1) # 创建窗口侠士,窗口名,图像
cv.waitKey() # 0表示等待键盘输入,按任意键继续运行程序
cv.destroyAllWindows() # 销毁 所有窗口
method2
cv.nameWindow("img1", cv.WINDOW_NORMAL) # 先创建窗口,在显示图像
# cv.WINDOW_NORMAL 允许调整串口大小
# cv.WINDOW_AUTOSIZE 自动生成靠出口大小
cv.imshow("img1", img1) # 创建窗口侠士,窗口名,图像
cv.waitKey(0) # 0表示等待键盘输入,按任意键继续运行程序
cv.destroyAllWindows() # 销毁 所有窗口
method3 - matplotlib refpython-matplotlib-image-numpy-相互配合
%matplotlib inline
import matplotlib.pyplot as plt
img1 = Image.open(r"")
plt.imshow(img1) # nparray 数组直接转为图像
# 颜色 出问题,需要转一下哈
# imgRGB= cv.cvtColor(cv.imread(filePath+fileName, 1), cv.COLOR_BGR2RGB)
# plt.imshow(imgRGB)
plt.show()
保存图像
cv.imwrite()
cv.imwrite("img1.png", img1)
waitKey
cv.waitKey()
cv.waitKey(毫秒)
cv.waitKey(1000) # 1s
# 0 无限等待
# 返回键盘的值
keyValue = cv.waitKey(0) & 0xFF
print(k)
cv.destroyAllWindows()
if keyValue == key.ESC:
print("ESC 退出")
elif keyValue == ord('s'):
cv.imwrite("img1.png", img1)
cv.destroyAllWindows()
# ord 去获取 键盘编码的 一个方法
# ord-->Retuen the Unicode code point for a one-character string.
# ord('a') 97
# ord('p') 112
color = (255, 0, 0)
width = 3
画线段
cv.line()
# 需要起点 和 终点 以及 线段的颜色 和 粗细度(宽度)
img = np.zeros((512, 512, 3), np.uint8) # 模拟出一个512*512的彩色图像
cv.line(img1, (0,0), (511, 511), color, width) # 画5px宽度的蓝色线段
imgRGB= cv.cvtColor(img, cv.COLOR_BGR2RGB)
plt.imshow(imgRGB)
plt.show()
画方形
cv.rectangle()
# 需要左上角 和 右下角 以及 方形的颜色 和 粗细度(宽度)
cv.rectangle(img, (384, 0), (510, 128), color, width)
imgRGB= cv.cvtColor(img, cv.COLOR_BGR2RGB)
plt.imshow(imgRGB)
plt.show()
画圆
cv.circle()
# 需要 确定 圆心 和 半径 以及 方形的颜色 和 粗细度(宽度)
cv.circle(img, (300, 300), 63, color, width)
imgRGB= cv.cvtColor(img, cv.COLOR_BGR2RGB)
plt.imshow(imgRGB)
plt.show()
画椭圆
cv.ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]])
- img, 椭圆 所在的 图片
- center, 椭圆中心点的坐标
- axes, 长轴和短轴的长度
- angle, 整个椭圆沿 顺时针 方向旋转的角度
- startAngle、endAngle, 椭圆弧面沿 顺时针 方向起始和终止角度,如果是0、 180,就是整个椭圆在图片中间绘制下半个椭圆
- -1 全填充,10 宽度为10px的椭圆线
# 需要 确定 圆心 和 半径 以及 方形的颜色 和 粗细度(宽度)
cv.ellipse(img, (300, 300), (100, 50), 0, 0, 180, color, -1)
imgRGB= cv.cvtColor(img, cv.COLOR_BGR2RGB)
plt.imshow(imgRGB)
plt.show()
画多边形
cv.polylines()
- 画多边形,实际是画一组线段
- 需要确定各个顶点的坐标
- 点形状 形如Rows * 1 *2 的数组,其中Rows 是顶点的数量,类型必须是int32
- 用黄色4个顶点的多边形,如下:
color = (0, 255, 255)
width = 10
img = np.zeros((512, 512, 3), np.uint8)
pts = np.array([[100, 100], [300, 150], [400, 400], [50, 350]], np.int32)
print(np.shape(pts))
pts = pts.reshape((-1, 1, 2)) # 在大于二维空间时,需要转为二维空间中的点,只有二维的我们最熟悉?还是说图像是二维显示出来的?这一步留意一下下哈!!!
print(np.shape(pts))
cv.polylines(img, [pts], True, color, width) # True 闭合图形
cv.polylines(img, [pts], False, color, width) # False 不闭合图形
imgRGB= cv.cvtColor(img, cv.COLOR_BGR2RGB)
plt.imshow(imgRGB)
plt.show()
在图片上添加文字
cv.putText()
- 文字内容
- 位置(实际是 在线上写字时,横线的起始位置)
- 字体类型
- 字体大小
- 字体属性,颜色、粗细、线条类型等
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img, 'HUGH_TEST', (10, 30), font, 4, color, width)
imgRGB= cv.cvtColor(img, cv.COLOR_BGR2RGB)
plt.imshow(imgRGB)
plt.show()