OpenCV
简介
全称Open Source Computer Vision Library,开源计算机视觉库,是一堆C和C++语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。
由英特尔公司主导并推进研发,,以BSD许可证授权发行,可以在商业和研究领域中免费使用,现在美国Willow Garage为OpenCV提供主要的支持
广泛应用于工业和科研领域,用于实时图像处理、计算机视觉和模式识别程序的开发。
OpenCV的重要性
计算机视觉包括图像识别、物体检测、人脸辨识、手势识别等
机器人科技:自动导航、环境探测、用户互动
医疗影像:图像改进、划分、特征抽取
自动驾驶技术:环境感知、障碍物侦测、车道标识辨识
安全监控功能:动态监测、面部识别、行为分析
环境安装
pip install opencv-python -i Simple Index
显示窗口
cv2.namedWindow 是 OpenCV 库中的一个函数,用于创建一个命名窗口,以便在该窗口中显示图像或进行其他图形操作。这个函数在处理图像和视频时非常有用,尤其是在开发基于图像处理的应用程序时
函数原型:cv2.namedWindow(winname, flags=None)
参数:
winname (str): 窗口名称称号,这个名称必须是唯一的,因为它是用来标识窗口的。
flags:窗口标志,用于设置窗口的行为,默认值为
cv2.WINDOW_AUTOSIZE
常见的标志包括:
cv2.WINDOW_NORMAL(可手动调整大小)
cv2.WINDOW_AUTOSIZE(自动调整大小)。
示例
opencv不支持中文,包括窗口名称和图像文件路径不支持直接使用中文字符,
可以使用Unicode字符串或Python的os模块来处理路径。
import cv2
#函数:创建窗口,名称image,cv2.WINDOW_NORMAL手动调整窗口大小
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
#设置窗口大小(宽,高),名称和nameWindow一致
cv2.resizeWindow("image", 120, 190)
#读取图片,imread(图片路径)
image = cv2.imread(r'C:\Users\My Documents\opencv.png')
cv2.waitKey(0)
在OpenCV中,图片以矩阵(NumPy数组)的形式储存
if image is None:
print("未读到图片")
#用窗口显示图片
cv2.imshow('image', image)
#等待键盘操作,无限等待
cv2.waitKey(0)
while(True):
key = cv2.waitKey()
#27 指的是键盘ESC键
if key == 27:
print("终止")
break
#释放资源
cv2.destroyAllWindows()
创建空白图像
函数:np.zeros((height, width, channels), dtype=np.uint8)
示例
import cv2
import numpy as np
def text01():
#创建一个图片矩阵
#512是图片高度,511是宽度,3是通道(RGB),1是灰度图像
image = np.zeros((512,511,3), dtype = np.uint8)
print(image)
cv2.imshow("image",image)
cv2.waitKey(0)
cv2.destoryAllWindows()
text01()
保存图片
函数:cv2.imwrite(filename, img[, params])
参数:
filename:保存的文件路径和名称
img:要保存的图像
示例
import cv2
#读取图片
im= cv2.imread(r'C:\Users\My Documents\opencv.png')
#保存图片:imwrite(保存图片路径,图像矩阵),返回布尔值
iss = cv2.imwrite("save.jpg",im)
if iss == True:
print("保存成功")
else:
print("保存失败")
图像切片(裁剪)
语法:img[y:y+h, x:x+w]
参数:
x:子区域左上角的x坐标
y:子区域左上角的y坐标
w:子区域的宽度
h:子区域的高度
示例
import cv2
img = cv2.imread(r'C:\Users\My Documents\opencv.png')
#获取图片的像素
h,w,c = img.shape
print(f"高度:{h},宽度:{w}, 通道:{c}")
#定义坐标
x= 50 #x坐标小于图片的宽度
y = 50 #y坐标小于图片的高度
w = 80 #w,h裁剪后图片的像素
h = 130
cai_img = img[y:y+h,x:x+w]
#获取图片的像素
ch,cw,cc = cai_img.shape
print(f"高度:{ch},宽度:{cw},通道:{cc}")
cv2.imshow('old', img)
cv2.imshow('image', cai_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
调整图片大小
函数:cv2.resize(src, dsize, dst)
参数:
src:输入图像
dsize:输出图像的尺寸
示例
import cv2
img = cv2.imread("images/car.png")
height, width, channels = img.shape
print(f"高度:{height},宽度:{width},通道数:{channels}")
img = cv2.resize(img, (300, 300))
height, width, channels = img.shape
print(f"调整后:高度:{height},宽度:{width},通道数:{channels}")
cv2.imwrite("save_image/car.png", img)
图像绘制
绘制圆形
函数:cv2.circle(img, center, radius, color, thickness)
参数:
img:要绘制圆形的图像
center:圆心的坐标
radius:圆的半径
color:圆的颜色
thickness:圆的边界线条的厚度
示例
import cv2
img = cv2.imread("../images/car.png")
center = (300, 200)
radius = 50
color = (0, 255, 0)
thickness = 5
cv2.circle(img, center, radius, color, thickness)
cv2.imshow('Circle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
绘制矩形
函数:cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
参数:
img:要绘制矩形的图像
pt1:矩形的一个顶点
pt2:矩形对角线上的另一个顶点
color:矩形的颜色
thickness:矩形边框的厚度
示例
import cv2
import numpy as np
img = np.zeros((200,500,3),dtype=np.uint8)
#定义绘制矩形的左上角坐标
left_top = (100,100)
#定义绘制矩形的右下角坐标
right_bottom = (300,200)
#定义颜色
color = (0,0,255)
#定义线条宽度
w = 5
#画矩形
r_img = cv2.rectangle(img,left_top,right_bottom,color,w)
cv2.imshow("a",r_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
绘制文本
函数:cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
参数:
img:输入图像
text:要添加的文本字符串
org:文本的起始位置
fontFace:字体类型
fontScale:字体大小的比例因子
color:文本颜色
thickness:文本线条的厚度
示例
import cv2
import numpy as np
from PIL import Image,ImageDraw,ImageFont
def put_text(image, text, position, font_path, font_size, color):
将 OpenCV 图像转换为 PIL 图像
pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
创建一个可以在给定图像上绘图的对象
draw = ImageDraw.Draw(pil_image)
加载字体
font = ImageFont.truetype(font_path, font_size)
在图像上绘制文本
draw.text(position, text, fill=color, font=font)
将 PIL 图像转换回 OpenCV 图像
image_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)
return image_with_text
img = cv2.imread(r'C:\Users\My Documents\car.png')
#定义字体的文本内容
text = "后"
#起始坐标
c = (100,200)
#字体格式
f = cv2.FONT_HERSHEY_PLAIN
#字体大小
size = 2
#字体粗细
w = 1
#字体颜色
color = (0,0,255)
#写字
#c_img = cv2.putText(img,text=text,org=c,fontScale=size,fontFace=f,color=color,thickness=w)
#换成中文
font_path ="font/simhei.ttf"
c_img = put_text(img,"你好世界",c,font_path,30,color)
cv2.imshow("a",c_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
绘制直线
函数:cv2.line(img, pt1, pt2, color, thickness)
参数:
img:输出图像
pt1:直线的一个端点
pt2:直线的另一个端点
color:直线的颜色
thickness:直线的宽度
示例
import cv2
img = cv2.imread("images/car.png")
start_point = (50, 50)
end_point = (450, 450)
color = (255, 0, 0)
thickness = 2
cv2.line(img, start_point, end_point, color, thickness)
cv2.imshow('Image with Line', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
控制鼠标
函数:cv2.setMouseCallback(windowName, onMouse[, param])
参数:
windowName:窗口名称
onMouse:鼠标回调函数
param:传递给回调函数的参数
示例
import cv2
#鼠标回调函数
#event 鼠标事件
#x,y 鼠标在图形区域所在的坐标
#flag:标识
#param 参数
def mytext(event, x, y, flag, param):
print(f"坐标{(x,y)}")
print(f"flag={flag}")
print(f"param={param}")
img = cv2.imread(r'C:\Users\My Documents\car.png')
#定义窗口
cv2.namedWindow('name')
#设置执行鼠标操作的回调函数
cv2.setMouseCallback('name', mytext)
cv2.imshow("name",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
视频处理
类:cv2.VideoCapture
常用方法:
read():读取下一帧
release():释放视频捕获资源
isOpened():检查视频捕获对象是否已成功打开
get() 和 set():获取和设置视频捕获属性
示例
import cv2
video_capture = cv2.VideoCapture('video/1.mp4')
if not video_capture.isOpened():
print("视频没有打开")
exit()
fps = video_capture.get(cv2.CAP_PROP_FPS)
delay = int(1000 / fps)
while True:
ret, frame = video_capture.read()
cv2.imshow('Video', frame)
if cv2.waitKey(delay) & 0xFF == ord('q'):
break
video_capture.release()
cv2.destroyAllWindows()
解决OpenCV显示中文乱码问题
方法:使用PIL库处理中文文本
示例
import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as np
def put_text(image, text, position, font_path, font_size, color):
pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(pil_image)
font = ImageFont.truetype(font_path, font_size)
draw.text(position, text, fill=color, font=font)
image_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)
return image_with_text
image = cv2.imread('images/car.png')
text = "你好,世界!"
position = (50, 50)
font_path = "myfont/simhei.ttf"
font_size = 30
color = (0, 0, 255)
image_with_text = put_text(image, text, position, font_path, font_size, color)
cv2.imshow('Image with Text', image_with_text)
cv2.waitKey(0)
cv2.destroyAllWindows()