【Python】OpenCV 详解入门教程

一、OpenCV的概述

        OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它提供了从基本操作到复杂算法的广泛工具集。无论你是图像处理的新手还是希望提升技能的专业人士,OpenCV都能成为你的强大助手。OpenCV是一个跨平台的库,它实现了多种编程语言的接口,包括Python。它被广泛用于实时图像处理、对象检测、人脸识别、视频分析等领域。使用OpenCV,我们可以轻松地读取、处理和保存图像,以及执行复杂的图像分析任务。

        OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。

         在计算机视觉项目的开发中,OpenCV作为较大众的开源库,拥有了丰富的常用图像处理函数库,采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上,能够快速的实现一些图像处理和识别的任务。此外,OpenCV还提供了Java、python、cuda等的使用接口、机器学习的基础算法调用,从而使得图像处理和图像分析变得更加易于上手,让开发人员更多的精力花在算法的设计上。

1.1 关键特性

​多平台支持:可运行于 Windows、Linux、MacOS 等多个平台。
丰富的功能:提供了图像处理、视频处理、特征提取、目标检测等强大功能。
高度优化:性能卓越,适用于实时计算机视觉任务。
​

1.2 适用场景

图像识别(如人脸识别)
视频分析(如运动目标跟踪)
机器学习(如分类和聚类)

1.3 计算机视觉领域方向

1、人机互动
2、物体识别
3、图像分割
4、人脸识别
5、动作识别
6、运动跟踪
7、机器人
8、运动分析
9、机器视觉
10、结构分析
11、汽车安全驾驶

二、OpenCV-Python

2.1 概述

OpenCV-Python是一个用于解决计算机视觉问题的Python绑定库。

Python是由Guido van Rossum开发的一种通用编程语言,由于其简单性和代码可读性,它很快就变得非常流行。它使程序员能够在不降低可读性的情况下用更少的代码行来表达思想。与C/ c++这样的语言相比,Python要慢一些。也就是说,使用C/ c++可以轻松地扩展Python,这允许我们用C/ c++编写计算密集型代码,并创建可以用作Python模块的Python包装器。这给了我们两个好处:首先,代码和原始的C/ c++代码一样快(因为它是在后台工作的实际c++代码);其次,用Python编写代码比用C/ c++更容易。

OpenCV-Python是原始OpenCV c++实现的Python包装器。

OpenCV-Python使用Numpy,它是一个高度优化的库,用于使用matlab风格的语法进行数值操作。所有的OpenCV数组结构都被转换为Numpy数组和从Numpy数组转换而来。这也使得与其他使用Numpy(如SciPy和Matplotlib)的库集成更加容易。

因为OpenCV依赖一些库,如Numpy方法等,安装OpenCV之前需要先安装numpymatplotlib

2.2 环境要求

在安装OpenCV之前,确保您的Python环境已正确设置。

OpenCV支持Python 3.x版本,并且需要在您的机器上安装Python和pip。

Python3.x版本安装或您的Python环境存在问题,可以尝试在虚拟环境中安装OpenCV。 

创建和使用虚拟环境
虚拟环境是一个独立于系统Python环境的空间,可以在其中安装和管理Python包。
按照以下步骤创建和使用虚拟环境:
 
创建虚拟环境:
 
bash:python3 -m venv myenv
这将在当前目录下创建一个名为myenv的虚拟环境。
 
激活虚拟环境:
 
在 Linux 或 MacOS 上:
 
bash:source myenv/bin/activate
 
在 Windows 上:
 
bash:myenv\Scripts\activate
当虚拟环境激活后,终端提示符会显示为(myenv),表示你现在在虚拟环境中工作。
 
在虚拟环境中安装Selenium:
 
确保在虚拟环境中后,使用普通的pip命令来安装Selenium:
 
bash:pip install selenium
 
 
每次起虚拟环境 进行跑 

Python:确保已安装Python 3.x版本。

可以通过在命令行输入以下命令检查:

python --version
或
python3.12 --version

pip是Python的包管理工具。

它通常与Python一起安装,但如果没有安装pip,可以通过以下命令安装:

python -m ensurepip --upgrade

查看pip的版本号

pip --version

2.3 pip 安装

安装opencv-python

pip3 install opencv-python

安装opencv-contrib-python(可选) 

如果我们要利用SIFT和SURF等进行特征提取或支持contrib模块,需要安装完整版

pip3 install opencv-contrib-python
或(指定版本号)
pip3 install opencv-contrib-python==3.4.2.17

2.4 核心模块和服务器区别

pip install opencv-python (提供核心模块)

pip install opencv-python-headless (适合无图形界面(如服务器环境))

2.5 验证安装 

安装完成后,可以通过在Python中导入OpenCV库来验证安装是否成功。 

在Python交互式命令行或脚本中输入以下命令: 

import cv2
print(cv2.__version__)

注意:安装的时候是 opencv_python,但在导入的时候采用 import cv2。 

     如果输出OpenCV的版本号,说明安装成功。

    三、OpenCV 的基本用法

    3.1 读取和显示图像

    import cv2
    # 读取图像
    image = cv2.imread('image.jpg')
    # 显示图像
    cv2.imshow('Image', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    说明:

    • cv2.imread 函数用于读取图像。

    • cv2.imshow 函数用于显示图像。

    • cv2.waitKey(0) 使得窗口等待直到用户按下任意键。

    • cv2.destroyAllWindows 关闭所有OpenCV创建的窗口。

    3.2 使用 Matplotlib展示图片

    Matplotib 是 python 的一个绘图库,里头有各种各样的绘图方法。现在,你可以学习怎样用 Matplotib 显示图像,你可以放大,保存图像等等。

    官方文档:pyplot — Matplotlib 2.0.2 documentation

    import numpy as np
    import cv2 as cv
    from matplotlib import pyplot as plt
    img = cv.imread('example.jpg',0)
    plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
    plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
    plt.show()
    

    注意彩色图像使用 OpenCV 加载时是 BGR 模式。但是 Matplotib 是 RGB 模式。所以彩色图像如果已经被 OpenCV 读取,那它将不会被 Matplotib 正 确显示。

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    img = cv2.imread('example.jpg')
    b,g,r = cv2.split(img)
    img2 = cv2.merge([r,g,b])
    plt.subplot(121);plt.imshow(img) # expects distorted color
    plt.subplot(122);plt.imshow(img2) # expect true color
    plt.show()
    
    cv2.imshow('bgr image',img) # expects true color
    cv2.imshow('rgb image',img2) # expects distorted color
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     正常绘制且展示

    import numpy as np
    import cv2 as cv
    import matplotlib.pyplot as plt
    # 1 创建一个空白的图像
    img = np.zeros((512,512,3), np.uint8)
    # 2 绘制图形
    cv.line(img,(0,0),(511,511),(255,0,0),5)
    cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
    cv.circle(img,(447,63), 63, (0,0,255), -1)
    font = cv.FONT_HERSHEY_SIMPLEX
    cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)
    # 3 图像展示
    plt.imshow(img[:,:,::-1])
    plt.title('匹配结果'), plt.xticks([]), plt.yticks([])
    plt.show()
    

    3.3 图像灰度化处理

    import cv2
    
    # 读取彩色图像
    image = cv2.imread('example.jpg')
    
    # 将图像转换为灰度图
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 显示灰度图
    cv2.imshow('Gray Image', gray_image)
    
    # 保存处理后的图像
    cv2.imwrite('gray_example.jpg', gray_image)
    
    # 等待用户按下任意键
    cv2.waitKey(0)
    
    # 关闭窗口
    cv2.destroyAllWindows()

    说明:

    • cv2.cvtColor 函数用于转换图像的颜色空间,这里我们将图像从BGR转换为灰度。cv2.COLOR_BGR2GRAY表示将BGR格式图像转换为灰度图。

     3.4 边缘检测

    使用 Canny 算法进行边缘检测:

    edges = cv2.Canny(image, 100, 200)
    cv2.imshow('Edges', edges)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    参数说明:

    • 100:低阈值
    • 200:高阈值

     3.5 人脸识别

    使用OpenCV进行人脸识别是一个高级应用。

    import cv2
    # 加载预训练的人脸识别模型
    face_cascade = cv2.CascadeClassifier('path_to_haarcascade_frontalface_default.xml')
    
    # 读取图像
    image = cv2.imread('path_to_image.jpg')
    
    # 转换为灰度图
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 检测人脸
    faces = face_cascade.detectMultiScale(gray_image, scaleFactor=1.1, minNeighbors=5)
    
    # 在检测到的人脸周围画矩形
    for (x, y, w, h) in faces:
      cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 3)
    # 显示结果
    cv2.imshow('Face Detection', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    说明:

    • CascadeClassifier 类用于加载预训练的级联分类器。

    • detectMultiScale 方法用于在图像中检测人脸。

    3.6 图像中的车牌识别

    import cv2
    
    # 读取图像
    image = cv2.imread('path_to_image.jpg')
    
    # 转换为灰度图
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 二值化
    _, thresh = cv2.threshold(gray_image, 150, 255, cv2.THRESH_BINARY_INV)
    
    # 寻找轮廓
    contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    # 遍历轮廓,寻找车牌
    for contour in contours:
        x, y, w, h = cv2.boundingRect(contour)
        if w > 100 and h > 30:  # 假设车牌的最小尺寸
            cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
    
    # 显示结果
    cv2.imshow('License Plate Detection', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    实现思路和关键步骤:

    1. 将图像转换为灰度图。

    2. 对图像进行二值化处理。

    3. 寻找图像中的轮廓。

    4. 根据轮廓的尺寸和位置确定车牌位置。

    四、模块介绍

    其中core、highgui、imgproc是最基础的模块,分别如下:

    1,core模块实现了最核心的数据结构及其基本运算,如绘图函数、数组操作相关函数等。
    2,highgui模块实现了视频与图像的读取、显示、存储等接口。
    3,imgproc模块实现了图像处理的基础方法,包括图像滤波、图像的几何变换、平滑、阈值分割、形态学处理、边缘检测、目标检测、运动分析和对象跟踪等。
    

    对于图像处理其他更高层次的方向及应用,OpenCV也有相关的模块实现

    1,features2d模块用于提取图像特征以及特征匹配,nonfree模块实现了一些专利算法,如sift特征。
    2,objdetect模块实现了一些目标检测的功能,经典的基于Haar、LBP特征的人脸检测,基于HOG的行人、汽车等目标检测,分类器使用Cascade Classification(级联分类)和Latent SVM等。
    3,stitching模块实现了图像拼接功能。
    4,FLANN模块(Fast Library for Approximate Nearest Neighbors),包含快速近似最近邻搜索FLANN 和聚类Clustering算法。
    5,ml模块机器学习模块(SVM,决策树,Boosting等等)。
    6,photo模块包含图像修复和图像去噪两部分。
    7,video模块针对视频处理,如背景分离,前景检测、对象跟踪等。
    8,calib3d模块即Calibration(校准)3D,这个模块主要是相机校准和三维重建相关的内容。包含了基本的多视角几何算法,单个立体摄像头标定,物体姿态估计,立体相似性算法,3D信息的重建等等。
    9,G-API模块包含超高效的图像处理pipeline引擎。

    五、版本冲突

    如何解决 OpenCV 与其他库冲突的问题?

    解决方法: 使用虚拟环境隔离项目依赖:

    python -m venv opencv_env
    source opencv_env/bin/activate  # Linux/Mac
    opencv_env\Scripts\activate     # Windows

     

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    打赏作者

    常生果

    喜欢我,请支持我

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

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

    打赏作者

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

    抵扣说明:

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

    余额充值