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

环境安装

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

显示窗口

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

cv2.namedWindow(winname, flags=None)

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

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

常见的标志包括:

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

# 读取图像
image = cv2.imread('images/car.png')

# 创建一个名为 "Image Window" 的窗口,允许调整大小
cv2.namedWindow('Image Window', cv2.WINDOW_NORMAL)

#2 设置名字和窗口大小
cv2.resizeWindow("Image Window",500,300)
# 显示图像
cv2.imshow('Image Window', image)

# 等待用户按键
cv2.waitKey(0)

# 关闭所有窗口
cv2.destroyAllWindows()

读取图像 :

          • image = cv2.imread('path/to/your/image.jpg')
          • 使用   cv2.imread   函数读取图像文件。

创建窗口 :

          • cv2.namedWindow('Image Window', cv2.WINDOW_NORMAL)
          • 使用   cv2.namedWindow   创建一个名为 "Image Window" 的窗口,并设置标志为   cv2.WINDOW_NORMAL  ,允许用户调整窗口大小。

显示图像 :

          • cv2.imshow('Image Window', image)
          • 使用   cv2.imshow   在指定的窗口中显示图像。

等待用户按键 :

          • cv2.waitKey(0)
          • 使用   cv2.waitKey   暂停程序执行,等待用户按键。参数   0   表示无限期等待,直到有按键事件发生。
          • 返回值:是一个ASCII值,

关闭所有窗口 :

          • cv2.destroyAllWindows()
          • 使用   cv2.destroyAllWindows   关闭所有打开的窗口。

其他注意事项

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

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

创建空白图像

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

保存图片

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

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

-  filename  (str): 要保存的文件路径和名称。支持的文件格式包括   .jpg  ,   .png  ,   .bmp  ,   .tiff   等。

-  img  (numpy.ndarray): 要保存的图像。通常是一个二维或三维的 NumPy 数组,表示图像的像素值

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

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

图像切片(裁剪)

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

假设你有一个图像   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)   和   (x+w, y+h)   都在图像的边界内,否则会导致数组索引越界错误。

-  数据类型 :  img   通常是   numpy.ndarray   类型,切片操作返回的也是   numpy.ndarray   类型。

获取图片像素

image.shape

          • (高度,宽度,通道数)

调整图片大小

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

方便OCR文字识别,像素超过OCR文字的阈值,识别不出来,需要图片大小调整

模型训练的像素的大小也会影响模型训练的复杂度

cv2.resize(src, dsize, dst)

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

-  dsize  (tuple): 输出图像的尺寸,是一个二元组   (width, height)  。如果指定了   fx   和   fy  ,则可以忽略此参数。

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): 字体类型,常见的字体类型包括:
            • -   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): 添加文本后的图像。

绘制直线

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.line()   是 OpenCV 库中的一个函数,用于在图像上绘制直线。这个函数非常直观,它接受多个参数来定义直线的位置、颜色、厚度等属性。

控制鼠标

  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()

1.  draw_test函数 :

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

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

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

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

  cv2.setMouseCallback('image', draw_test)   设置鼠标回调函数,当在 'image' 窗口中发生鼠标事件时,调用   draw_circle   函数

视频处理

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

常用方法

read()

          • read()方法用于从视频源中读取下一帧。它返回一个布尔值和图像帧。布尔值表示是否成功读取了帧,图像帧是一个NumPy数组。
          • ret,frame=cap.read()ifnotret:print("Failedtograbframe")break

release()

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

isOpened()

          • isOpened()方法用于检查视频捕获对象是否已经成功打开。
          • ifnotcap.isOpened():print("Erroropeningvideostreamorfile")

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值