社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

小白学视觉 • 1 年前 • 347 次点击  

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达


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")
Exampleimg = imread("images/dog0.jpg")

imshow():

cv2.imshow("WINDOW NAME",IMG_VAR)
Exampleimshow("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.
Examplecv2.imwrite('images/img',img)

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

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


语法

video = cv2.VideoCapture("FILEPATH.mp4")
Examplevideo = 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 widthcap.set(4,480)  ## Frame Heightcap.set(10,100) ## Brightnesswhile 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 resizeWIDTH: new width of the resize imageHEIGHT: new height of the resize image
Examplecv2.resize(img,(224,224))

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

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

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

import cv2img = cv2.imread("images/img0.jpg") ##Choose any imageprint(img.shape)shape = img.shapeimgResize = cv2.resize(img,(shape[0]//2,shape[1]//2))##Decrease sizeimgResize2 = cv2.resize(img,(shape[0]*2,shape[1]*2)) ##Increase sizecv2.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
ExampleimgCropped = img[0:100,200:200]

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

import cv2img = 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 imageCODE: Conversion code for Gray(COLOR_BGR2GRAY)
ExampleimgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

从 Img 到 HSV


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


语法

imgGray = cv2.cvtColor(IMG,cv2.CODE)IMG: Original imageCODE: Conversion code for Gray(COLOR_BGR2HSV)
ExampleimgHsv = 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
ExmapleimgBlur = 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
ExampleimgCanny = cv2.Canny(img,100,150)

膨胀


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


语法

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

腐蚀


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

kernel = np.ones((5,5),np.uint8) ## DEFINING KERNEL OF 5x5imgDialation = 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: widthh: heightx: distance from x axisy: distance from y axisR,G,B: color in RGB form (255,255,0)THICKNESS: thickness of rectangel(integer)Examplecv2.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 axisy: distance from y axisradius: size of radius(integer)R,G,B: color in RGB form (255,255,0)THICKNESS: thickness of rectangel(integer)Examplecv2.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)Examplecv2.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 ontext: text to put on imageX: text distance from X axisY: text distance from Y axisFONT: 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)Examplecv2.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 cascadeface_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# Read the input imageimg = cv2.imread('images/img0.jpg')# Convert into grayscalegray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Detect facesfaces = face_cascade.detectMultiScale(gray, 1.3, 4)# Draw rectangle around the facesfor (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()

下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/162278
 
347 次点击