# OpenCV其实就是一堆C和C++语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。 他是开源的 # cv不支持中文 所有的中文都不支持 包括路径里面的中文不然就报错 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 def demo1(): # 创建窗口的完整写法 这个可以自由的更改窗口大小 # cv2.namedWindow 是 OpenCV 库中的一个函数,用于创建一个命名窗口,以便在该窗口中显示图像或进行其他图形操作。这个函数在处理图像和视频时非常有用,尤其是在开发基于图像处理的应用程序时 # cv2.namedWindow(winname, flags=None) # winname (str): 窗口的名称。这个名称必须是唯一的,因为它是用来标识窗口的。 # flags (int, 可选): 窗口的标志,用于设置窗口的行为。默认值为cv2.WINDOW_AUTOSIZE # 常见的标志包括: # cv2.WINDOW_NORMAL: 允许调整窗口大小。 # cv2.WINDOW_AUTOSIZE`: 窗口大小根据图像大小自动调整,不能手动调整 # 创建窗口函数 cv2.namedWindow("image",cv2.WINDOW_NORMAL) # 传入窗口名称 和 是否允许手动调整窗口大小 # 设置窗口大小 cv2.resizeWindow("Image Window",500,300) 分别传入窗口名称和长和宽 cv2.resizeWindow("image",500,300) # 读取一个图片 变量名=cv2.imread(路径) 返回的是一个图片的矩阵 image=cv2.imread("../../assets/images/car.png") # 路径转义问题 字符前面加r # 用窗口显示图片 cv2.imshow("image",image) # 等待键盘操作 0 无限等待 单位毫秒 # 使用 `cv2.waitKey` 暂停程序执行,等待用户按键。参数 `0` 表示无限期等待,直到有按键事件发生。返回值:是一个ASCII值,例如:q 键 ASCII 值为 113 ESC 键是27 int型 # 可以使用这个返回值进行一些布尔操作 while True: if cv2.waitKey(0)==27: break # 关闭所有窗口 cv2.destroyAllWindows() return None def demo2():# 利用numpy创建一个图片矩阵 快速创建图片窗口 不写窗口大小 # 你可以使用np.zeros函数创建一个全零数组,这个数组可以表示一个空白图像。数组的形状应该符合图像的尺寸和通道数(例如,对于 RGB 图像,形状应为(height, width, 3))height, width,就是图片的宽高 # 3通道是RGB 1通道是灰度图像 cv2.namedWindow("image") image=np.zeros((300,200,3)) cv2.imshow("image",image) cv2.waitKey(0) cv2.destroyAllWindows() # 保存图片 cv2.imwrite(保存的路径(别忘了后缀),图片矩阵变量) 返回值是一个布尔值 保存成功为True 失败则False if cv2.imwrite("../../assets/images/black.png", image): print("保存成功") else: print("保存失败") pass def demo3(): # 图片裁剪 """ 假设你有一个图像 `img`,它的类型是 `numpy.ndarray`。`img[y:y+h, x:x+w]` 的含义如下: x: 子区域左上角的 x 坐标。 y: 子区域左上角的 y 坐标。 w: 子区域的宽度。 h: 子区域的高度。 切片操作 img[y:y+h, x:x+w]提取的是从(x, y)开始,宽度为 `w`,高度为 `h` 的矩形区域。 """ # 从左上到右下 x,y是左上角的坐标 wh是宽和高 x,y,w,h=200,150,300,100 img=cv2.imread("../../assets/images/car.png") license_plate=img[y:y+h,x:x+w] cv2.namedWindow("image") cv2.namedWindow("image2") cv2.imshow("image",license_plate) cv2.imshow("image2",img) cv2.waitKey(0) cv2.destroyAllWindows() pass def demo4(): # `cv2.resize`是OpenCV库中的一个函数,用于调整图像的大小。这个函数在图像处理中非常常用,特别是在需要对图像进行缩放、放大或缩小以适应不同需求时。 cv2.resize(图片矩阵,(宽,高)) 图像的大小不是窗口的大小 # # 获取图片规格 返回一个元组 为宽和高和通道数 img.shape 返回一个元组(宽,高,通道数) img = cv2.resize(cv2.imread("../../assets/images/car.png"), (100, 100)) cv2.namedWindow("image") cv2.imshow("image", img) cv2.waitKey(0) cv2.destroyAllWindows() shape1=img.shape print(shape1) def circle():# 图像绘制 # 绘制圆形 # cv2.circle()函数用于在图像上绘制圆形。该函数的语法如下: # cv2.circle(img, center, radius, color, thickness) 在img 上面绘制 # img:要绘制圆形的图像。 # center`:圆心的坐标。 # radius`:圆的半径。 # `color`:圆的颜色,通常是一个表示BGR颜色的元组,例如`(255, 0, 0)`表示蓝色。 # thickness`:圆的边界线条的厚度,如果为负值或`cv2.FILLED`,表示填充整个圆。 img=cv2.imread("../../assets/images/car.png") cv2.namedWindow("img") center=(50,50) radius=50 color=(255,0,0) w=5 round1=cv2.circle(img,center=center,radius=radius,color=color,thickness=w) cv2.imshow("img",round1) cv2.waitKey(0) cv2.destroyAllWindows() pass def rectangle(): # 绘制矩形 # cv2.rectangle()`函数用于在图像上绘制矩形。该函数的语法如下: # cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) # - `img`:要绘制矩形的图像。 # - `pt1`:矩形的一个顶点。 # - `pt2`:矩形对角线上的另一个顶点。 # - `color`:矩形的颜色,通常是一个表示BGR颜色的元组,例如`(255, 0, 0)`表示蓝色。 # - `thickness`:矩形边框的厚度,如果为负值或`cv2.FILLED`,表示填充整个矩形内部 img=np.zeros((400,400,3)) cv2.namedWindow("img") rectangle1=cv2.rectangle(img,(50,50),(400,400),color=(255,0,0),thickness=10) cv2.imshow("img",rectangle1) cv2.waitKey(0) cv2.destroyAllWindows() def putText():# 添加文本 # cv2.putText` 是 OpenCV 库中的一个函数,用于在图像上添加文本。这个函数在图像处理和计算机视觉任务中非常有用,特别是在需要标注图像、显示信息或调试时。 # cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]]) """ - img (numpy.ndarray): 输入图像,通常是一个二维或三维的 NumPy 数组。 - text (str): 要添加的文本字符串。 - org (tuple): 文本的起始位置,是一个二元组 `(x, y)`,表示文本左下角的坐标。 - fontFace (int): 字体类型,常见的字体类型包括: - `cv2.FONT_HERSHEY_SIMPLEX`: 正常大小的无衬线字体 - `cv2.FONT_HERSHEY_PLAIN`: 小号的无衬线字体 - `cv2.FONT_HERSHEY_DUPLEX`: 正常大小的无衬线字体,比 `FONT_HERSHEY_SIMPLEX` 更粗 - `cv2.FONT_HERSHEY_COMPLEX`: 正常大小的有衬线字体 - `cv2.FONT_HERSHEY_TRIPLEX`: 正常大小的有衬线字体,比 `FONT_HERSHEY_COMPLEX` 更粗 - `cv2.FONT_HERSHEY_SCRIPT_SIMPLEX`: 手写风格的字体 - `cv2.FONT_HERSHEY_SCRIPT_COMPLEX`: 手写风格的字体,比 `FONT_HERSHEY_SCRIPT_SIMPLEX` 更粗 - `cv2.FONT_ITALIC`: 斜体修饰符,可以与其他字体类型组合使用 - **fontScale** (float): 字体大小的比例因子。 - **color** (tuple): 文本颜色,是一个三元组 `(B, G, R)`,表示蓝色、绿色和红色的值。 - **thickness** (int, 可选): 文本线条的厚度,默认值为 1。 - lineType (int, 可选): 线条类型,常见的线条类型包括: - `cv2.LINE_4`: 4 连通线 - `cv2.LINE_8`: 8 连通线 - `cv2.LINE_AA`: 抗锯齿线(默认值) 返回值 - **img** (numpy.ndarray): 添加文本后的图像。 """ img = cv2.imread("../../assets/images/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 = "../../assets/myfont/simhei.ttf" c_img = put_text(img, "你好世界", c, font_path, 30, color) cv2.imshow("a", c_img) cv2.waitKey(0) cv2.destroyAllWindows() pass def line(): # cv2.line(img, pt1, pt2, color, thickness lineType) -> img # img: 输出图像,即要在这张图上绘制直线的图像。通常是一个 NumPy 数组。 # pt1: 直线的一个端点,是一个包含两个元素(x, y)的元组,代表该点的坐标。 # pt2: 直线的另一个端点,也是一个包含两个元素(x, y)的元组,代表该点的坐标。 # color: 直线的颜色,对于 BGR 图像,这应该是一个包含三个整数的元组,分别对应蓝色、绿色和红色的强度(例如 `(255, 0, 0)` 表示纯蓝色)。对于灰度图像,只需要一个整数值即可。 # thickness: 可选参数,定义直线的宽度。默认值是 1。 img = np.zeros((400, 400, 3)) cv2.namedWindow("img") line1=cv2.line(img,(50,50),(400,400),color=(0,0,255),thickness=10) cv2.imshow("img",line1) cv2.waitKey(0) cv2.destroyAllWindows() pass def mouse(): # 控制鼠标 # cv2.setMouseCallback是 OpenCV 提供的一个非常有用的函数,它允许用户定义一个回调函数,当鼠标事件发生时(如点击、释放、移动等),该回调函数会被调用。这在创建交互式应用程序时特别有用,比如图像标注工具、绘图程序等。 # 事件就是cv2的属性 # 定义窗口 cv2.namedWindow("img",cv2.WINDOW_NORMAL) img = np.zeros((400, 400, 3)) # 执行鼠标操作的回调函数 def draw_test(event,x, y, flag, param): global drawing if event==cv2.EVENT_LBUTTONDOWN: drawing=True elif event == cv2.EVENT_MOUSEMOVE: if drawing: cv2.circle(img, (x, y), 15, (255, 0, 0), -1) elif event == cv2.EVENT_LBUTTONUP: drawing = False cv2.circle(img, (x, y), 15, (255, 0, 0), -1) # draw_test函数: # event`: 鼠标事件类型,如 `cv2.EVENT_LBUTTONDOWN` 表示左键按下。 # x`, `y`: 鼠标事件发生时的坐标。 # flags` 额外的标志位,通常不用。 #`param: 传递给回调函数的参数,通常不用。 # cv2.setMouseCallback('image', draw_test)` 设置鼠标回调函数,当在 'image' 窗口中发生鼠标事件时,调用 `draw_test` 函数 cv2.setMouseCallback("img",draw_test) drawing=False while (True): cv2.imshow('img', img) if cv2.waitKey(20) == 27: # 按ESC退出 break cv2.destroyAllWindows() pass def video(): # cv2.VideoCapture是OpenCV库中的一个类,用于从摄像头或视频文件中捕获视频帧。这个类提供了多种方法来控制视频捕获的过程,包括打开视频文件、读取视频帧、获取视频属性等。 # read()方法用于从视频源中读取下一帧。它返回一个布尔值和图像帧。布尔值表示是否成功读取了帧,图像帧是一个 NumPy 数组。 # release()方法用于释放视频捕获资源。在完成视频处理后,必须调用此方法来释放摄像头或视频文件。 # isOpened()方法用于检查视频捕获对象是否已经成功打开。返回布尔值 # get()和 set()方法用于获取和设置视频捕获属性。常用的属性包括帧宽、帧高、帧率等。 这个传入的参数是cv2的属性 set还要传入int大小 cap=cv2.VideoCapture(0) # 0代表摄像头 可以换成视频路径 实例化视频类 cv2.namedWindow("video",cv2.WINDOW_NORMAL) # 是否成功打开视频对象 cap.isOpened() # 获取帧宽 width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) # 获取帧高 height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # 获取帧率 fps = cap.get(cv2.CAP_PROP_FPS) # 设置帧宽 cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) # 设置帧高 cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) while (True): # # 读取视频,ret 是否读取到,frame: 图片(帧) ret, frame = cap.read() # 循环读取视频 if ret: cv2.imshow("video", frame) if cv2.waitKey(20) == 27: break # 必须调用release 释放资源占用 cap.release() cv2.destroyAllWindows() if __name__=="__main__": # demo1() # demo2() # demo3() # demo4() # circle() # rectangle() putText() # line() # mouse() # video() pass