前言😀
最近项目中使用检测移动目标,并提取相关数据,进行甄别数据与库中的数据是否一致,通过校验后通过闸机放行,本篇博客主要分享的是: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哈哈~
- 图像处理:OpenCV有许多图像处理函数,可以进行图像缩放、旋转、滤波、直方图均衡化、几何变换等操作。
- 视频分析:OpenCV可以对视频进行解码、追踪运动对象、检测异常事件等分析操作。
- 特征检测与描述:OpenCV实现了许多特征检测算法,如SIFT、SURF、ORB等,可以检测关键点并给出特征描述。这些特征通常用于图像配准、物体识别等任务。
- 人脸检测与识别:OpenCV内置了人脸检测模型,可以实时检测图像和视频中的人脸。并且实现了人脸识别的相关算法。
- 目标检测:OpenCV实现了常见的目标检测算法,可以检测人、车、动物等目标。
- 三维重建:OpenCV可以通过立体匹配和Structure from Motion算法实现三维场景的重建。
- 机器学习:OpenCV内置了部分机器学习算法,如SVM、决策树、Boosting、深度学习等,可以用于图像分类和识别。
- 相机标定与 Augmented Reality:OpenCV可以实现相机标定,得到相机内外参数。这些参数可以用于增强现实等应用。
- 其它:OpenCV还包含形状分析、模板匹配、直方图比较、轮廓检测等功能。
OpenCV是一个非常强大的计算机视觉库,包含了从图像处理到机器学习在内的许多计算机视觉算法和功能,可以应用于人工智能、安监控、交通管理、医疗等许多领域。竟然这么多领域一会我会详细的写一下现实社会当中的应用:
OpenCV应用领域
OpenCV应用领域-计算机视觉领域方向
- 安防监控:这是OpenCV最常见的应用方向之一。通过OpenCV可以实现视频监控、异常行为检测、人脸识别等功能,用于警务系统、门禁系统等。比如线下商店的人脸入库和目标检测,机场的安检系统等。
- 无人驾驶:OpenCV可以用于无人驾驶系统中的环境感知、道路检测、车辆检测、标志检测以及防碰撞系统等。现在许多自动驾驶公司都在使用OpenCV进行无人驾驶技术研发。
- 医学图像分析:OpenCV的图像处理和机器学习算法可以用于CT、MRI等医学图片的分析与检测,帮助医生进行疾病诊断。比如计算肿瘤体积,识别病灶位置等。
- 交通管理:通过OpenCV可以实现对道路、车辆、行人的监测和管理,用于交通流量统计、违章检测以及智能交通管理系统。一些公司正在研发基于OpenCV的交通监控和管理系统。
- 人机交互:OpenCV的人脸检测、手势识别以及机器学习算法可以用于各种人机交互系统,如智能音箱、游戏等。许多公司都在研发基于视觉的人机交互技术和产品。
- 机器人:在机器人系统中,OpenCV可以用于环境感知、路径规划、物体操控等功能模块的开发。不少机器人和无人机公司都在使用OpenCV进行产品研发。
- 生产工艺自动化:通过OpenCV可以实现工业visual inspection,用于检测生产线上橡胶、纸张、玻璃等产品的缺陷,进行质量控制。一些制造企业已经采用这种自动化检测系统。
OpenCV应用领域-计算机操作底层技术
- 图像与视频处理:OpenCV有大量的图像和视频处理算法,可以对图像进行平滑、锐化、边缘检测、几何变换、色彩空间转换、直方图处理等操作。这些算法构成计算机视觉系统的基石,用于提高图像质量,准备图像数据。
- 特征检测与提取:OpenCV实现了许多特征检测与描述算法,如SIFT、SURF、ORB、BRISK等。这些算法可以检测图像中的关键点并给出特征描述,在目标检测、图像配准、物体识别等任务中发挥重要作用。
- 机器学习:OpenCV内置了SVM、决策树、Boosting、深度学习等机器学习算法。这些算法可以对图像及其特征进行分类、识别和分析,是智能计算机视觉系统的关键。
- 目标检测:OpenCV实现了许多目标检测算法,如Haar特征分类器、HOG descriptors以及深度学习目标检测网络等。这些算法可以检测图像中的人、车、动物等目标物体,广泛用于视频监控和交通管理中。
- 三维重建:OpenCV可以通过立体匹配和SFM算法实现三维场景的重建。这些技术可以得到点云,用于机器人的环境感知和避障、无人驾驶中的障碍物检测以及增强现实等应用。
- 相机标定:OpenCV实现了亚像素级的相机标定算法,可以高精度地得到相机内外参数。这些参数对三维重建、机器人导航、增强现实等高要求应用至关重要。
兄弟们咱们通过👆的介绍终于知道这个神器的用法,即使你永远三级头盔和三级甲,都不好使O(∩_∩)O哈哈~真是:
天地英雄气,万古如长夜。
翱翔九霄云,运转八极星。
OpenCV之强大,难以言表,其计算机视觉能力之广泛与强劲,使其在各个领域皆可发挥作用,犹如英雄之气概,千秋万古难以磨灭。它的算法与功能之强大,犹如翱翔天际,控制自在。无论在何等严酷的应用环境,都可以运用自如,发挥强大威力,犹如操控八极,驾驭星辰。
安装这个神器(cv2(OpenCV,opencv-python)库的安装)
安装OpenCV的几种方法
- 编译安装:这是最基础的安装方式,需要下载OpenCV的源码,然后进行编译安装。适用于Linux/macOS系统。需要安装CMake和依赖库,比较繁琐,但可以自定义安装选项。
- 使用包管理器安装:在Linux系统上可以使用apt-get(Ubuntu)或yum(CentOS)等包管理器直接安装OpenCV。简单方便,但OpenCV版本可能较低, lacking最新功能。
- 使用 pre-built 库安装:OpenCV发布在官网提供的预编译库,可以直接下载和安装使用。版本较新,但需要手动配置环境变量和依赖项。Windows用户可以选择这个方法。
- 使用Caffe安装:如果安装了Caffe深度学习框架,可以选择使用Caffe自带的OpenCV版本。版本较新,环境配置简单,但与Caffe耦合。
- 使用Minconda安装:可以使用conda命令创建一个OpenCV环境,并在其中安装OpenCV。conda可以很好地管理不同版本的OpenCV,非常推荐。
- Docker安装:可以使用OpenCV提供的Docker镜像直接运行OpenCV。方便快捷,提供开箱即用的环境。但是与宿主机隔离,需要熟悉Docker。
最好的推荐如下:O(∩_∩)O哈哈~
- Linux/macOS用户使用Minconda安装,可以很方便地管理不同版本的OpenCV,环境配置简单。
- Windows用户下载OpenCV的预编译库进行安装,需要手动配置环境但版本较新。
- 如果需要自定义选项或者OpenCV最新功能,可以选择编译安装,需要一定的编译经验。
- 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
- 下载OpenCV源码:
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)
sudo make install
- 安装Python绑定:
cd ../../
python install .
- 更新环境变量:
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
测试一下👌
- 运行Python代码
可以在Python中导入cv2,如果没有错误,则安装成功:
python
import cv2
print(cv2.__version__)
- 运行示例程序
OpenCV安装包通常提供一些示例程序,可以直接运行验证:Linux/macOS:
cd /usr/share/opencv4/samples/python
python facedetect.py
Windows:
cd C:\opencv\build\x64\vc15\bin
facedetect.exe
- 检查OpenCV配置
可以打印OpenCV的配置信息,检查是否编译了你需要的功能:
python
import cv2
print(cv2.getBuildInformation())
- 运行CMake测试
如果是从源码编译安装的,可以回到build文件夹,运行:
make test
sudo make installtest
这会运行OpenCV的测试程序,检查各个模块和功能是否正常工作。如果全部通过,说明OpenCV安装配置正确。
- 测试视频捕捉
如果安装时开启了视频捕捉模块,可以运行一个简单程序捕捉视频流来验证:
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()
- 检查环境变量
如果选择手动配置环境变量,也要确认PKG_CONFIG_PATH
和OpenCV_DIR
是否设置正确。
使用whl文件法
- 确定你的Python版本和 OpenCV 版本
先确定我们要使用的Python版本(如Python 3.7)和OpenCV版本(如4.1.2)。然后需要下载对应的 whl 文件。
- 下载 whl 文件
我们可以嗨皮的从官网的 OpenCV 仓库下载whl文件:https://opencv.org/releases例如,如果你要下载 4.1.2 版本,适用于 Python 3.7,则需要下载文件:
opencv_python‐4.1.2‐cp37‐cp37m‐win_amd64.whl
- 下载OpenCV的依赖库
Ubuntu/Debian:
bash
sudo apt-get install libsm6 libxext6 libxrender-dev
CentOS:
bash
sudo yum install libsm libXext libXrender-devel
- 安装whl文件
在终端中运行:
bash
pip install opencv_python‐4.1.2‐cp37‐cp37m‐win_amd64.whl
就会开始安装whl文件。
- 验证安装
安装完成后,可以在Python中import cv2。如果没有错误,则安装成功:
python
import cv2
print(cv2.__version__)
你也可以运行OpenCV的示例程序进行验证。
- (可选)配置环境变量
如果是手动安装的OpenCV,可能还需要配置环境变量:
bash
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
设置OpenCV_DIR
到OpenCV的安装路径。
Anaconda 环境下安装
- 创建OpenCV环境
使用conda创建一个OpenCV的环境:
bash
conda create -n opencv python=3.7
- 激活环境
bash
conda activate opencv
- 安装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
- 安装其他依赖(可选)
如果需要视频、图片编码/解码等功能,需要安装其他依赖:
bash
conda install ffmpeg gstreamer libv4l libglib
- 测试安装
进入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系统中,需要这样设置:
- 打开控制面板,点击“系统”,然后点击“高级系统设置”。
- 点击“环境变量”。在“用户变量”或“系统变量”中点击“新建”。
- 输入变量名称
OpenCV_DIR
和变量值C:\opencv
(或OpenCV的实际安装路径)。 - 点击“确定”保存环境变量。
- 打开新的命令提示符窗口,环境变量才会生效。可以运行
echo %OpenCV_DIR%
检查设置是否成功。 - 设置OpenCV_DIR环境变量的目的是:
- 告知其他依赖OpenCV的库OpenCV的安装位置。许多库在编译时需要指定OpenCV的路径,如果不设置这个环境变量,它们将找不到OpenCV。
- 方便你自己在编译程序时指定OpenCV的路径。只需要用
-DOpenCV_DIR=$OpenCV_DIR
传递这个环境变量给CMake。 - 运行一些OpenCV的post-installation脚本,它们需要知道OpenCV的路径。
- 让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')
- 读取灰度图像:
python
img = cv2.imread('image.jpg',0)
- 读取原始图像(不转换):
python
img = cv2.imread('image.jpg', -1)
- 检查图像是否加载成功:
python
img = cv2.imread('image.jpg')
if img is None:
print('Error loading image')
- 显示图像:
python
cv2.imshow('image',img)
cv2.waitKey(0) # 如果是其它键值,则延迟该值毫秒后继续执行字句
- 获取图像属性:
python
height, width = img.shape[:2] # 获取图像的高和宽
channel = img.shape[2] # 获取图像的通道数
cv2.imshow
cv2.imshow()函数用于显示图像。其语法为:
python
cv2.imshow(winname, mat)
参数:
winname: 窗口名称,在同一个脚本中该名字必须唯一
mat: 要显示的图像
例子:
- 显示图像:
python
img = cv2.imread('image.jpg')
cv2.imshow('image', img)
- 在同一个脚本中显示多幅图像:
python
img1 = cv2.imread('image1.jpg')
cv2.imshow('image1', img1)
img2 = cv2.imread('image2.jpg')
cv2.imshow('image2', img2)
- 设置窗口大小:
可以通过cv2.resize()函数设置图像大小,然后显示:
python
img = cv2.imread('image.jpg')
img = cv2.resize(img, (640, 480)) # 设置为640x480
cv2.imshow('image', img)
- 等待显示:
默认情况下,cv2.imshow()会在窗口创建1ms后销毁窗口。我们可以使用cv2.waitKey()函数设置等待时间,单位为ms。如:
python
cv2.imshow('image', img)
cv2.waitKey(0) # 无限等待键盘输入
cv2.waitKey(2000) # 等待2秒
通过键盘输入,我们可以更加平滑的浏览图像。按Esc键、'q'或者'Q'可以关闭窗口。
- 销毁窗口:
可以使用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要设置图像的质量等。
例子:
- 将图像写入JPEG文件:
python
img = cv2.imread('image.jpg')
cv2.imwrite('output.jpg', img)
- 将BGR图像写入PNG文件:
python
img = cv2.imread('image.jpg')
cv2.imwrite('output.png', img)
- 将灰度图写入TIFF文件:
python
img = cv2.imread('image.jpg', 0) # 灰度图
cv2.imwrite('output.tiff', img)
- 设置JPEG图像质量:
python
cv2.imwrite('output.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 50]) # 设置JPEG质量为50
- 设置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插值
例子:
- 按绝对值缩放 to 500x500:
python
img = cv2.imread('image.jpg')
resized = cv2.resize(img, (500, 500))
- 按相对值缩放,宽高比例为2:1
python
resized = cv2.resize(img, (2, 1))
- 只设置宽度,高度等比例缩放:
python
resized = cv2.resize(img, width=500)
- 设置fx和fy比例因子为0.5,图像缩小一半:
python
resized = cv2.resize(img, fx=0.5, fy=0.5)
- 使用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: 水平+垂直翻转
例子:
- 垂直翻转:
python
img = cv2.imread('image.jpg')
flipped = cv2.flip(img, 0)
- 水平翻转:
python
flipped = cv2.flip(img, 1)
- 水平+垂直翻转:
python
flipped = cv2.flip(img, -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函数计算得到,也可以手动构造。
手动构造时,需要理解变换矩阵是如何影响图像变换的。
例子:
- 水平移动100像素:
python
M = np.float32([[1,0,100],[0,1,0]])
dst = cv2.warpAffine(img, M, (cols,rows))
- 旋转45度:
python
M = cv2.getRotationMatrix2D((cols/2,rows/2),45,1)
dst = cv2.warpAffine(img,M,(cols,rows))
- 缩放0.5倍:
python
M = cv2.getRotationMatrix2D((cols/2,rows/2),45,0.5)
dst = cv2.warpAffine(img,M,(cols,rows))
- 错切(shear):
python
M = np.float32([[1,0.2,0],[0,1,0]]) # x' = x + 0.2y
dst = cv2.warpAffine(img,M,(cols,rows))
- 组合操作:
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,文本左上角为原点)
例子:
- 在图像左上角绘制文本:
python
img = cv2.imread('image.jpg')
cv2.putText(img, 'Hello', (20,50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
- 选择字体和缩放:
python
cv2.putText(img, 'Hello', (20,50), cv2.FONT_HERSHEY_COMPLEX, 2, (0,0,255), 3)
- 设置底部为坐标原点:
python
cv2.putText(img, 'Hello', (20,50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2, bottomLeftOrigin=False)
- 绘制中文文本:
python
name = '中文'
cv2.putText(img, name, (20,50), cv2.FONT_HERSHEY_SIMPLEX, 2, (0,0,255), 3)
- 显示结果:
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)
- 绘制填充矩形:
python
cv2.rectangle(img, (20,30), (150,200), (0,255,0), -1)
- 绘制4联通矩形:
python
cv2.rectangle(img, (20,30), (150,200), (0,255,0), 2, cv2.LINE_4)
- 设置坐标原点为图像左下角:
python
cv2.rectangle(img, (20,30), (150,200), (0,255,0), 2, 0, (0,img.shape[0]))
- 显示结果:
python
cv2.imshow('image', img)
cv2.waitKey(0)
输出:
image窗口显示添加矩形后的图像
cv2.boundingRect
函数计算图像中的最小框。
其语法为:
python
cv2.boundingRect(points)
参数:
points: 输入的点集,如轮廓点集等该函数返回的是一个四元组 (x,y,w,h),表示图像中目标的最小外接矩形的左上角坐标(x,y)、宽w和高h。
例子:
- 获取轮廓的最小矩形框:
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)
- 获取点集的最小矩形框:
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)
- 显示结果:
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)
我们畅谈一下:图像基本运算😀
- 图像加法:
python
dst = cv2.add(src1, src2)
dst = src1 + src2, 两个图像像素值相加。适用于同等大小同类型图像。
- 图像减法:
python
dst = cv2.subtract(src1, src2)
dst = src1 - src2, 两个图像像素值相减。适用于同等大小同类型图像。
- 图像融合(加权和):
python
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)
dst = src1 alpha + src2 beta + gamma
alpha和beta是权重,gamma是偏置。适用于同等大小同类型图像。
- 图像阈值:
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,互相转换