当前位置: 首页 > article >正文

人工智能基础 opencv

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它提供了丰富的图像处理和计算机视觉算法,广泛应用于各种领域,如图像处理、视频分析、对象检测、人脸识别、机器学习等。

环境安装:

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

在已有虚拟环境的情况下,打开命令符输入

进入你指定要安装的目录下,输入上面的下载命令。

1.显示窗口

在进行图片操作时,如果导入图片文件,切记不要把.py文件放在图片文件下。

cv2.namedWindow是 OpenCV 库中的一个函数,用于创建一个命名窗口,以便在该窗口中显示图像或进行其他图形操作。

格式:

cv2.namedWindow(winname, flags=None)

参数:

winname:通常是字符串类型,用于表示窗口的名称

flags:窗口的标志,用于设置窗口的行为。默认为cv2.WINDOW_AUTOSIZE。即允许调整窗口大小

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

 设置窗口的大小。

一个窗口显示的基本流程:

(1)读取图片:

函数名为imread,从括号内给定路径读取图片。

(2)创建窗口

(3)显示图像

函数名为imshow;

括号内两个image,一个为窗口名,一个为要显示的图片(前面已经定义过的函数,名字可以自定)

(4)等待按键

括号内的值若为0,即无限期等待,直到有按键时间发生。里面的值为毫秒

也有特殊的值,可以指定为几个特殊的ASCII 值,例如27为Esc键,特定的ASCLL值对应键盘上的键值。

(5)关闭窗口

创建一个空白图像

创建一个黑白图像

RGB 图像可以表示为一个三维矩阵,矩阵的维度为 (height, width, 3),其中 height 是图像的高度,width 是图像的宽度,3 表示三个颜色通道。


2.保存图像

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

cv2.imwrite(filename, img[, params])

参数说明:

filename:为要保存的路径

img:为要保存的图片

3.图像切片

上图为试例。

先将x,y,w,h定义好,在用公式做裁剪;

x:坐标小于图片的宽度

y:坐标小于图片的高度

w:裁剪后的宽度

h:裁剪后的高度

cai_jian = img[y:y+h,x:w+x]#裁剪图片的标注公式

`img[y:y+h, x:x+w]` 提取的是从 `(x, y)` 开始,宽度为 `w`,高度为 `h` 的矩形区域。

4.改变图片大小

`cv2.resize` 是 OpenCV 库中的一个函数,用于调整图像的大小。

调整图片大小的作用:

1.方便OCR文字识别,像素超过OCR的阈值,识别不出来,需要图片大小调整
2.模型训练师,像素的大小也会影响模型训练的复杂度

cv2.resize(src, dsize, dst)

参数:

src:为要调整的图片名

deside:为调整后的图片大小

获取原图片大小:

用shape方法获取图片的数组,通过切片获得。

5.图像绘制

5.1 绘制圆形

cv2.circle(img, center, radius, color, thickness)

参数解释如下:

        img:要绘制圆形的图像。

        center:圆心的坐标。

        radius:圆的半径。

        color:圆的颜色,通常是一个表示BGR颜色的元组,例如(255, 0, 0)表示蓝色。

        thickness:圆的边界线条的厚度,如果为负值或cv2.FILLED,表示填充整个圆。

需要先定义。

5.2 矩形绘制

 cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])

参数:

        `img`:要绘制矩形的图像。
        `pt1`:矩形的一个顶点。

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

5.3 绘制文本

cv2.putText 是 OpenCV 库中的一个函数,用于在图像上添加文本。

cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
image = cv2.imread("images/car.png")

# 定义文本内容和位置
text = "hello world!"
# 文本的左下角位置
position = (50, 200)
# 设置字体类型
font = cv2.FONT_HERSHEY_SIMPLEX
#字体大小
font_scale = 1
#字体颜色
font_color = (0, 255, 0)  
#字体线条的粗细
line_type = 2

# 在图像上绘制文本
cv2.putText(image, text, position, font, font_scale, font_color, line_type)
# 显示图像
cv2.imshow(' Text', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 保存图像(可选)
cv2.imwrite('output_image.png', image)

参数:

  • img (numpy.ndarray): 输入图像,通常是一个二维或三维的 NumPy 数组。

  • text (str): 要添加的文本字符串。

  • org (tuple): 文本的起始位置,是一个二元组 (x, y),表示文本左下角的坐标。

  • fontFace

    (int): 字体类型,常见的字体类型包括:

  • 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): 添加文本后的图像。

5.4 绘制直线

cv2.line(img, pt1, pt2, color, thickness lineType) -> img

参数:

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

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

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

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

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

cv2.line是在原图上操作的。

6.控制鼠标

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

import cv2
#创建鼠标回调函数
def draw_test(event,x,y,flag,param):
    print(x,y)
img =  cv2.imread('images/car.png')
cv2.namedWindow('image')
#设置鼠标回调函数
cv2.setMouseCallback('image', draw_test)
cv2.imshow('image', img)
# 等待用户按键
cv2.waitKey(0)
cv2.destroyAllWindows()

解释:

draw_test函数:

        `event`: 鼠标事件类型,如 `cv2.EVENT_LBUTTONDOWN` 表示左键按下。


        `x`, `y`: 鼠标事件发生时的坐标。


        `flags`: 额外的标志位,通常不用。


       `param`: 传递给回调函数的参数,通常不用。

表示鼠标按下:

event == cv2.EVENT_LBUTTONDOWN:

表示鼠标释放:

event ==cv2.EVENT_RBUTTONUP:

表示鼠标在图像上移动:

event ==cv2.EVENT_MOUSEMOVE:

循环操作,知道停止键。

while True:
    cv2.imshow('name',img)
    if cv2.waitKey(20) == 27:
        break

7.视频处理 

`cv2.VideoCapture` 是 OpenCV 库中的一个类,用于从摄像头或视频文件中捕获视频帧。

方法:

        read()

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

        release()

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

        isOpened()

用于检查视频捕获对象是否已经成功打开。

用于检查,返回故障,正常用不着。

        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)

cv2.VideoCapture():

标准用法:

解决中文乱码

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

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

```
pip install opencv-python pillow
```

2 .下载一个中文字体文件,常见的中文字体文件有 `simhei.ttf`、`simsun.ttc` 等。你可以从系统中找到这些字体文件,或者从互联网下载。

3 .定义 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


http://www.kler.cn/a/375441.html

相关文章:

  • 高级的SQL查询技巧有哪些?
  • 【数据结构练习题】链表与LinkedList
  • Qt Quick:CheckBox 复选框
  • 【Vue.js 3.0】provide 、inject 函数详解
  • day12
  • Redis篇--常见问题篇5--热Key(Hot Key,什么是热Key,服务降级,一致性哈希)
  • 【Orange Pi 5 Linux 5.x 内核编程】-等待队列(WaitQueue)
  • 0xGame 2024 [Week 4] Jenkins
  • 英伟达 GPU 架构:演进与模型推理速度的深度关联
  • 真题与解析 202109二级 青少年软件编程(Python)考级
  • echarts柱状图 x轴显示不完文字的处理方法和有些指标默认不显示的问题
  • 浅谈网络安全
  • Php实现钉钉OA一级审批,二级审批
  • docker Desktop开启远程访问端口
  • java设计模式之创建者模式(5种)
  • Golang | Leetcode Golang题解之第525题连续数组
  • VB中的单元测试(Unit Testing)和集成测试(Integration Testing)
  • 详解CRC校验原理以及FPGA实现
  • nVisual标签打印模块的部署与使用
  • Android Studio中Gradle一直在加载怎么解决(首次安装过程中)
  • Spark_跑批__.checkpoint()为什么比.persist()快
  • TikTok视频上传失败:原因与解决方案
  • 【AI学习】Mamba学习(十四):S5模型的矩阵A对角化
  • 黑龙江某涝区泵闸站自动化、信息化改造项目案例
  • C语言函数嵌套调用
  • 【iOS】使用AFNetworking进行网络请求