Python OpenCV快速入门教程


Posted in Python onApril 17, 2021

OpenCV

OpenCV是计算机视觉中最受欢迎的库,最初由intel使用C和C ++进行开发的,现在也可以在python中使用。该库是一个跨平台的开源库,是免费使用的。OpenCV库是一个高度优化的库,主要关注实时应用程序。
OpenCV库是2500多种优化算法的组合,可用于检测和识别不同的人脸,实时识别图像中的对象,使用视频和网络摄像头对不同的人类动作进行分类,跟踪摄像机的运动,跟踪运动对象(例如汽车,人等),实时计数对象,缝合图像来产生高分辨率图像,从图像数据库中查找相似的图像,从使用闪光灯拍摄的图像中消除红眼并提高图像质量,跟踪眼睛的运动,跟踪脸部等。
它拥有大约4.7万活跃用户社区,下载量超过1800万。谷歌,亚马逊,特斯拉,微软,本田等许多大公司都使用Open cv来改善他们的产品,它更是驱动了AI的发展。

先决条件

在开始编写代码之前,我们需要在设备上安装opencv。
如果你是ProIn编程专家,并且熟悉每个IDE,那么请使用Pycharm并从设置中的程序包管理器安装OpenCV-python。
如果你是初学者或中级程序员,或者只是想关注博客,那么我们将使用代码编辑器而不是IDE。
只需转到Visual Studio Code网站并根据你的操作系统下载最新版本即可。

现在,我们将创建一个虚拟环境,并在其中安装opencv。打开终端,然后使用cd定位到桌面,使用mkdir 创建一个名为opencv

的文件夹,然后运行以下命令。

python -m venv env  

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

我们会在本文中涵盖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;如果你有外部网络摄像头,则传递参数1。

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)

Python OpenCV快速入门教程

裁剪图像

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

句法

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

使用裁剪方法,让我们尝试从图像中获取蒙娜丽莎的脸。

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)

Python OpenCV快速入门教程

你也可以使用paint来找到(x1,y1),(x2,y2)的正确坐标。
右键单击图像并保存,尝试从图像中获取王卡。

Python OpenCV快速入门教程

提示:使用paint来找到正确的坐标,最后使用调整大小来增加裁剪图像的大小。
“在寻求解决方案之前,请尝试自己动手做。”
?解决方案- https://gist.github.com/Abhayparashar31/9b01473431de765c0a73e81271233d91

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

我们可以在图像上使用许多基本的滤镜操作,例如将图像转换为灰度图像,模糊图像等等。让我们一一看一下比较重要的操作。

将图像转为灰度图像

要将图像转换为灰度,我们可以使用一个函数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)

将图像转为HSV

要将图像转换为HSV,我们可以使用函数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映像。

Python OpenCV快速入门教程

绘制不同的形状

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

矩形:

要在图像上绘制矩形,我们使用矩形函数。在函数中,我们传递宽度,高度,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)

Python OpenCV快速入门教程

下载Monalisa图片。
任务:使用形状和文本为左侧图像中所示的Monalisa脸创建框架。
提示:首先是一个圆形,然后是矩形,然后根据圆形和矩形放置文本,最后根据文本放置一行。
?解决方案-  https://gist.github.com/Abhayparashar31/af36bf25ce61345266db4b54aba33be1

检测并裁剪脸部

在创建人脸识别系统时,人脸检测是非常有用的。在OpenCV中,我们提供了许多可用于不同目的的预训练haar级联分类器。在OpenCV GitHub上查看分类器的完整列表。

为了检测OpenCV中的人脸,我们使用了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()

Python OpenCV快速入门教程

参考文献

[1] https://opencv.org/about/
[2] https://pypi.org/project/opencv-python/
[3] https://www.murtazahassan.com/

以上就是Python OpenCV快速入门教程的详细内容,更多关于Python OpenCV入门教程的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python使用socket向客户端发送数据的方法
Apr 29 Python
python+selenium识别验证码并登录的示例代码
Dec 21 Python
ubuntu中配置pyqt4环境教程
Dec 27 Python
Python爬虫天气预报实例详解(小白入门)
Jan 24 Python
基于Python socket的端口扫描程序实例代码
Feb 09 Python
PyQt打开保存对话框的方法和使用详解
Feb 27 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
Apr 29 Python
python实现随机漫步方法和原理
Jun 10 Python
简单了解Django应用app及分布式路由
Jul 24 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
Aug 13 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
Nov 19 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
Apr 10 Python
python小程序之飘落的银杏
Python Numpy之linspace用法说明
Apr 17 #Python
用Python的绘图库(matplotlib)绘制小波能量谱
用基于python的appium爬取b站直播消费记录
解决numpy数组互换两行及赋值的问题
Apr 17 #Python
用Python实现Newton插值法
Apr 17 #Python
Python+Appium新手教程
You might like
8个必备的PHP功能开发
2015/10/02 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
2019/02/14 PHP
javascript英文日期(有时间)选择器
2007/05/02 Javascript
javascript使用正则表达式实现去掉空格之后的字符
2015/02/15 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
果断收藏9个Javascript代码高亮脚本
2016/01/06 Javascript
javascript 组合按键事件监听实现代码
2017/02/21 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
web.js.字符串与正则表达式操作
2017/05/13 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
使用Vue构建可重用的分页组件
2018/03/26 Javascript
浅析vue插槽和作用域插槽的理解
2019/04/22 Javascript
Nodejs异步流程框架async的方法
2019/06/07 NodeJs
新手如何快速理解js异步编程
2019/06/24 Javascript
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
2018/11/01 Python
Python使用Pickle模块进行数据保存和读取的讲解
2019/04/09 Python
python sqlite的Row对象操作示例
2019/09/11 Python
如何基于python测量代码运行时间
2019/12/25 Python
Pytorch 图像变换函数集合小结
2021/02/01 Python
香港太阳眼镜网上商店:SmartBuyGlasses香港
2016/07/22 全球购物
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
美国亚马逊旗下男装网站:East Dane(支持中文)
2019/09/25 全球购物
中国领先的汽车保养服务平台:途虎养车
2019/10/18 全球购物
学校司机岗位职责
2013/11/14 职场文书
个人思想理论学习的自我鉴定
2013/11/30 职场文书
教师自荐信
2013/12/10 职场文书
好的演讲稿开场白
2013/12/30 职场文书
总经理岗位职责范本
2014/02/02 职场文书
优秀护士先进事迹
2014/05/08 职场文书
创先争优活动承诺书
2014/08/30 职场文书
单位法人授权委托书范本
2014/10/09 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
小学教师工作总结2015
2015/04/07 职场文书
微信小程序实现聊天室功能
2021/06/14 Javascript