OpenCV最详细入门教程

OpenCV简介

OpenCV其实就是一堆C和C++语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。

  • OpenCV的全称是Open Source Computer Vision Library,是一个开放源代码的计算机视觉库
  • OpenCV最初由英特尔公司发起并开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用,现在美国Willow Garage为OpenCV提供主要的支持
  • OpenCV可用于开发实时的图像处理,计算机视觉以及模式识别程序,目前在工业界以及科研领域广泛采用

cv2.namedWindow 是 OpenCV 库中的一个函数,用于创建一个命名窗口,以便在该窗口中显示图像或进行其他图形操作。这个函数在处理图像和视频时非常有用,尤其是在开发基于图像处理的应用程序时。

opencv重要性

  • 计算机视觉:OpenCV 是计算机视觉领域的标准库之一,广泛应用于图像识别、物体检测、人脸识别、手势识别等。
  • 机器人技术:在机器人导航、环境感知和交互中,OpenCV 用于处理传感器数据和视觉信息。
  • 医学影像:在医学影像分析中,OpenCV 用于图像增强、分割和特征提取。
  • 自动驾驶:在自动驾驶汽车中,OpenCV 用于环境感知、障碍物检测和车道线识别。
  • 安全监控:在安全监控系统中,OpenCV 用于运动检测、人脸识别和行为分析。

学习 OpenCV 不仅可以提升你的技术能力,还能为你在计算机视觉和图像处理领域的发展打开更多的门路。无论是学术研究、工业应用还是个人项目,OpenCV 都是一个不可或缺的工具

环境安装

在激活环境中安装opencv:

复制代码
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

显示窗口

函数原型:

复制代码
cv2.namedWindow(winname, flags=None)
  • winname (str): 窗口的名称。这个名称必须是唯一的,因为它是用来标识窗口的。

  • flags(int, 可选): 窗口的标志,用于设置窗口的行为。默认值为cv2.WINDOW_AUTOSIZE

    窗口的标志包括:

    1. cv2.WINDOW_NORMAL: 允许调整窗口大小。

    2. cv2.WINDOW_AUTOSIZE: 窗口大小根据图像大小自动调整,不能手动调整。

其他注意事项

  • 窗口名称:窗口名称必须是唯一的,否则会覆盖已有的同名窗口。

  • 窗口标志:选择合适的窗口标志可以提升用户体验,特别是在需要用户交互的场景中。

创建空白图像

可以使用 np.zeros 函数创建一个全零数组,这个数组可以表示一个空白图像。数组的形状应该符合图像的尺寸和通道数(例如,对于 RGB 图像,形状应为 (height, width, 3)

复制代码
# 创建一个 500x500 像素的空白图像,3 个通道(RGB)
height, width, channels = 500, 500, 3
blank_image = np.zeros((height, width, channels), dtype=np.uint8)

保存图片

函数原型

复制代码
cv2.imwrite(filename, img[, params])

参数说明

  • filename (str): 要保存的文件路径和名称。支持的文件格式包括 .jpg, .png, .bmp, .tiff 等。
  • img (numpy.ndarray): 要保存的图像。通常是一个二维或三维的 NumPy 数组,表示图像的像素值。

返回值

  • bool : 成功保存图像返回 True,否则返回 False

其他注意事项

  • 文件路径:确保提供的文件路径是有效的,如果路径不存在,OpenCV 会尝试创建它,但如果权限不足则会保存失败。

图像切片(裁剪)

语法解释

假设你有一个图像 img,它的类型是 numpy.ndarrayimg[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)(x+w, y+h) 都在图像的边界内,否则会导致数组索引越界错误。
  • 数据类型img 通常是 numpy.ndarray 类型,切片操作返回的也是 numpy.ndarray 类型。

调整图片大小

函数原型

复制代码
cv2.resize(src, dsize, dst)

参数说明

  • src (numpy.ndarray): 输入图像,通常是一个二维或三维的 NumPy 数组。
  • dsize (tuple): 输出图像的尺寸,是一个二元组 (width, height)。如果指定了 fxfy,则可以忽略此参数。

返回值

  • dst (numpy.ndarray): 缩放后的图像。

图像绘制

绘制圆形

cv2.circle()函数用于在图像上绘制圆形。该函数的语法如下:

复制代码
cv2.circle(img, center, radius, color, thickness)

其中,参数解释如下:

  • img:要绘制圆形的图像。
  • center:圆心的坐标。
  • radius:圆的半径。
  • color:圆的颜色,通常是一个表示BGR颜色的元组,例如(255, 0, 0)表示蓝色。
  • thickness:圆的边界线条的厚度,如果为负值或cv2.FILLED,表示填充整个圆。

绘制矩形

cv2.rectangle()`函数用于在图像上绘制矩形。该函数的语法如下:

复制代码
 cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])

其中,参数解释如下:

  • img:要绘制矩形的图像。
  • pt1:矩形的一个顶点。
  • pt2:矩形对角线上的另一个顶点。
  • color:矩形的颜色,通常是一个表示BGR颜色的元组,例如(255, 0, 0)表示蓝色。
  • thickness:矩形边框的厚度,如果为负值或cv2.FILLED,表示填充整个矩形内部。

绘制文本

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): 字体类型,常见的字体类型包括:
  1. cv2.FONT_HERSHEY_SIMPLEX: 正常大小的无衬线字体
  2. cv2.FONT_HERSHEY_PLAIN: 小号的无衬线字体
  3. cv2.FONT_HERSHEY_DUPLEX: 正常大小的无衬线字体,比 FONT_HERSHEY_SIMPLEX 更粗
  4. cv2.FONT_HERSHEY_COMPLEX: 正常大小的有衬线字体
  5. cv2.FONT_HERSHEY_TRIPLEX: 正常大小的有衬线字体,比 FONT_HERSHEY_COMPLEX 更粗
  6. cv2.FONT_HERSHEY_SCRIPT_SIMPLEX: 手写风格的字体
  7. cv2.FONT_HERSHEY_SCRIPT_COMPLEX: 手写风格的字体,比 FONT_HERSHEY_SCRIPT_SIMPLEX 更粗
  8. cv2.FONT_ITALIC: 斜体修饰符,可以与其他字体类型组合使用
  • fontScale (float): 字体大小的比例因子。
  • color (tuple): 文本颜色,是一个三元组 (B, G, R),表示蓝色、绿色和红色的值。
  • thickness (int, 可选): 文本线条的厚度,默认值为 1。
  • lineType(int, 可选): 线条类型,常见的线条类型包括:
  1. cv2.LINE_4: 4 连通线

  2. cv2.LINE_8: 8 连通线

  3. cv2.LINE_AA: 抗锯齿线(默认值)

返回值

  • img (numpy.ndarray): 添加文本后的图像。

绘制直线

函数原型

复制代码
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 : 返回的是经过修改后的图像,实际上就是传入的图像本身,因为 cv2.line() 是直接在原图上操作的。

控制鼠标

cv2.setMouseCallback 是 OpenCV 提供的一个非常有用的函数,它允许用户定义一个回调函数,当鼠标事件发生时(如点击、释放、移动等),该回调函数会被调用。这在创建交互式应用程序时特别有用,比如图像标注工具、绘图程序等。

函数原型

复制代码
draw_test(event,x,y,flag,param)

参数说明

  • event: 鼠标事件类型,如 cv2.EVENT_LBUTTONDOWN 表示左键按下。
  • x, y: 鼠标事件发生时的坐标。
  • flags: 额外的标志位,通常不用。
  • param: 传递给回调函数的参数,通常不用。

视频处理

cv2.VideoCapture 是 OpenCV 库中的一个类,用于从摄像头或视频文件中捕获视频帧。这个类提供了多种方法来控制视频捕获的过程,包括打开视频文件、读取视频帧、获取视频属性等。

常用方法

1.read()

read() 方法用于从视频源中读取下一帧。它返回一个布尔值和图像帧。布尔值表示是否成功读取了帧,图像帧是一个 NumPy 数组。

复制代码
ret, frame = cap.read()
if not ret:
    print("Failed to grab frame")
    break

2.release()

release() 方法用于释放视频捕获资源。在完成视频处理后,必须调用此方法来释放摄像头或视频文件。

复制代码
cap.release()

3.isOpened()

isOpened() 方法用于检查视频捕获对象是否已经成功打开。

复制代码
if not cap.isOpened():
    print("Error opening video stream or file")

4.get()set()

get()set() 方法用于获取和设置视频捕获属性。常用的属性包括帧宽、帧高、帧率等。

复制代码
# 获取帧宽
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)

关于opencv 显示中文乱码问题解决

在使用 OpenCV 的 cv2.putText 函数添加中文时,可能会遇到显示乱码的问题。这是因为 OpenCV 默认使用的字体不支持中文字符。为了在图像上正确显示中文,可以使用 PIL(Pillow)库来处理文本,然后将文本渲染到图像上

  1. 确保你已经安装了 opencv-pythonPillow 库。如果没有安装,可以通过 pip 安装:

注意:如果用的Anaconda ,是包含了这个库,可以不安装

复制代码
pip install opencv-python pillow
  1. 下载一个中文字体文件,常见的中文字体文件有 simhei.ttfsimsun.ttc 等。你可以从系统中找到这些字体文件,或者从互联网下载。

  2. 定义 put_text 函数

    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
相关推荐
奔跑中的小象4 小时前
统信UOS + 天数AI卡部署SGLang服务手册
人工智能·uos·sglang·天数智芯
DevSecOps选型指南4 小时前
中国版Mythos,为何是悬镜安全灵脉CodeAI?
人工智能·安全
Shockang4 小时前
LangGraph 状态机实战
人工智能
刹那芳华19924 小时前
循环神经网络的从零开始实现(RNN)
人工智能·rnn·深度学习
阿童木写作4 小时前
跨境图片翻译工具多合一,批量图片视频字幕翻译加智能抠图
人工智能·python·音视频·语音识别
科技之门4 小时前
AI3D从建模到贴图、绑骨和动画的完整流程怎么做?V2Fun完整工作流指南
人工智能·3d·贴图
宇宙第一小趴菜4 小时前
二、机器学习的应用领域和发展史
人工智能·机器学习
前端开发江鸟4 小时前
我写过 MCP Server,却一直以为 MCP 只有 Tool
人工智能
天国梦5 小时前
自习室智能化升级避坑指南:天学网AI智习室方案实测与选型建议
大数据·人工智能
阿里云云原生5 小时前
可用性从 99.9% 跃升至 99.995%:畅捷通如何用 AI 重塑运维底座?
运维·网络·人工智能