Bootstrap

人工智能之Opencv(小白初学版)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文正式开始人工智能的学习,经过前期对python的基础学习,为了之后人工智能更好的发展,同样作为小白的新手伙伴可以翻看我之前的笔记,一起讨论相关的知识点!!

一、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 都是一个不可或缺的工具

环境安装

我们应该明白环境设置为虚拟环境:
首先安装Anaconda后打开
在这里插入图片描述
创建虚拟环境输入conda create name myenv python-3.8
然后输入 activate myopencv进入虚拟环境
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple 进行成功安装后
在python界面创立新的项目,选取新的解释器,有需要回顾的可以参照我第一篇关于python安装的笔记

二、显示窗口

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

  • winname (str): 窗口的名称。这个名称必须是唯一的,因为它是用来标识窗口的。

  • flags (int, 可选): 窗口的标志,用于设置窗口的行为。默认值为
    在这里插入图片描述
    常见的标志包括:

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

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

  • 相关属性使用:

  • 在这里插入图片描述
    -在这里插入图片描述在这个地方需要注意是如果要将 image = cv2.imread(“images/car.png”)如果改换了图片的路径,并且是以中文命名,cv2不支持中文包括参数则会进行报错。
    第二种情况是遇到"\t“等转义字符也会导致错误当然可以加一个"r"进行转义
    这里提到了三个函数,cv2.imshow():主要是用来显示图像的
    cv2.namedWindonw():用来创建窗口并设置窗口属性
    cv2.resizewindow():专门用来改变窗口的大小
    都是关于处理图像显示窗口的

这里还提到了ASCII值,设置关于每个键的ASCII可以进行设置终止程序。

创建空白图像

你可以使用 np.zeros 函数创建一个全零数组,这个数组可以表示一个空白图像。数组的形状应该符合图像的尺寸和通道数(例如,对于 RGB 图像,形状应为 (height, width, 3)
函数写法进行举例:
在这里插入图片描述
cv2.waitKey(0):

在这里插入图片描述
cv2.dertroyAllwindows()

在这里插入图片描述
在这里插入图片描述

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。

3、图像保存

cv2.imwrite` 是 OpenCV 库中的一个函数,用于将图像保存到文件中。这个函数在图像处理和计算机视觉任务中非常常用,特别是在需要将处理后的图像结果保存到磁盘时。
参数说明

  • filename (str): 要保存的文件路径和名称。支持的文件格式包括 .**jpg, .png, .bmp, .tiff** 等。
  • img (numpy.ndarray): 要保存的图像。通常是一个二维或三维的 NumPy 数组,表示图像的像素值。
    返回值
  • bool: 成功保存图像返回 True,否则返回 False
    在这里插入图片描述

4、图像裁剪

在 OpenCV 中,图像切片用于从图像中提取一个子区域(矩形区域)。这种操作在图像处理中非常常见,特别是在进行目标检测、ROI(Region of Interest,感兴趣区域)提取等任务时。

语法解释
假设你有一个图像 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 类型。

5、 调整图片大小

cv2.resize 是 OpenCV 库中的一个函数,用于调整图像的大小。这个函数在图像处理中非常常用,特别是在需要对图像进行缩放、放大或缩小以适应不同需求时。

作用于方便ORC文字图片识别,像素超过ORC文字的阈值,识别不出,需要图片大小进行调整
更为后面学习模型训练 有着相关的调节
在这里插入图片描述

在这里插入图片描述

6 图像绘制

绘制圆形

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
在这里插入图片描述
在这里需要补充两点,可以在将img进行导入后,生成条件语句,如果判断错误和正确。
第二点就是关于imshow中第一个参数是窗口名,需要统一,第二个是数组参数,第一个我输入的时候没有按c_img进行输入,但是最后的结果都是正确的,这里我们应该理解成了关键字传参img=c_img,按照规范书写还是应该c_img。

矩形

cv2.rectangle()`函数用于在图像上绘制矩形。该函数的语法如下:
在这里插入图片描述
其中,参数解释如下:

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

绘制图片文字

cv2.putText 是 OpenCV 库中的一个函数,用于在图像上添加文本。这个函数在图像处理和计算机视觉任务中非常有用,特别是在需要标注图像、显示信息或调试时。
参数说明

  • 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): 添加文本后的图像
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

有几点要说明,此代码最后输入参数还没有输入完整,需要注意的是要安装PIL库,不然就按我最上面的步骤进行安装(进入虚拟环境、安装相关插件)
这里有提到颜色需要找到BGR(蓝绿红)顺序
在这里插入图片描述

绘制直线

在这里插入图片描述

参数说明

  • img: 输出图像,即要在这张图上绘制直线的图像。通常是一个 NumPy 数组。

  • pt1: 直线的一个端点,是一个包含两个元素(x, y)的元组,代表该点的坐标。

  • pt2: 直线的另一个端点,也是一个包含两个元素(x, y)的元组,代表该点的坐标。

  • color: 直线的颜色,对于 BGR 图像,这应该是一个包含三个整数的元组,分别对应蓝色、绿色和红色的强度(例如 (255, 0, 0) 表示纯蓝色)。对于灰度图像,只需要一个整数值即可。

  • thickness: 可选参数,定义直线的宽度。默认值是 1。

返回值

  • img: 返回的是经过修改后的图像,实际上就是传入的图像本身,因为 cv2.line() 是直接在原图上操作的。

cv2.line() 是 OpenCV 库中的一个函数,用于在图像上绘制直线。这个函数非常直观,它接受多个参数来定义直线的位置、颜色、厚度等属性。以下是 cv2.line() 函数的基本语法及其参数说明
在这里插入图片描述

控制鼠标、鼠标事件

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

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

cv2.setMouseCallback('image', draw_test) 设置鼠标回调函数,当在 ‘image’ 窗口中发生鼠标事件时,调用 draw_circle 函数
在这里插入图片描述
鼠标所对应的相关参数
在这里插入图片描述
在这里插入图片描述
鼠标事件的相关代码和运行结果
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这里需要注意关于鼠标滑动、释放和其他相关的命名,还有全局变量的定义要首先进行。

视频处理

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

  1. read()`

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

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

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

get()set() 方法用于获取和设置视频捕获属性。常用的属性包括帧宽、帧高、帧率等。
在这里插入图片描述
可执行代码
参数太多的情况下需要记忆,相关练习在后面笔记进行分享。

;