捕捉运动目标的八倍镜-cv2

前言😀

最近项目中使用检测移动目标,并提取相关数据,进行甄别数据与库中的数据是否一致,通过校验后通过闸机放行,本篇博客主要分享的是:cv2(OpenCV,opencv-python)库的简介、安装、使用方法(常见函数、图像基本运算等)最强详细攻略(cv2(opencv, Opencv-python) library introduction, installation, use methods (common functions, image basic operations, etc.) the most detailed introduction)

简介

👇给━((′д`)爻(′д`))━!!!!分享:OpenCV,opencv-python库的简介

OpenCV是一个开源的计算机视觉库,可以运行在多种操作系统上,包括Windows、Linux、macOS等。

它由C/C++编写,并且有Python、Java、MATLAB等语言的接口。

OpenCV最初是由英特尔公司开发,用于加速计算机视觉应用。

后来,它被开源并流行起来。

OpenCV包含了计算机视觉中常用的很多算法,可以用于人脸检测、目标检测、图像分割、特征提取等任务。opencv-python是OpenCV的Python接口,可以很容易地在Python中使用OpenCV的功能。

那么这么风骚的技术,我们需要知道它OpenCV主要功能:O(∩_∩)O哈哈~

  1. 图像处理:OpenCV有许多图像处理函数,可以进行图像缩放、旋转、滤波、直方图均衡化、几何变换等操作。
  2. 视频分析:OpenCV可以对视频进行解码、追踪运动对象、检测异常事件等分析操作。
  3. 特征检测与描述:OpenCV实现了许多特征检测算法,如SIFT、SURF、ORB等,可以检测关键点并给出特征描述。这些特征通常用于图像配准、物体识别等任务。
  4. 人脸检测与识别:OpenCV内置了人脸检测模型,可以实时检测图像和视频中的人脸。并且实现了人脸识别的相关算法。
  5. 目标检测:OpenCV实现了常见的目标检测算法,可以检测人、车、动物等目标。
  6. 三维重建:OpenCV可以通过立体匹配和Structure from Motion算法实现三维场景的重建。
  7. 机器学习:OpenCV内置了部分机器学习算法,如SVM、决策树、Boosting、深度学习等,可以用于图像分类和识别。
  8. 相机标定与 Augmented Reality:OpenCV可以实现相机标定,得到相机内外参数。这些参数可以用于增强现实等应用。
  9. 其它:OpenCV还包含形状分析、模板匹配、直方图比较、轮廓检测等功能。

OpenCV是一个非常强大的计算机视觉库,包含了从图像处理到机器学习在内的许多计算机视觉算法和功能,可以应用于人工智能、安监控、交通管理、医疗等许多领域。竟然这么多领域一会我会详细的写一下现实社会当中的应用:

OpenCV应用领域

OpenCV应用领域-计算机视觉领域方向

  1. 安防监控:这是OpenCV最常见的应用方向之一。通过OpenCV可以实现视频监控、异常行为检测、人脸识别等功能,用于警务系统、门禁系统等。比如线下商店的人脸入库和目标检测,机场的安检系统等。
  2. 无人驾驶:OpenCV可以用于无人驾驶系统中的环境感知、道路检测、车辆检测、标志检测以及防碰撞系统等。现在许多自动驾驶公司都在使用OpenCV进行无人驾驶技术研发。
  3. 医学图像分析:OpenCV的图像处理和机器学习算法可以用于CT、MRI等医学图片的分析与检测,帮助医生进行疾病诊断。比如计算肿瘤体积,识别病灶位置等。
  4. 交通管理:通过OpenCV可以实现对道路、车辆、行人的监测和管理,用于交通流量统计、违章检测以及智能交通管理系统。一些公司正在研发基于OpenCV的交通监控和管理系统。
  5. 人机交互:OpenCV的人脸检测、手势识别以及机器学习算法可以用于各种人机交互系统,如智能音箱、游戏等。许多公司都在研发基于视觉的人机交互技术和产品。
  6. 机器人:在机器人系统中,OpenCV可以用于环境感知、路径规划、物体操控等功能模块的开发。不少机器人和无人机公司都在使用OpenCV进行产品研发。
  7. 生产工艺自动化:通过OpenCV可以实现工业visual inspection,用于检测生产线上橡胶、纸张、玻璃等产品的缺陷,进行质量控制。一些制造企业已经采用这种自动化检测系统。

OpenCV应用领域-计算机操作底层技术

  1. 图像与视频处理:OpenCV有大量的图像和视频处理算法,可以对图像进行平滑、锐化、边缘检测、几何变换、色彩空间转换、直方图处理等操作。这些算法构成计算机视觉系统的基石,用于提高图像质量,准备图像数据。
  2. 特征检测与提取:OpenCV实现了许多特征检测与描述算法,如SIFT、SURF、ORB、BRISK等。这些算法可以检测图像中的关键点并给出特征描述,在目标检测、图像配准、物体识别等任务中发挥重要作用。
  3. 机器学习:OpenCV内置了SVM、决策树、Boosting、深度学习等机器学习算法。这些算法可以对图像及其特征进行分类、识别和分析,是智能计算机视觉系统的关键。
  4. 目标检测:OpenCV实现了许多目标检测算法,如Haar特征分类器、HOG descriptors以及深度学习目标检测网络等。这些算法可以检测图像中的人、车、动物等目标物体,广泛用于视频监控和交通管理中。
  5. 三维重建:OpenCV可以通过立体匹配和SFM算法实现三维场景的重建。这些技术可以得到点云,用于机器人的环境感知和避障、无人驾驶中的障碍物检测以及增强现实等应用。
  6. 相机标定:OpenCV实现了亚像素级的相机标定算法,可以高精度地得到相机内外参数。这些参数对三维重建、机器人导航、增强现实等高要求应用至关重要。

兄弟们咱们通过👆的介绍终于知道这个神器的用法,即使你永远三级头盔和三级甲,都不好使O(∩_∩)O哈哈~真是:

天地英雄气,万古如长夜。
翱翔九霄云,运转八极星。

OpenCV之强大,难以言表,其计算机视觉能力之广泛与强劲,使其在各个领域皆可发挥作用,犹如英雄之气概,千秋万古难以磨灭。它的算法与功能之强大,犹如翱翔天际,控制自在。无论在何等严酷的应用环境,都可以运用自如,发挥强大威力,犹如操控八极,驾驭星辰。

安装这个神器(cv2(OpenCV,opencv-python)库的安装)

安装OpenCV的几种方法

  1. 编译安装:这是最基础的安装方式,需要下载OpenCV的源码,然后进行编译安装。适用于Linux/macOS系统。需要安装CMake和依赖库,比较繁琐,但可以自定义安装选项。
  2. 使用包管理器安装:在Linux系统上可以使用apt-get(Ubuntu)或yum(CentOS)等包管理器直接安装OpenCV。简单方便,但OpenCV版本可能较低, lacking最新功能。
  3. 使用 pre-built 库安装:OpenCV发布在官网提供的预编译库,可以直接下载和安装使用。版本较新,但需要手动配置环境变量和依赖项。Windows用户可以选择这个方法。
  4. 使用Caffe安装:如果安装了Caffe深度学习框架,可以选择使用Caffe自带的OpenCV版本。版本较新,环境配置简单,但与Caffe耦合。
  5. 使用Minconda安装:可以使用conda命令创建一个OpenCV环境,并在其中安装OpenCV。conda可以很好地管理不同版本的OpenCV,非常推荐。
  6. Docker安装:可以使用OpenCV提供的Docker镜像直接运行OpenCV。方便快捷,提供开箱即用的环境。但是与宿主机隔离,需要熟悉Docker。

最好的推荐如下:O(∩_∩)O哈哈~

  1. Linux/macOS用户使用Minconda安装,可以很方便地管理不同版本的OpenCV,环境配置简单。
  2. Windows用户下载OpenCV的预编译库进行安装,需要手动配置环境但版本较新。
  3. 如果需要自定义选项或者OpenCV最新功能,可以选择编译安装,需要一定的编译经验。
  4. Docker也是一种很简单可靠的安装方法,提供完全隔离的运行环境,但需要Docker基础。

直接命令法 😀

在Linux系统上,可以使用以下命令直接安装OpenCV:Ubuntu/Debian:

sudo apt-get install libopencv-dev python-opencv

CentOS:

sudo yum install opencv-devel python-opencv

这会安装OpenCV的开发库和Python绑定。如果需要最新版OpenCV,可以添加官方的OpenCV仓库:Ubuntu:

sudo add-apt-repository ppa:opencv/opencv-master
sudo apt-get update
sudo apt-get install libopencv-dev python-opencv

CentOS:

sudo yum install epel-release
sudo yum install opencv-devel python-opencv

如果需要额外安装的功能,例如通过MediaPipe(Kotlin)访问OpenCV,可以:

sudo apt-get install libopencv-java

或者编译安装最新的OpenCV:1. 安装依赖:

sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
  1. 下载OpenCV源码:
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
  1. 编译安装:
cd opencv
mkdir build
cd build
cmake -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ..
make -j$(nproc)
sudo make install
  1. 安装Python绑定:
cd ../../
python install .
  1. 更新环境变量:
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig 
测试一下👌
  1. 运行Python代码

可以在Python中导入cv2,如果没有错误,则安装成功:

python
import cv2
print(cv2.__version__)
  1. 运行示例程序

OpenCV安装包通常提供一些示例程序,可以直接运行验证:Linux/macOS:

cd /usr/share/opencv4/samples/python 
python facedetect.py 

Windows:

cd C:\opencv\build\x64\vc15\bin 
facedetect.exe
  1. 检查OpenCV配置

可以打印OpenCV的配置信息,检查是否编译了你需要的功能:

python
import cv2
print(cv2.getBuildInformation())
  1. 运行CMake测试

如果是从源码编译安装的,可以回到build文件夹,运行:

make test
sudo make installtest

这会运行OpenCV的测试程序,检查各个模块和功能是否正常工作。如果全部通过,说明OpenCV安装配置正确。

  1. 测试视频捕捉
    如果安装时开启了视频捕捉模块,可以运行一个简单程序捕捉视频流来验证:
python 
import cv2

cap = cv2.VideoCapture(0)  # 使用默认摄像头
while(True):
    ret, frame = cap.read()
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break;
cap.release()
cv2.destroyAllWindows() 
  1. 检查环境变量

如果选择手动配置环境变量,也要确认PKG_CONFIG_PATHOpenCV_DIR是否设置正确。

使用whl文件法

  1. 确定你的Python版本和 OpenCV 版本

先确定我们要使用的Python版本(如Python 3.7)和OpenCV版本(如4.1.2)。然后需要下载对应的 whl 文件。

  1. 下载 whl 文件
    我们可以嗨皮的从官网的 OpenCV 仓库下载whl文件:https://opencv.org/releases例如,如果你要下载 4.1.2 版本,适用于 Python 3.7,则需要下载文件:
opencv_python‐4.1.2‐cp37‐cp37m‐win_amd64.whl 
  1. 下载OpenCV的依赖库

Ubuntu/Debian:

bash 
sudo apt-get install libsm6 libxext6 libxrender-dev

CentOS:

bash
sudo yum install libsm libXext libXrender-devel 
  1. 安装whl文件

在终端中运行:

bash
pip install opencv_python‐4.1.2‐cp37‐cp37m‐win_amd64.whl

就会开始安装whl文件。

  1. 验证安装
    安装完成后,可以在Python中import cv2。如果没有错误,则安装成功:
python
import cv2
print(cv2.__version__)

你也可以运行OpenCV的示例程序进行验证。

  1. (可选)配置环境变量
    如果是手动安装的OpenCV,可能还需要配置环境变量:
bash
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig 

设置OpenCV_DIR到OpenCV的安装路径。

Anaconda 环境下安装

  1. 创建OpenCV环境

使用conda创建一个OpenCV的环境:

bash
conda create -n opencv python=3.7
  1. 激活环境
bash 
conda activate opencv
  1. 安装OpenCV

可以选择安装预编译的OpenCV或从源码编译:预编译:

bash
conda install -c conda-forge opencv

源码编译:

bash
conda install -c conda-forge cmake glib gstreamer

git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git

cd opencv 
mkdir build && cd build
cmake -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ..
make -j$(nproc)
make install
  1. 安装其他依赖(可选)

如果需要视频、图片编码/解码等功能,需要安装其他依赖:

bash
conda install ffmpeg gstreamer libv4l libglib
  1. 测试安装

进入Python环境,导入cv2。如果没有错误,安装成功:

python
import cv2
print(cv2.__version__)

你可以运行OpenCV的示例程序进行进一步测试。6. 配置环境变量(如果源码编译)
如果是源码编译安装,需要配置以下环境变量:

bash
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export OpenCV_DIR=/usr/local

设置OpenCV_DIR指向OpenCV的安装路径。

如果是从源码编译安装OpenCV,需要设置环境变量OpenCV_DIR指向OpenCV的安装路径。

在Linux/macOS系统中,可以这样设置:

bash
export OpenCV_DIR=/usr/local  # 或者OpenCV的实际安装路径

将该命令添加到~/.bashrc文件中使其永久生效:

bash
echo 'export OpenCV_DIR=/usr/local' >> ~/.bashrc

在Windows系统中,需要这样设置:

  1. 打开控制面板,点击“系统”,然后点击“高级系统设置”。
  2. 点击“环境变量”。在“用户变量”或“系统变量”中点击“新建”。
  3. 输入变量名称OpenCV_DIR和变量值C:\opencv(或OpenCV的实际安装路径)。
  4. 点击“确定”保存环境变量。
  5. 打开新的命令提示符窗口,环境变量才会生效。可以运行echo %OpenCV_DIR%检查设置是否成功。
  6. 设置OpenCV_DIR环境变量的目的是:
    1. 告知其他依赖OpenCV的库OpenCV的安装位置。许多库在编译时需要指定OpenCV的路径,如果不设置这个环境变量,它们将找不到OpenCV。
    2. 方便你自己在编译程序时指定OpenCV的路径。只需要用-DOpenCV_DIR=$OpenCV_DIR传递这个环境变量给CMake。
    3. 运行一些OpenCV的post-installation脚本,它们需要知道OpenCV的路径。
    4. 让OpenCV的一些构建工具如opencv_version.cmake能够找到OpenCV,从而推断出OpenCV的版本信息。

库的使用方法

常见函数、图像基本运算等

O(∩_∩)O哈哈~

cv2.imread

😀这个方法用于读取图像

cv2.imread(filename, flags)

参数:

​ filename: 要读取的图像的文件名。可以是相对路径或绝对路径。
​ flags: 可选参数,默认为1。它指定图像文件的格式。可取值有:

​ cv2.IMREAD_COLOR : 读取彩色图像,如果图像文件为灰度图,则将其转换为RGB彩色图像。(默认值)
​ cv2.IMREAD_GRAYSCALE : 读取灰度图
​ cv2.IMREAD_UNCHANGED : 读取图像而不对图像进行任何转换,保留图像的原始位数。

例子:1. 读取彩色图像:

python
img = cv2.imread('image.jpg')
  1. 读取灰度图像:
python 
img = cv2.imread('image.jpg',0) 
  1. 读取原始图像(不转换):
python
img = cv2.imread('image.jpg', -1)
  1. 检查图像是否加载成功:
python
img = cv2.imread('image.jpg')
if img is None:
    print('Error loading image') 
  1. 显示图像:
python
cv2.imshow('image',img)
cv2.waitKey(0) # 如果是其它键值,则延迟该值毫秒后继续执行字句
  1. 获取图像属性:
python
height, width = img.shape[:2]  # 获取图像的高和宽
channel = img.shape[2]  # 获取图像的通道数

cv2.imshow

cv2.imshow()函数用于显示图像。其语法为:

python
cv2.imshow(winname, mat)

参数:

winname: 窗口名称,在同一个脚本中该名字必须唯一
mat: 要显示的图像

例子:

  1. 显示图像:
python
img = cv2.imread('image.jpg')
cv2.imshow('image', img)
  1. 在同一个脚本中显示多幅图像:
python
img1 = cv2.imread('image1.jpg')
cv2.imshow('image1', img1)

img2 = cv2.imread('image2.jpg') 
cv2.imshow('image2', img2)
  1. 设置窗口大小:

可以通过cv2.resize()函数设置图像大小,然后显示:

python
img = cv2.imread('image.jpg')
img = cv2.resize(img, (640, 480))  # 设置为640x480
cv2.imshow('image', img)
  1. 等待显示:

默认情况下,cv2.imshow()会在窗口创建1ms后销毁窗口。我们可以使用cv2.waitKey()函数设置等待时间,单位为ms。如:

python
cv2.imshow('image', img)
cv2.waitKey(0)   # 无限等待键盘输入 
cv2.waitKey(2000) # 等待2秒

通过键盘输入,我们可以更加平滑的浏览图像。按Esc键、'q'或者'Q'可以关闭窗口。

  1. 销毁窗口:
    可以使用cv2.destroyWindow()函数销毁窗口。如:
python
cv2.destroyWindow('image')

cv2.imwrite

函数用于将图像写入文件。

其语法为:

python
cv2.imwrite(filename, img, params)

参数:

filename: 要写入的图像文件名称,支持的格式有*.bmp, .dib, .jpeg, .jpg, .jpe, .jp2, .png, .pbm, .pgm, .ppm, .sr, .ras, .tiff, .tif 等。
img: 待写入的图像
params: 可选参数,用于设置图像文件的一些属性,例如:.jpg要设置图像的质量等。

例子:

  1. 将图像写入JPEG文件:
python
img = cv2.imread('image.jpg')
cv2.imwrite('output.jpg', img)
  1. 将BGR图像写入PNG文件:
python
img = cv2.imread('image.jpg')
cv2.imwrite('output.png', img) 
  1. 将灰度图写入TIFF文件:
python 
img = cv2.imread('image.jpg', 0)   # 灰度图
cv2.imwrite('output.tiff', img)
  1. 设置JPEG图像质量:
python
cv2.imwrite('output.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 50])  # 设置JPEG质量为50
  1. 设置PNG图像压缩级别:
python
cv2.imwrite('output.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 5]) # 设置PNG压缩级别为5

其他可选参数还有:

cv2.IMWRITE_PXM_BINARY: 设置为True时,文件将以二进制格式保存,否则以文本格式保存(仅用于PNM格式)。

img.copy()

函数用于创建图像的深拷贝。

在OpenCV中,图像是一个numpy数组。

当我们对图像进行操作时,如果直接修改这个数组,则会修改原始图像的数据。

例如:

python
img = cv2.imread('image.jpg')
img[0,0] = (255,255,255)  # 修改像素

这个操作会直接修改原始图像img中的数据。

如果我们想保留原始图像,可以使用img.copy()函数创建图像的副本,操作副本的数据而不影响原始图像:

python
img_copy = img.copy()
img_copy[0,0] = (255,255,255)  # 修改像素

现在,img_copy被修改,但原始的img图像数据保持不变。

img.copy()的原理是深拷贝,将图像所有的像素数据重新拷贝一份,所以修改副本不会影响原始图像。

这在OpenCV图像处理中是一个很有用的技巧,可以保留原始图像数据,同时对图像进行修改处理。

例子:

python
import cv2

img = cv2.imread('image.jpg')

# 深拷贝,img_copy是img的副本 
img_copy = img.copy()  

# 修改img_copy
img_copy[0,0] = (255,255,255)  

# img保持不变
cv2.imshow('image', img)  
cv2.imshow('image_copy', img_copy)
cv2.waitKey(0)

输出:
image窗口显示原始图像image.jpg
image_copy窗口显示被修改的副本img_copy

cv2.resize

函数用于图像缩放。

其语法为:

python
cv2.resize(src, dsize, fx=None, fy=None, interpolation=cv2.INTER_LINEAR)

参数:

src: 输入图像
dsize: 输出图像大小。

可以是绝对值(新的图像宽度和高度),也可以是相对值(原图像宽高的比例)。

如果dsize设置为新的宽度dsize=(width,height),则图像会被缩放到此大小。

如果设置为相对值像dsize=(w,h),那么原始图像宽高的比例为w:h,会根据dsize和原始图像宽高比例计算出新的宽高。
fx: 水平缩放比例因子
fy: 垂直缩放比例因子
interpolation: 插值方法,默认为cv2.INTER_LINEARinterpolation

可选方法有:

cv2.INTER_NEAREST - 最近邻插值法
cv2.INTER_LINEAR - 双线性插值法(默认)
cv2.INTER_AREA - 像素区域重采样
cv2.INTER_CUBIC - 双三次插值
cv2.INTER_LANCZOS4 - Lanczos插值

例子:

  1. 按绝对值缩放 to 500x500:
python
img = cv2.imread('image.jpg')
resized = cv2.resize(img, (500, 500))
  1. 按相对值缩放,宽高比例为2:1
python
resized = cv2.resize(img, (2, 1))  
  1. 只设置宽度,高度等比例缩放:
python 
resized = cv2.resize(img, width=500)  
  1. 设置fx和fy比例因子为0.5,图像缩小一半:
python
resized = cv2.resize(img, fx=0.5, fy=0.5)
  1. 使用INTER_NEAREST插值方法:
python
resized = cv2.resize(img, (500, 500), interpolation=cv2.INTER_NEAREST)

cv2.flip

函数用于图像翻转。

其语法为:

python
cv2.flip(src, flipCode)

参数:

src: 输入图像
flipCode: 翻转类型:

​ 0: 垂直翻转
1: 水平翻转
-1: 水平+垂直翻转

例子:

  1. 垂直翻转:
python
img = cv2.imread('image.jpg')
flipped = cv2.flip(img, 0)  
  1. 水平翻转:
python
flipped = cv2.flip(img, 1)  
  1. 水平+垂直翻转:
python
flipped = cv2.flip(img, -1)
  1. 显示原始图像及翻转结果:
python
cv2.imshow('Original', img)
cv2.imshow('Flipped 0', cv2.flip(img, 0))  
cv2.imshow('Flipped 1', cv2.flip(img, 1))
cv2.imshow('Flipped -1', cv2.flip(img, -1 ))    
cv2.waitKey(0)

输出:
Original窗口显示原始图像
Flipped 0窗口显示垂直翻转结果
Flipped 1窗口显示水平翻转结果
Flipped -1窗口显示水平+垂直翻转结果

cv2.warpAffine

函数用于图像仿射变换。

其语法为:

python
cv2.warpAffine(src, M, dsize, dst, flags, borderMode, borderValue)

参数:

src: 输入图像
M: 变换矩阵,2x3或3x3大小
dsize: 输出图像大小
dst: 输出图像
flags: 插值方法,默认cv2.INTER_LINEAR
borderMode: 边界填充方式,默认cv2.BORDER_CONSTANT
borderValue: 边界颜色值仿射变换会保留图像直线的性质,并在变换后使其成像。

它可以实现图像的平移、缩放、旋转、错切等操作。

M变换矩阵可以由OpenCV函数计算得到,也可以手动构造。

手动构造时,需要理解变换矩阵是如何影响图像变换的。

例子:

  1. 水平移动100像素:
python 
M = np.float32([[1,0,100],[0,1,0]])
dst = cv2.warpAffine(img, M, (cols,rows))
  1. 旋转45度:
python
M = cv2.getRotationMatrix2D((cols/2,rows/2),45,1) 
dst = cv2.warpAffine(img,M,(cols,rows))
  1. 缩放0.5倍:
python
M = cv2.getRotationMatrix2D((cols/2,rows/2),45,0.5)
dst = cv2.warpAffine(img,M,(cols,rows)) 
  1. 错切(shear):
python
M = np.float32([[1,0.2,0],[0,1,0]])   # x' = x + 0.2y
dst = cv2.warpAffine(img,M,(cols,rows)) 
  1. 组合操作:
python
M = cv2.getRotationMatrix2D((cols/2,rows/2),30,0.7)   
M[:,2] += 100   # 添加平移 
dst = cv2.warpAffine(img,M,(cols,rows))

cv2.putText

函数用于在图像上绘制文本。

其语法为:

python
cv2.putText(img, text, org, font, fontScale, color, thickness, lineType, bottomLeftOrigin=None) 

参数:

img: 输入图像
text: 要绘制的文本
org: 文本起始坐标
font: 字体(默认FONT_HERSHEY_SIMPLEX)
fontScale: 字体缩放比例(默认1)
color: 字体颜色(bgr颜色或灰度值)
thickness: 字体粗细(如果为负数,则为图像实际像素的大小)
lineType: 线条类型(默认8连接)
bottomLeftOrigin: 如果为True,则文本底部为图像坐标原点(默认False,文本左上角为原点)

例子:

  1. 在图像左上角绘制文本:
python
img = cv2.imread('image.jpg')
cv2.putText(img, 'Hello', (20,50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
  1. 选择字体和缩放:
python
cv2.putText(img, 'Hello', (20,50), cv2.FONT_HERSHEY_COMPLEX, 2, (0,0,255), 3) 
  1. 设置底部为坐标原点:
python
cv2.putText(img, 'Hello', (20,50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2, bottomLeftOrigin=False)
  1. 绘制中文文本:
python
name = '中文'
cv2.putText(img, name, (20,50), cv2.FONT_HERSHEY_SIMPLEX, 2, (0,0,255), 3)  
  1. 显示结果:
python
cv2.imshow('image', img)
cv2.waitKey(0)

输出:
image窗口显示添加文本后的图像

cv2.rectangle

函数用于在图像上绘制矩形。

其语法为:

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

参数:

img: 输入图像
pt1: 矩形顶点1坐标
pt2: 矩形顶点2坐标
color: 矩形颜色(bgr或灰度值)
thickness: 矩形线条粗细,如果为负数表示填充矩形
lineType: 线条类型,8联通或4联通
shift: 坐标原点位置例子:1. 绘制空心矩形:

python
img = cv2.imread('image.jpg')
cv2.rectangle(img, (20,30), (150,200), (0,255,0), 2) 
  1. 绘制填充矩形:
python
cv2.rectangle(img, (20,30), (150,200), (0,255,0), -1)
  1. 绘制4联通矩形:
python 
cv2.rectangle(img, (20,30), (150,200), (0,255,0), 2, cv2.LINE_4)  
  1. 设置坐标原点为图像左下角:
python
cv2.rectangle(img, (20,30), (150,200), (0,255,0), 2, 0, (0,img.shape[0]))  
  1. 显示结果:
python
cv2.imshow('image', img)
cv2.waitKey(0)

输出:
image窗口显示添加矩形后的图像

cv2.boundingRect

函数计算图像中的最小框。

其语法为:

python
cv2.boundingRect(points) 

参数:

points: 输入的点集,如轮廓点集等该函数返回的是一个四元组 (x,y,w,h),表示图像中目标的最小外接矩形的左上角坐标(x,y)、宽w和高h。

例子:

  1. 获取轮廓的最小矩形框:
python
import cv2
import numpy as np

img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray,127,255,0)
contours,hierarchy = cv2.findContours(thresh, 1, 2)

for cnt in contours:
    x,y,w,h = cv2.boundingRect(cnt)
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

cv2.imshow('img',img)
cv2.waitKey(0)
  1. 获取点集的最小矩形框:
python
points = np.array([[20,30],[150,30],[70,200],[50,100]])
x,y,w,h = cv2.boundingRect(points) 
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2) 
  1. 显示结果:
python
cv2.imshow('image', img)
cv2.waitKey(0)

输出:
image窗口显示添加了最小矩形框的图像

cvtColor之Opencv2.x和Opencv3.x

在OpenCV中,cvtColor()函数用于彩色空间转换,它的用法在OpenCV2.x和OpenCV3.x中有一些变化。OpenCV2.x中cvtColor()的用法为:

python
cv2.cvtColor(src, code)

参数:

src: 输入图像
code: 颜色空间转换代码,常用的有:
cv2.CV_BGR2GRAY : BGR -> GRAY
cv2.CV_BGR2RGB : BGR -> RGB
cv2.CV_GRAY2BGR : GRAY -> BGR
cv2.CV_HSV2BGR : HSV -> BGR

例如:

BGR到灰度的转换:

python
gray = cv2.cvtColor(img, cv2.CV_BGR2GRAY)

在OpenCV3.x中,code参数变为更加明确的字符串,cvtColor()的用法为:

python
cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

例如,BGR到灰度的转换:

python
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

我们畅谈一下:图像基本运算😀

  1. 图像加法:
python
dst = cv2.add(src1, src2)

dst = src1 + src2, 两个图像像素值相加。适用于同等大小同类型图像。

  1. 图像减法:
python
dst = cv2.subtract(src1, src2)

dst = src1 - src2, 两个图像像素值相减。适用于同等大小同类型图像。

  1. 图像融合(加权和):
python
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)

dst = src1 alpha + src2 beta + gamma
alpha和beta是权重,gamma是偏置。适用于同等大小同类型图像。

  1. 图像阈值:
python
ret, dst = cv2.threshold(src, thresh, maxval, type)

根据阈值thresh,将src中的像素值设置为maxval。type determining thresholding type.。
常用type:
- cv2.THRESH_BINARY: 大于阈值设置为maxval,否则设置为0
- cv2.THRESH_BINARY_INV: 大于阈值设置为0,否则设置为maxval
- cv2.THRESH_TRUNC: 大于阈值的部分设置为阈值,否则不改变
- cv2.THRESH_TOZERO: 大于阈值的部分不改变,否则设置为0
- cv2.THRESH_TOZERO_INV: 大于阈值的部分设置为0,否则不改变5. 图像滤波:

python
dst = cv2.blur(src, ksize)   # 均值滤波
dst = cv2.GaussianBlur(src, ksize, sigmaX)   # 高斯滤波
dst = cv2.medianBlur(src, ksize)   # 中值滤波
dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)  # 双边滤波 

通过kernel achieved图像平滑和去噪6. 图像形态学:

python
dst = cv2.erode(src, kernel)    # 图像腐蚀 
dst = cv2.dilate(src, kernel)   # 图像膨胀
dst = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel) # 开运算(膨胀+腐蚀) 
dst = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel) # 闭运算(腐蚀+膨胀)
dst = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel) # 形态学梯度(膨胀-腐蚀) 

通过卷积核kernel achieved图像形态学操作。

这些就是图像基本运算的详细介绍。

是图像处理的基石,要深入理解每种运算的原理和适用条件,并熟练掌握相关函数的使用。

图像加法、减法、融合用于图像的叠加、差分和混合。

图像阈值用于图像的分割和二值化。

图像滤波用于图像的平滑和去噪。

图像形态学用于图像的腐蚀、膨胀和轮廓提取等。

嗨皮的分享一下: Image.open 和cv2.imread 的区别及其转换

Image.open和cv2.imread都是用于读取图像的函数,但属于不同的库:- Image.open属于Python Image Library(PIL),可以读取BMP、JPG、PNG、GIF等常见格式的图像。
- cv2.imread属于OpenCV,可以读取BMP、JPG、PNG、TIFF等格式的图像。两者主要的区别如下:1. 返回值不同:
- Image.open返回一个Image对象
- cv2.imread返回一个numpy数组2. 读取速度不同:
- cv2.imread读取速度更快,适合实时应用
- Image.open读取速度稍慢3. 支持的文件格式略有不同4. Image对象和numpy数组间可以相互转换:- Image -> numpy:

python
img = Image.open('image.jpg')
img_np = np.asarray(img)  # img_np是numpy数组

- numpy -> Image:

python 
img_np = cv2.imread('image.jpg') 
img = Image.fromarray(img_np)  # img是Image对象

所以,两者可以相互补充,根据实际需求选择使用:- 如果需要快速读取和操作大量图像,优先选择cv2.imread和OpenCV
- 如果需要操作少量图像,或者想使用PIL强大的图像处理功能,可以选择Image.open
- 也可以两者结合,如读取使用cv2.imread,处理使用PIL,互相转换

捕捉运动目标的八倍镜-cv2

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

滚动到顶部