OpenCV常用的 7 个示例:从读取到人脸检测(Python版)

简介: OpenCV常用的 7 个示例:从读取到人脸检测(Python版)

OpenCV


OpenCV是计算机视觉领域最流行的库之一。它最初是用 C 和 C++ 编写的。现在也可以在 Python 中使用。它最初是由英特尔开发的。该库是一个跨平台的开源库。免费使用。OpenCV 库是一个高度优化的库,其主要重点是实时应用程序。


OpenCV 库是2500多个优化算法的组合。它可以用来检测和识别不同的人脸,在图像中或实时识别物体,使用视频和网络摄像头分类不同的人类行为,跟踪摄像机的运动,跟踪像汽车、人类等移动物体,实时计数物体,将图像拼接在一起产生高分辨率图像,从图像数据库中找到类似的图像,从使用闪光灯拍摄的图像中去除红眼,提高图像质量,跟踪眼球运动,跟踪人脸等


它拥有大约4.7万活跃用户社区,估计下载量超过1800万次。许多大公司,如谷歌,亚马逊,特斯拉,微软,本田等使用OpenCV,使他们的产品更好,更智能。


先决条件


在开始编写代码之前,我们需要在我们的设备上安装 OpenCV 。如果你是专业的编程人员并且知道每一个 IDE,那么去 Pycharm 并且在设置中从它的包管理器中安装 OpenCV-python。


如果您是初学者或中级程序员,或者只是想关注该博客,那么我们将使用代码编辑器而不是IDE。只需转到Visual Studio Code网站并根据您的操作系统下载最新版本即可。现在,我们将创建一个虚拟环境,在其中将安装 OpenCV。打开终端,然后使用cd定位到桌面。使用名为opencv的mkdir创建一个文件夹然后在以下命令中运行。


python -m venv env


现在使用 env\scripts\activate 命令激活环境,你会看到在 C:\Users\username\Desktop\opencv 前出现一个带小括号的 (env)。现在只需使用 pip 安装 OpenCV。


pip install opencv-python

我们将在这个博客中涵盖7个主题:


  1. 读、写和展示一个图像
  2. 读取视频与集成网络摄像头
  3. 缩放和裁剪图像
  4. 使用函数的基本图像滤波器
  5. 绘制不同的形状
  6. 在图像上写文字
  7. 检测和裁剪人脸

读、写和展示一个图像


为了使用 OpenCV 读取图像,我们使用函数 imread() ,为了显示图像,我们使用函数 imshow() ,为了写入图像,我们使用函数 imwrite()。让我们看看每一个的语法。

imread():


img = cv2.imread("PATH_TO_IMAGE.jpg/png")
Example
img = imread("images/dog0.jpg")


imshow():


cv2.imshow("WINDOW NAME",IMG_VAR)
Example
imshow("Dog Image",img)


imwrite():


cv2.imwrite(FILENAME, IMAGE)
filename: A string representing the file name. The filename must include image format like .jpg, .png, etc.
image: It is the image that is to be saved.
Example
cv2.imwrite('images/img',img)


读取视频与集成网络摄像头

读取视频文件与读取 OpenCV 中的图像文件非常相似。不同之处在于我们使用 cv2.videocapture()


语法


video = cv2.VideoCapture("FILEPATH.mp4")
Example
video = cv2.VideoCapture("video/dog/dog.mp4")


视频是许多帧图像在一起的集合,每一帧都是一个图像。要使用 OpenCV 观看视频,我们只需要使用 while 循环显示视频的每一帧。


while True:
   success , img = cap.read()
   cv2.imshow("Video",img)
   if cv2.waitKey(1) & 0xff==ord('q'):##key 'q' will break the loop
       break


为了与网络摄像头集成,我们需要传递网络摄像头的端口值,而不是路径到视频。如果你使用的是笔记本电脑,没有连接任何外部摄像头,那么简单地传递0,如果你连接了任何外部摄像头,那么传递一个摄像头端口值。


cap = cv2.VideoCapture(0)
cap.set(3,640)  ## Frame width
cap.set(4,480)  ## Frame Height
cap.set(10,100) ## Brightness
while True:
   success, img = cap.read()
   cv2.imshow("Video",img)
   if cv2.waitKey(1) & 0xff == ord('q'):
        break

缩放和裁剪图像


缩放是一个改变图像形状的过程。在 Opencv,我们可以使用 resize 函数来调整图像的形状。


语法


cv2.resize(IMG,(WIDTH,HEIGHT))
IMG: image which we want to resize
WIDTH: new width of the resize image
HEIGHT: new height of the resize image
Example
cv2.resize(img,(224,224))


要调整图像的大小,我们首先需要知道图像的形状。我们可以利用 shape 找到图像的形状,然后根据当前图像的形状,我们可以增大或减小图像的大小。让我们举个例子来看看。


import cv2
img = cv2.imread("images/img0.jpg") ##Choose any image
print(img.shape)
imgResize = cv2.resize(img,(224,224)) ##Decrease size
imgResize2 = cv2.resize(img,(1024,1024)) ##Increase size
cv2.imshow("Image",img)
cv2.imshow("Image Resize",imgResize)
cv2.imshow("Image Increase size",imgResize2)
print(imgResize.shape)
cv2.waitKey(0)


如果您不想把图像宽度和高度写死,您也可以根据现有的形状,然后根据比例改变图像的宽度和高度。


import cv2
img = cv2.imread("images/img0.jpg") ##Choose any image
print(img.shape)
shape = img.shape
imgResize = cv2.resize(img,(shape[0]//2,shape[1]//2))##Decrease size
imgResize2 = cv2.resize(img,(shape[0]*2,shape[1]*2)) ##Increase size
cv2.imshow("Image",img)
cv2.imshow("Image Resize",imgResize)
cv2.imshow("Image Increase size",imgResize2)
print(imgResize.shape)
cv2.waitKey(0)


裁剪图像


裁剪是获取部分图像的过程。在  OpenCV 中,我们可以通过定义裁剪后的矩形坐标来执行裁剪。


语法


imgCropped = img[y1:y2, x1:x2](x1,y1): top-left vertex
(x2,y2): bottom-right vertex
Example
imgCropped = img[0:100,200:200]


使用裁剪方法,让我们尝试从图像中提取 Monalisa 的脸。


import cv2
img = cv2.imread("images/img0.jpg")
imgCropped = img[50:250,120:330]
cv2.imshow("Image cropped",imgCropped)
cv2.imshow("Image",img)
cv2.waitKey(0)

您还可以使用绘画模式来查找(x1,y1)、(x2,y2)的正确坐标。

这里有个小任务:


任务:右键单击图像并保存它; 尝试从图像中获取国王卡。


提示:使用绘画模式找到正确的坐标,最后,使用调整大小,以增加裁剪图像的大小。


使用函数的基本图像滤波器


我们可以在图像上使用许多基本的滤波器,比如将图片转换成灰度、模糊等等。


从 Img 到 gray


为了将图像从彩色图像转换为灰度图像,我们可以使用函数 cv2.cvtColor,在这里我们传递 cv2.COLOR_BGR2GRAY 作为参数。


语法


imgGray = cv2.cvtColor(IMG,cv2.CODE)
IMG: Original image
CODE: Conversion code for Gray(COLOR_BGR2GRAY)
Example
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)


从 Img 到 HSV


为了将图像转换为 HSV 颜色空间,我们可以使用函数 cv2.cvtColor,这里我们传递 cv2.COLOR_BGR2HSV 作为参数。它主要用于目标跟踪。


语法


imgGray = cv2.cvtColor(IMG,cv2.CODE)
IMG: Original image
CODE: Conversion code for Gray(COLOR_BGR2HSV)
Example
imgHsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

模糊图像


模糊用于去除图像中的噪声,也称为平滑。它是对图像应用低通滤波器的过程。在 OpenCV 中对图像进行模糊,我们常用 GaussianBlur。


语法


imgBlur = cv2.GaussianBlur(img,(sigmaX,sigmaY),kernalSize)
kernalsize − A Size object representing the size of the kernel.
sigmaX − A variable representing the Gaussian kernel standard deviation in X direction.
sigmaY - same as sigmaX
Exmaple
imgBlur = cv2.GaussianBlur(img,(3,3),0)

边缘检测


在 OpenCV 中,我们使用 Canny算子来检测图像中的边缘。也有不同的边缘检测器,但最著名的是 Canny算子。Canny算子边缘检测是一种边缘检测算子,它使用多级算法来检测图像中的大范围边缘,是由 John F. Canny 在1986年提出的。


语法


imgCanny = cv2.Canny(img,threshold1,threshold2)
threshold1,threshold2:Different values of threshold different for every images
Example
imgCanny = cv2.Canny(img,100,150)

膨胀


膨胀被用来增加图像中边缘的大小。首先,我们定义了奇数(5,5)的核矩阵大小。然后使用内核,我们对图像执行膨胀。下面我们对 Canny 算子的输出图像进行了膨胀。


语法


kernel = np.ones((5,5),np.uint8) ## DEFINING KERNEL OF 5x5
imgDialation = cv2.dilate(imgCanny,kernel,iterations=1) ##DIALATION

腐蚀


侵蚀与膨胀正好相反。该算法用于减小图像中边缘的大小。首先,我们定义了奇数(5,5)的核矩阵大小。然后使用内核,我们对图像执行腐蚀。下面我们对 Canny 算子的输出图像进行腐蚀处理。


kernel = np.ones((5,5),np.uint8) ## DEFINING KERNEL OF 5x5
imgDialation = cv2.erode(imgCanny,kernel,iterations=1) ##EROSION

现在,在同一个程序中使用上述基本函数处理 Monalisa 图像。

绘制不同的形状

我们可以使用 OpenCV 绘制不同的形状,像矩形,圆形,线等。


长方形


要在图像上绘制一个矩形,我们使用 cv2.rectangle 函数。在函数中,我们将宽度、高度、 x、 y、 RGB 中的颜色、深度作为参数传递。

语法


cv2.rectangle(img,(w,h),(x,y),(R,G,B),THICKNESS)
w: width
h: height
x: distance from x axis
y: distance from y axis
R,G,B: color in RGB form (255,255,0)
THICKNESS: thickness of rectangel(integer)Example
cv2.rectangle(img,(100,300),(200,300),(255,0,255),2)

圆形:


为了绘制一个圆形,我们使用 cv2.circle 函数。我们传递 x,y,半径大小,RGB 颜色,深度作为参数。


语法


cv2.circle(img,(x,y),radius,(R,G,B),THICKNESS)
x: distance from x axis
y: distance from y axis
radius: size of radius(integer)
R,G,B: color in RGB form (255,255,0)
THICKNESS: thickness of rectangel(integer)Example
cv2.circle(img,(200,130),90,(255,255,0),2)

直线:


要绘制一条直线,我们使用 cv2.line 函数传递起始点(x1,y1)、终点(x2,y2)、 RGB 格式的颜色、深度作为参数。


语法

cv2.line(img,(x1,y1),(x2,y2),(R,G,B),THICKNESS)x1,y1: start point of line (integer)
x2,y2: end point of line (integer)
R,G,B: color in RGB form (255,255,0)
THICKNESS: thickness of rectangel(integer)Example
cv2.line(img,(110,260),(300,260),(0,255,0),3)

在图像上写文字


在 OpenCV 中,我们有一个函数 cv2.puttext,用于在特定位置在图像上写入文本。它以图像、文本、 x、 y、颜色、字体、字号、粗细作为输入参数。


语法


cv2.putText(img,text,(x,y),FONT,FONT_SCALE,(R,G,B),THICKNESS)
img: image to put text on
text: text to put on image
X: text distance from X axis
Y: text distance from Y axis
FONT: Type of FONT (ALL FONT TYPES)
FONT_SCALE: Scale of Font(Integer)
R,G,B: color in RGB form (255,255,0)
THICKNESS: thickness of rectangel(integer)Example
cv2.putText(img,"HELLO",(120,250),cv2.FONT_HERSHEY_COMPLEX,1,(255,255,255),2)

检测和裁剪人脸


人脸检测在人脸识别系统中非常有用。在 OpenCV 中,我们有许多预先训练的 haar 级联分类器可用于不同的任务。以下网址可以查看 OpenCV GitHub 上的分类器列表:https://github.com/opencv/opencv/tree/master/data/haarca

scades。


我们使用 haarcascade_frontalface_default.xml 分类器来检测图像中的人脸。它将返回图像的四个坐标(w,h,x,y)。使用这些坐标,我们要在脸上画一个矩形,然后使用相同的坐标,继续裁剪人脸。最后使用 imwrite,把裁剪后的图像保存到目录中。


import cv2
# Load the cascade
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# Read the input image
img = cv2.imread('images/img0.jpg')# Convert into grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Detect faces
faces = face_cascade.detectMultiScale(gray, 1.3, 4)# Draw rectangle around the faces
for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
    # Cropping Face
    crop_face = img[y:y + h, x:x + w]
    #Saving Cropped Face
    cv2.imwrite(str(w) + str(h) + '_faces.jpg', crop_face)
cv2.imshow('img', img)
cv2.imshow("imgcropped",crop_face)
cv2.waitKey()

相关文章
|
JSON API 数据格式
洋码头商品 API 示例指南(Python 实现)
洋码头是国内知名跨境电商平台,提供商品搜索、详情、分类等API接口。本文详解了使用Python调用这些API的流程与代码示例,涵盖签名生成、请求处理及常见问题解决方案,适用于构建选品工具、价格监控等跨境电商应用。
|
缓存 JSON API
VIN车辆识别码查询车五项 API 实践指南:让每一俩车有迹可循(Python代码示例)
VIN(车辆识别代码)是全球唯一的17位汽车标识码,可快速获取车架号、发动机号、品牌型号等核心信息。在二手车交易、保险理赔、维修保养等场景中,准确解析VIN有助于提升效率与风控能力。本文介绍VIN码结构、适用场景,并提供Python调用示例及优化建议,助力企业实现车辆信息自动化核验。
1728 1
|
JSON 缓存 API
身份证二要素核验接口调用指南 —— Python 示例
本文介绍如何在 Python 中快速实现身份证二要素核验功能,适用于用户注册、金融风控等场景。通过阿里云市场提供的接口,可校验「姓名 + 身份证号」的一致性,并获取性别、生日、籍贯等信息。示例代码展示了从环境变量读取 APP_CODE、发送 GET 请求到解析 JSON 响应的完整流程。关键字段包括 code(1-一致,2-不一致,3-无记录)、msg 和 data。常见问题如 403 错误需检查 AppCode,超时则优化网络或设置重试机制。集成后可根据业务需求添加缓存、限流等功能提升性能。
1185 4
|
JSON API UED
运营商二要素验证 API:核验身份的一致性技术实践(Python示例)
随着线上业务快速发展,远程身份核验需求激增。运营商二要素验证API通过对接三大运营商实名数据,实现姓名、手机号、身份证号的一致性校验,具备权威性高、实时性强的优势,广泛应用于金融、电商、政务等领域。该接口支持高并发、低延迟调用,结合Python示例可快速集成,有效提升身份认证的安全性与效率。
1173 0
|
JSON API 数据格式
Python采集京东商品评论API接口示例,json数据返回
下面是一个使用Python采集京东商品评论的完整示例,包括API请求、JSON数据解析
|
XML JSON API
淘宝商品详情API的调用流程(python请求示例以及json数据示例返回参考)
JSON数据示例:需要提供一个结构化的示例,展示商品详情可能包含的字段,如商品标题、价格、库存、描述、图片链接、卖家信息等。考虑到稳定性,示例应基于淘宝开放平台的标准响应格式。
|
SQL 数据库 开发者
Python中使用Flask-SQLAlchemy对数据库的增删改查简明示例
这样我们就对Flask-SQLAlchemy进行了一次简明扼要的旅程,阐述了如何定义模型,如何创建表,以及如何进行基本的数据库操作。希望你在阅读后能对Flask-SQLAlchemy有更深入的理解,这将为你在Python世界中从事数据库相关工作提供极大的便利。
1073 77
|
测试技术 API 开发者
淘宝关键词搜索商品列表API接入指南(含Python示例)
淘宝关键词搜索商品列表API是淘宝开放平台的核心接口,支持通过关键词检索商品,适用于比价、选品、市场分析等场景。接口提供丰富的筛选与排序功能,返回结构化数据,含商品ID、标题、价格、销量等信息。开发者可使用Python调用,需注意频率限制与错误处理,建议先在沙箱环境测试。
|
数据采集 索引 Python
Python Slice函数使用教程 - 详解与示例 | Python切片操作指南
Python中的`slice()`函数用于创建切片对象,以便对序列(如列表、字符串、元组)进行高效切片操作。它支持指定起始索引、结束索引和步长,提升代码可读性和灵活性。
|
人工智能 数据库连接 API
掌握Python的高级用法:技巧、技术和实用性示例
本文分享了Python的高级用法,包括生成器、装饰器、上下文管理器、元类和并发编程等。生成器通过`yield`实现懒加载序列;装饰器用于增强函数功能,如添加日志或性能分析;上下文管理器借助`with`语句管理资源;元类动态定制类行为;并发编程利用`threading`和`asyncio`库提升任务执行效率。掌握这些高级概念可优化代码质量,解决复杂问题,提高程序性能与可维护性。
383 6

推荐镜像

更多