OpenCV 学习资料

第一章:OpenCV简介

1.1 什么是OpenCV?

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,由Intel公司于1999年发起,旨在为计算机视觉领域提供丰富的工具和算法。
其设计目标包括以下几点:

  • 提供功能全面、高性能的计算机视觉和图像处理工具。
  • 促进研究成果的快速应用和开发。
  • 通过开源的方式激励社区合作与贡献。

应用领域:

  • 图像处理:包括滤波、特征提取等。
  • 视频分析:如运动检测、目标跟踪。
  • 机器学习:人脸识别、模式分类。
  • 增强现实(AR):如姿态估计。
  • 医学图像分析、工业检测等。

1.2 OpenCV的历史与发展

  • 1999年:OpenCV由Intel发起,主要服务于研究和开发人员。
  • 2006年:第一个公开版本发布,迅速成为最流行的计算机视觉库。
  • 2012年:转交给开源组织OpenCV.org管理,并支持多种平台(Windows、Linux、macOS等)。
  • 2018年至今:引入对深度学习的支持,如通过DNN模块加载TensorFlow和Caffe等预训练模型。

目前,OpenCV版本已发展到4.x,增加了对CUDA、OpenCL等硬件加速的支持。

1.3 为什么选择OpenCV?

OpenCV之所以备受欢迎,是因为其具备以下优势:

  1. 跨平台:支持多种操作系统和开发语言(C++、Python、Java等)。
  2. 功能丰富:涵盖了从基础图像处理到复杂机器学习的工具。
  3. 高效:底层优化使其在CPU和GPU上都具有出色的性能。
  4. 社区活跃:拥有庞大的用户和开发者社区,提供丰富的学习资源。

1.4 安装与配置OpenCV

1.4.1 Windows系统安装

步骤:

  1. 下载 OpenCV安装包。
  2. 安装Python环境(推荐使用Anaconda)。
  3. 通过pip安装:
     

    bash

    pip install opencv-python
    pip install opencv-contrib-python
    

  4. 验证安装:
     

    python

    import cv2
    print(cv2.__version__)
    

1.4.2 Linux系统安装

步骤:

  1. 更新系统包:
     

    bash

    sudo apt update && sudo apt upgrade
    

  2. 安装依赖库:
     

    bash

    sudo apt install python3-opencv
    

  3. 验证安装:
     

    python

    import cv2
    print(cv2.__version__)
    

1.4.3 macOS系统安装

步骤:

  1. 使用Homebrew安装:
     

    bash

    brew install opencv
    

1.5 OpenCV支持的主要开发语言

OpenCV提供了丰富的语言绑定支持:

  • C++:功能最全面,适合性能要求高的项目。
  • Python:简洁易学,适合快速原型开发。
  • Java:主要用于Android平台的应用开发。
  • 其他:如MATLAB、C#,通过第三方库实现支持。

 

 第二章:OpenCV基础知识


2.1 OpenCV中的数据结构和基本概念

2.1.1 Mat对象与图像表示

在OpenCV中,cv::Mat是最重要的数据结构,用于表示图像和多维数组。

Mat的基本结构:

  • 数据部分:存储像素数据。
  • 元信息:包含图像的行数、列数、通道数、数据类型等。

创建Mat对象的常用方法:

  1. 从文件读取图像:
     

    cpp

    cv::Mat img = cv::imread("image.jpg", cv::IMREAD_COLOR);
    

  2. 创建空白图像:
     

    cpp

    cv::Mat blank = cv::Mat::zeros(500, 500, CV_8UC3);
    

  3. 转换数据类型:
     

    cpp

    cv::Mat converted;
    img.convertTo(converted, CV_32F);
    

Mat对象的常用方法:

  • rows:行数
  • cols:列数
  • channels():通道数
  • type():数据类型

Python示例:

 

python

import cv2
import numpy as np

# 创建一个500x500的黑色图像
img = np.zeros((500, 500, 3), dtype=np.uint8)

# 打印图像信息
print(f"Rows: {img.shape[0]}, Cols: {img.shape[1]}, Channels: {img.shape[2]}")

2.1.2 图像的基本操作

  1. 读取图像

    • 读取彩色图像:cv2.IMREAD_COLOR
    • 读取灰度图像:cv2.IMREAD_GRAYSCALE
    • 读取原始图像:cv2.IMREAD_UNCHANGED
     

    python

    img = cv2.imread("image.jpg", cv2.IMREAD_COLOR)
    

  2. 显示图像

     

    python

    cv2.imshow("Display window", img)
    cv2.waitKey(0)  # 按任意键关闭窗口
    cv2.destroyAllWindows()
    

  3. 保存图像

     

    python

    cv2.imwrite("output.jpg", img)
    

  4. 访问像素值

     

    python

    # 访问特定像素
    pixel = img[100, 100]
    print(f"Pixel value: {pixel}")
    
    # 修改像素值
    img[100, 100] = [255, 0, 0]  # 将像素设置为蓝色
    


2.2 OpenCV中的基本绘图函数

OpenCV提供了一组绘图函数,可以直接在图像上绘制线条、形状和文本。

2.2.1 画线

 

python

cv2.line(img, (50, 50), (450, 50), (0, 255, 0), thickness=2)

2.2.2 画矩形

 

python

cv2.rectangle(img, (100, 100), (400, 300), (255, 0, 0), thickness=3)

2.2.3 画圆

 

python

cv2.circle(img, (250, 250), 50, (0, 0, 255), thickness=-1)  # 填充圆

2.2.4 添加文字

 

python

cv2.putText(img, "Hello, OpenCV!", (50, 400), cv2.FONT_HERSHEY_SIMPLEX, 
            fontScale=1, color=(255, 255, 255), thickness=2)

2.3 图像的颜色空间

2.3.1 常见颜色空间

  1. BGR:OpenCV默认的颜色空间。
  2. Gray:灰度图像。
  3. HSV:色调(Hue)、饱和度(Saturation)、亮度(Value)。
  4. Lab:亮度(L)、色差(a、b)。

2.3.2 颜色空间转换

 

python

# BGR转灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# BGR转HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

2.4 图像处理基础

图像处理是OpenCV的核心功能之一,以下介绍一些常用的图像处理操作。

2.4.1 图像平滑与模糊

图像平滑用于减少噪声,使图像更加柔和。常见的平滑方法包括均值滤波、高斯滤波和中值滤波。

1. 均值滤波

通过邻域内像素的平均值替换中心像素值。

 

python

blurred = cv2.blur(img, (5, 5))  # 5x5的卷积核
2. 高斯滤波

使用高斯核对图像进行卷积,平滑效果更自然。

 

python

gaussian = cv2.GaussianBlur(img, (5, 5), sigmaX=0)
3. 中值滤波

使用邻域内像素的中值代替中心像素值,特别适合去除椒盐噪声。

 

python

median = cv2.medianBlur(img, 5)  # 核大小为5

2.4.2 边缘检测

边缘检测用于识别图像中显著的变化区域。

1. Sobel算子

计算图像的一阶或二阶导数,用于检测水平和垂直方向的边缘。

 

python

sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)  # x方向
sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)  # y方向
2. Canny边缘检测

通过计算梯度并应用双阈值筛选来提取图像边缘。

 

python

edges = cv2.Canny(img, threshold1=100, threshold2=200)

2.4.3 形态学操作

形态学操作是基于图像结构元素进行的图像处理技术,常用于去噪、填充小孔等。

1. 腐蚀(Erosion)

通过最小值滤波器缩小白色区域。

 

python

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
eroded = cv2.erode(img, kernel, iterations=1)
2. 膨胀(Dilation)

通过最大值滤波器扩大白色区域。

 

python

dilated = cv2.dilate(img, kernel, iterations=1)
3. 开运算与闭运算
  • 开运算:先腐蚀后膨胀,用于去除小噪点。
  • 闭运算:先膨胀后腐蚀,用于填补小孔。
 

python

opened = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
closed = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

 第三章:OpenCV进阶应用


3.1 特征检测与描述

特征检测是计算机视觉的重要任务,用于识别图像中的关键点,并为关键点生成描述符,便于图像匹配和场景理解。

3.1.1 角点检测

1. Harris角点检测

Harris角点检测通过计算图像梯度的变化,定位角点。

 

python

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
corners = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)
img[corners > 0.01 * corners.max()] = [0, 0, 255]  # 标记角点
2. Shi-Tomasi角点检测

改进版的Harris角点检测,更适合子像素级别的精确检测。

 

python

corners = cv2.goodFeaturesToTrack(gray, maxCorners=100, qualityLevel=0.01, minDistance=10)
for corner in corners:
    x, y = np.int0(corner.ravel())
    cv2.circle(img, (x, y), 5, (0, 255, 0), -1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知智志

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值