机器视觉认识OpenCV

打印 上一主题 下一主题

主题 858|帖子 858|积分 2574

一、什么是OpenCV

   
     OpenCV    1、绪论

OpenCV(Open Source Computer Vision Library)是一个开源的盘算机视觉和机器学习软件库。它包含了众多关于图像处理和盘算机视觉的通用算法,这些算法可以用于办理各种现实问题,比如人脸识别、物体检测、图像分割、视频分析等。OpenCV 提供了 C++、Python、Java 和 MATLAB 等多种语言的接口,此中 Python 接口由于其简洁性和易用性而特别受接待。
2、关键特性

①丰富的功能‌:

OpenCV 提供了大量的图像处理函数,包括滤波、边缘检测、形态学操作、图像变动、特征检测与匹配、相机标定与三维重建等。
‌②高性能‌:

OpenCV 是用 C++ 编写的,并举行了高度优化,因此在处理大规模图像数据时具有很高的性能。Python 接口通过调用底层的 C++ 实现来保持高效性。
③跨平台‌:

OpenCV 可以在多种操作体系上运行,包括 Windows、Linux、macOS 和 Android 等。
④易于利用‌:

OpenCV 的 Python 接口设计直观,易于学习和利用。同时,OpenCV 还提供了具体的文档和丰富的教程资源。
‌⑤社区支持‌:

OpenCV 拥有一个活泼的社区,用户可以在论坛、GitHub 和 Stack Overflow 等平台上寻求资助和分享经验。
3、用途

①图像处理‌:

OpenCV 可以用于图像的滤波、去噪、增强、变动等操作,以改善图像的质量或提取有用的信息。
②物体检测与识别‌:

利用 OpenCV 提供的特征检测器(如 SIFT、SURF、ORB 等)和机器学习算法(如 SVM、随机森林等),可以实现物体的检测和识别。
‌③视频分析‌:

OpenCV 支持视频捕捉、处理和分析,可以用于视频跟踪、运动检测、背景减除等任务。
④人脸识别‌:

OpenCV 提供了多种人脸识别算法,如 Eigenfaces、Fisherfaces、LBPH(Local Binary Patterns Histograms)等,可以用于人脸检测、识别和验证。
⑤三维重建‌:

通过相机标定和立体视觉技术,OpenCV 可以实现三维场景的重建和测量。
‌⑥增强现实(AR)‌:

OpenCV 可以与盘算机图形学库结合利用,实现增强现实应用,如在真实场景中叠加虚拟对象。
4、常用函数

①imshow()


  1. @_typing.overload
  2. def imshow(winname: str, mat: cv2.typing.MatLike) -> None: ...
  3. @_typing.overload
  4. def imshow(winname: str, mat: cv2.cuda.GpuMat) -> None: ...
  5. @_typing.overload
  6. def imshow(winname: str, mat: UMat) -> None: ...
复制代码
  功能:一个窗口中体现由 cv2.imread() 或其他图像处理函数生成的图像
  参数
  

  • winname: 窗口的名字。这是一个字符串,用于标识体现图像的窗口。假如指定的窗口名不存在,OpenCV 会主动创建一个新窗口。假如窗口名已经存在,图像会在已有的窗口中体现。
  • mat: 要体现的图像。这是一个包含图像数据的 NumPy 数组,通常是由 cv2.imread() 或其他图像处理函数生成的。
  示例: 
  1. img = cv2.imread("flower.png")
  2. cv2.imshow("Image Window", img)
  3. cv2.waitKey(0)
  4. cv2.destroyAllWindows()
复制代码
 

②rectangle()

  1. @_typing.overload
  2. def rectangle(img: cv2.typing.MatLike, pt1: cv2.typing.Point, pt2: cv2.typing.Point, color: cv2.typing.Scalar, thickness: int = ..., lineType: int = ..., shift: int = ...) -> cv2.typing.MatLike: ...
  3. @_typing.overload
  4. def rectangle(img: UMat, pt1: cv2.typing.Point, pt2: cv2.typing.Point, color: cv2.typing.Scalar, thickness: int = ..., lineType: int = ..., shift: int = ...) -> UMat: ...
  5. @_typing.overload
  6. def rectangle(img: cv2.typing.MatLike, rec: cv2.typing.Rect, color: cv2.typing.Scalar, thickness: int = ..., lineType: int = ..., shift: int = ...) -> cv2.typing.MatLike: ...
  7. @_typing.overload
  8. def rectangle(img: UMat, rec: cv2.typing.Rect, color: cv2.typing.Scalar, thickness: int = ..., lineType: int = ..., shift: int = ...) -> UMat: ...
复制代码
  功能:用于在图像上绘制矩形的函数
  参数:
  

  • img: 这是要绘制矩形的图像,它是一个包含图像数据的 NumPy 数组。
  • pt1: 矩形的一个顶点坐标,通常是一个元组 (x, y),表示矩形左上角的坐标。
  • pt2: 矩形的对角顶点坐标,也是一个元组 (x, y),表示矩形右下角的坐标。
  • color: 矩形的颜色,通常是一个 BGR(蓝、绿、红)颜色值的三元组 (b, g, r)。注意,OpenCV 利用 BGR 而不是 RGB 颜色空间。
  • thickness: 矩形边框的粗细。假如设置为 -1,则表示添补整个矩形地区。
  • lineType: 线条的类型,比方 cv2.LINE_8(8-连通线),cv2.LINE_4(4-连通线),或 cv2.FILLED(添补矩形)。默认情况下,它是 cv2.LINE_8。
  • shift: 点坐标的小数位数。默认值是 0。 
   示例:
  1. img = cv2.imread("flower.png")
  2. cv2.rectangle(img, (50, 50), (200, 200), (0, 255, 0), 2)
  3. cv2.imshow("Rectangle", img)
  4. cv2.waitKey(0)
  5. cv2.destroyAllWindows()
复制代码
 

③waitKey() 


  1. def waitKey(delay: int = ...) -> int: ...
复制代码
  功能:用于等候用户按键事件
  参数:
  

  • delay: 等候的时间(以毫秒为单位)。假如设置为 0,则表示无限期等候,直到用户按下一个键。假如设置为一个正数,比如 1000,则表示等候 1000 毫秒(即 1 秒),假如在这段时间内用户没有按键,则继承执行后续代码。
  函数返回值:
  

  • cv2.waitKey() 返回一个整数,表示用户按下的键的 ASCII 码。假如用户在指定的等候时间内没有按下任何键,则返回 -1。
   示例:
  1. img = cv2.imread("flower.png")
  2. cv2.imshow("Image", img)
  3. # 等待按键
  4. key = cv2.waitKey(0)
  5. if key == ord('q'):  # 按 'q' 键退出
  6.     print("Quit")
  7. cv2.destroyAllWindows()
复制代码
 

二、灰度化

1、绪论

灰度图:单通道图,每个像素点只存一个像素值,图像整体体现为灰色,从0-255体现为从黑到白的过程。
2、灰度化的三种方法

①加权均值法:

对于彩色图像的每个像素【每个像素包含 RGB三通道】,它会按照一定的权重去乘以每个通道的像素值,并将其相加,得到末了的值就是灰度图像中对应位置的像素值,权重的比例为: R乘以0.299,G乘以0.587,B乘以0.114。
例:
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. img = plt.imread("./flower.png")
  4. img_gray = np.zeros_like(img)
  5. # 使用加权均值法进行灰度化
  6. for i in range(img_gray.shape[0]):
  7.     for j in range(img_gray.shape[1]):
  8.         img_gray[i, j, :] = (img[i, j, 0]*0.299 + img[i, j, 1]*0.587 + img[i, j, 2]*0.114)
  9. plt.subplot(121)
  10. plt.imshow(img)
  11. plt.subplot(122)
  12. plt.imshow(img_gray)
  13. plt.tight_layout()
  14. plt.show()
复制代码

②平均值法:

对于彩色图像的每个像素,它会将R、G、B三个通道的像素值全部加起来,然后再除以三,得到的平均值就是灰度图像中对应位置的像素值。
例:
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. img = plt.imread("./flower.png")
  4. img_gray = np.zeros_like(img)
  5. # 使用平均值法进行灰度化
  6. for i in range(img_gray.shape[0]):
  7.     for j in range(img_gray.shape[1]):
  8.         img_gray[i, j, :] = (img[i, j, 0] + img[i, j, 1] + img[i, j, 2]) / 3
  9. plt.subplot(121)
  10. plt.imshow(img)
  11. plt.subplot(122)
  12. plt.imshow(img_gray)
  13. plt.tight_layout()
  14. plt.show()
复制代码

③最大值法:

对于彩色图像的每个像素,它会从R、G、B三个通道的值中选出最大的一个,并将其作为灰度图像中对应位置的像素值。
例:
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. img = plt.imread("./flower.png")
  4. img_gray = np.zeros_like(img)
  5. # 使用最大值法进行灰度化
  6. for i in range(img_gray.shape[0]):
  7.     for j in range(img_gray.shape[1]):
  8.         img_gray[i, j, :] = max(img[i, j, 0] , img[i, j, 1] , img[i, j, 2])
  9. plt.subplot(121)
  10. plt.imshow(img)
  11. plt.subplot(122)
  12. plt.imshow(img_gray)
  13. plt.tight_layout()
  14. plt.show()
复制代码

3、常用函数


①imread()

  1. @_typing.overload
  2. def imread(filename: str, flags: int = ...) -> cv2.typing.MatLike: ...
  3. @_typing.overload
  4. def imread(filename: str, dst: cv2.typing.MatLike | None = ..., flags: int = ...) -> cv2.typing.MatLike: ...
  5. @_typing.overload
  6. def imread(filename: str, dst: UMat | None = ..., flags: int = ...) -> UMat: ...
复制代码
  功能:用于读取图像文件的一个函数
  参数:
  

  • filePath: 要读取的图像文件的路径。
  • flags: 读取图像的方式(可选参数)。
  常用值:
  
  
  

  • cv2.IMREAD_COLOR: 读取彩色图像。图像的透明度会被忽略(默认设置)。
  • cv2.IMREAD_GRAYSCALE: 以灰度模式读取图像。返回的是一个单通道图像。
  • cv2.IMREAD_UNCHANGED: 包括 alpha 通道的方式读取图像。这对于读取 PNG 或 JPEG 图像中的透明度信息很有用。
  例:
  1. import cv2
  2. # 读取彩色图像
  3. img = cv2.imread('./flower.png', cv2.IMREAD_COLOR)
  4. # 检查是否加载成功
  5. if img is None:
  6.     print("图像加载失败!")
  7. else:
  8.     print(f"图像形状: {img.shape}")  # 输出图像尺寸
  9.     cv2.imshow('Image', img)  # 显示图像
  10.     cv2.waitKey(0)
  11.     cv2.destroyAllWindows()
复制代码
 

②cvtColor()


  1. @_typing.overload
  2. def cvtColor(src: cv2.typing.MatLike, code: int, dst: cv2.typing.MatLike | None = ..., dstCn: int = ...) -> cv2.typing.MatLike: ...
  3. @_typing.overload
  4. def cvtColor(src: UMat, code: int, dst: UMat | None = ..., dstCn: int = ...) -> UMat: ...
复制代码
  功能:用于转换图像从一个颜色空间到另一个颜色空间
  参数:
  

  • src: 输入图像,这是一个包含图像数据的 NumPy 数组。
  • code: 用于指定颜色空间转换的代码,它是一个整数标识符,表示源颜色空间和目标颜色空间之间的转换。OpenCV 提供了多种转换代码,如 cv2.COLOR_BGR2GRAY(从 BGR 转换到灰度图),cv2.COLOR_RGB2HSV(从 RGB 转换到 HSV),等等。
  • dst: 输出图像,与输入图像具有相同的大小和深度。这是一个可选参数,假如不提供,函数会创建一个新的图像来存储转换效果。
  • flags: 一个可选的标志,用于指定颜色转换的一些特定选项。在大多数情况下,这个参数可以省略,由于它有默认值。
  函数返回值:
  

  • dst: 转换后的图像,这是一个包含新颜色空间图像数据的 NumPy 数组。
  例: 
  1. import cv2
  2. # 读取彩色图像
  3. img = cv2.imread('./flower.png')
  4. # 转换为灰度图像
  5. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  6. # 转换为 HSV 色彩空间
  7. hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
  8. cv2.imshow('Gray Image', gray)  # 显示灰度图
  9. cv2.imshow('HSV Image', hsv)    # 显示 HSV 图
  10. cv2.waitKey(0)
  11. cv2.destroyAllWindows()
复制代码
 

三、二值化函数 cv2.threshold()

二值化是图像处理中的常见操作,用于将图像转化为只有两种像素值(通常是 0 和 255)的图像,常用于边缘检测、外形检测等。
1、功能

cv2.threshold() 用于将灰度图像的像素值根据设定的阈值举行二值化处理:


  • 假如像素值高于阈值,则设置为最大值。
  • 假如像素值低于阈值,则设置为 0。
2、参数

  1. cv2.threshold(src, thresh, maxval, type)
复制代码


  • src:输入图像,必须是单通道图像(灰度图像)。
  • thresh:阈值,像素值高于该阈值的部分会被设置为 maxval。
  • maxval:最大值(通常为 255),像素值满足条件时设置为该值。
  • type:二值化方法(标志位),常见取值:
                ①cv2.THRESH_BINARY:大于阈值的像素设置为 maxval,别的设置为 0。
                ②cv2.THRESH_BINARY_INV:小于等于阈值的像素设置为 maxval,别的设置为 0。
                ③cv2.THRESH_TRUNC:大于阈值的像素设置为阈值,别的保持不变。
                ④cv2.THRESH_TOZERO:小于等于阈值的像素设置为 0,别的保持不变。
                ⑤cv2.THRESH_TOZERO_INV:大于阈值的像素设置为 0,别的保持不变。
3、返回值

函数返回两个值:


  • retval:现实利用的阈值(通常与 thresh 参数相同)。
  • dst:二值化后的图像。
4、应用

二值化可以用于:


  • 去除图像中的背景信息,只保留前景。
  • 提取感兴趣的地区或外形。
  • 预备数据用于表面检测、OCR 等任务。
5、示例代码:
 


  1. import cv2
  2. # 读取原始图像
  3. img = cv2.imread('sadp.jpg')
  4. # 转换为灰度图像
  5. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  6. # 应用二值化操作
  7. thresh = 127  # 阈值
  8. maxval = 255  # 最大值
  9. # 各种二值化类型
  10. _, binary = cv2.threshold(gray, thresh, maxval, cv2.THRESH_BINARY)
  11. _, binary_inv = cv2.threshold(gray, thresh, maxval, cv2.THRESH_BINARY_INV)
  12. _, trunc = cv2.threshold(gray, thresh, maxval, cv2.THRESH_TRUNC)
  13. _, tozero = cv2.threshold(gray, thresh, maxval, cv2.THRESH_TOZERO)
  14. _, tozero_inv = cv2.threshold(gray, thresh, maxval, cv2.THRESH_TOZERO_INV)
  15. # 显示结果
  16. cv2.imshow('Original', img)
  17. cv2.imshow('Gray', gray)
  18. cv2.imshow('Binary', binary)
  19. cv2.imshow('Binary Inv', binary_inv)
  20. cv2.imshow('Trunc', trunc)
  21. cv2.imshow('Tozero', tozero)
  22. cv2.imshow('Tozero Inv', tozero_inv)
  23. # 等待按键退出
  24. cv2.waitKey(0)
  25. cv2.destroyAllWindows()
复制代码

四、自顺应二值化函数

1、功能

cv2.adaptiveThreshold() 根据图像的局部特性动态盘算阈值,并将图像二值化。


  • 实用于光照不均或对比度变化较大的图像。
  • 每个像素的阈值是根据它所在的邻域盘算得出,而不是全局固定的阈值。
2、参数

  1. cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
复制代码
①src:

输入图像,必须是灰度图像。
②maxValue:

最大值(通常为 255),用于将满足条件的像素设置为此值。
③adaptiveMethod:

自顺应方法,用于盘算局部阈值的方式:


  • cv2.ADAPTIVE_THRESH_MEAN_C:像素邻域的平均值减去常量 C。
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:像素邻域的加权平均值减去常量 C,权重是高斯窗口。
④thresholdType:

二值化类型,通常为 cv2.THRESH_BINARY 或 cv2.THRESH_BINARY_INV。
⑤blockSize:

邻域大小,用于盘算阈值的地区,必须是奇数(如 3, 5, 7)。
⑥C:

常量,阈值减去此值后再比力。用于微调效果,正值会低沉阈值,负值会提高阈值。
3、返回值

返回二值化后的图像,类型与输入图像相同。
4、应用



  • 实用于处理光照不匀称的图像。
  • 常用于图像中的文字检测和分割(OCR 前处理)。
  • 对背景复杂的图像举行二值化。
五、腐蚀函数

1、功能

cv2.erode() 实现图像的腐蚀操作:


  • 腐蚀的过程是利用一个布局元素在图像上滑动,对于前景像素:
               ①假如布局元素内的所有像素都为前景像素,则保持当前像素不变;
               ②假如有任何一个像素不是前景像素,则将该像素腐蚀为背景像素。


  • 效果类似于“腐蚀”,使前景物体变小。
2、参数

  1. cv2.erode(src, kernel, dst=None, anchor=None, iterations=1, borderType=None, borderValue=None)
复制代码
①src:

输入图像,可以是二值图像或灰度图像。
②kernel:



  • 腐蚀操作的布局元素(即卷积核)。
  • 利用 cv2.getStructuringElement() 生成,或直接传入自界说的 NumPy 数组。
③dst:

输出图像,与输入图像的大小和类型相同(可选)。
④anchor:

锚点位置,默认为核的中心点。
⑤iterations:

腐蚀操作的次数,默认为 1。
⑥borderType:

边界模式,用于指定图像边界的添补方式(默认为 cv2.BORDER_CONSTANT)。
⑦borderValue:

当 borderType=BORDER_CONSTANT 时利用的边界添补值。
3、返回值

返回腐蚀处理后的图像,与输入图像大小相同。
4、应用

腐蚀操作的范例用途包括:
①去除噪点:

清理图像中的小噪点。
②分割物体:

分离连接在一起的物体。
③处理外形:

改变图像中的外形(如镌汰边缘的不规则性)。
六、膨胀函数

1、功能

cv2.dilate() 实现图像的膨胀操作:
①膨胀的效果:

将图像中的前景地区“扩展”。
②原理:

利用一个布局元素(kernel)在图像上滑动,卷积核覆盖的地区内只要有一个前景像素,则中心像素被设置为前景像素。
2、参数

  1. cv2.dilate(src, kernel, dst=None, anchor=None, iterations=1, borderType=None, borderValue=None)
复制代码
 
①src:

输入图像,可以是二值图像或灰度图像。
②kernel:



  • 布局元素(卷积核),用于决定膨胀的外形和范围。
  • 利用 cv2.getStructuringElement() 创建,也可以直接传入 NumPy 数组。
③dst:

输出图像,与输入图像大小和类型相同(可选)。
④anchor:

锚点位置,决定核的基准点,默认是核的中心。
⑤iterations:

膨胀操作的次数,默认为 1。
⑥borderType:

边界模式,指定图像边界的添补方式(默认为 cv2.BORDER_CONSTANT)。
⑦borderValue:

当 borderType=BORDER_CONSTANT 时利用的边界添补值。
3、返回值

返回膨胀处理后的图像,与输入图像大小相同。
4、应用

膨胀操作的常见用途包括:
①弥补空洞:

将图像中的前景地区变大,弥补小孔或断裂部分。
②连接断裂部分:

连接本来不连续的前景地区。
③增强目标:

扩大前景地区的尺寸,使目标更加明显。
④形态学运算:

与腐蚀结合,用于形态学的开运算和闭运算。
七、仿射变动函数

1、功能

仿射变动是一种二维图像多少变动,包括平移、旋转、缩放、剪切等操作。它保持直线和比例不变,即图像中所有的直线仍然保持直线,且平行线依然平行。
OpenCV 的 cv2.warpAffine() 函数实现了仿射变动,基于输入的 2x3 变动矩阵,将输入图像映射到输出图像。
2、参数

  1. cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
复制代码
①src:

输入图像。
②M:

仿射变动矩阵,大小为 2x3,由用户盘算或通过 OpenCV 函数生成。
③dsize:

输出图像的尺寸(宽度,高度)。
④dst:

输出图像,与输入图像类型相同(可选)。
⑤flags:

插值方法:


  • cv2.INTER_NEAREST:迩来邻插值。
  • cv2.INTER_LINEAR(默认):双线性插值。
  • cv2.INTER_CUBIC:三次插值,效果更好但速率较慢。
⑥borderMode:

外部像素添补方式:


  • cv2.BORDER_CONSTANT(默认):添补为常量。
  • cv2.BORDER_REFLECT:边界镜像反射。
  • cv2.BORDER_WRAP:边界循环。
⑦borderValue:

当 borderMode=cv2.BORDER_CONSTANT 时利用的添补值。
3、返回值

返回仿射变动后的图像。
4、应用

仿射变动在图像处理中的范例应用包括:
①旋转:

改变图像的方向。
②平移:

将图像移动到指定位置。
③缩放:

改变图像的尺寸比例。
④剪切:

改变图像的外形,使矩形变成平行四边形。
⑤图像增强:

调整图像的视角。
八、透视变动函数

1、功能

透视变动是一种多少变动,可以将二维平面上的图像映射到另一个平面,而且可以或许改变图像的透视关系。它与仿射变动不同,可以处理非平行的直线,使矩形映射为任意四边形或反之。
在 OpenCV 中,透视变动通过函数 cv2.warpPerspective() 实现。
2、参数

  1. cv2.warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
复制代码
①src:

输入图像。
②M:

透视变动矩阵,大小为 3x3,可以利用 cv2.getPerspectiveTransform() 或 cv2.findHomography() 生成。
③dsize:

输出图像的尺寸(宽度,高度)。
④dst:

输出图像,与输入图像类型相同(可选)。
⑤flags:

插值方法,常用值:


  • cv2.INTER_NEAREST:迩来邻插值。
  • cv2.INTER_LINEAR(默认):双线性插值。
  • cv2.INTER_CUBIC:三次插值,效果更好但速率较慢。
⑥borderMode:

边界添补方式:


  • cv2.BORDER_CONSTANT(默认):添补为常量。
  • cv2.BORDER_REFLECT:边界镜像反射。
  • cv2.BORDER_WRAP:边界循环。
⑦borderValue:

当 borderMode=cv2.BORDER_CONSTANT 时利用的边界添补值。
3、返回值

返回透视变动后的图像。
4、应用

透视变动的范例应用包括:
①图像矫正:

比方,将拍摄的册本、文件矫正为直视视角。
②提取局部地区:

从图像中提取四边形地区。
③视角调整:

改变图像的透视效果,模仿从不同视角观看图像。
④拼接图像:

在拼接图像中,校正视角差异。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表