资源技术动态OpenCV-Python速查:从载入图片到人脸识别

OpenCV-Python速查:从载入图片到人脸识别

2019-10-14 | |  134 |   0

什么是OpenCV-Python?

OpenCV是一个计算机视觉和机器学习的开源库。拥有2500+个优化算法——一套非常全面的既经典又最先进的计算机视觉和机器学习算法的集合,具备很多接口,包括Python,Java,C++和Matlab。

这次,让我们来攻克Python的接口:

目录


安装

导入图像 & 显示

import cv2
image = cv2.imread("./Path/To/Image.extension")
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

提醒1:通过OpenCV的种方式读取图像,它不是RGB色域的——而是BGR色域的。有时候这不会是一个问题,只有在你想加入彩色内容到你的图像中的时候会有麻烦。

有两个解决办法:

  1. 将R - 1st(红色)与B - 3rd(蓝色)切换,使红色为(0,0,255)而不是(255,0,0)。

  2. 改变色域为RGB

rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

然后在你的rgb_image上继续编写代码,而不是在image上。

提醒2:按下任意按键,来关闭显示图像的窗口。如果你使用关闭按钮可以能会导致卡主(在我使用Jupyter Notebook时,有发生这样的情况)

简单起见,整个教程中我会使用下面的方法来显示图像

import cv2def viewImage(image, name_of_window):
    cv2.namedWindow(name_of_window, cv2.WINDOW_NORMAL)
    cv2.imshow(name_of_window, image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

1555915894772515.png

图片来源: Pixabay


裁剪:Cropping

1555916093552432 (1).jpeg

图片来源: Pixabay

1555916105115069.jpeg

裁剪后的狗狗


import cv2
cropped = image[10:500, 500:2000]
viewImage(cropped, "Doggo after cropping.")

在图像:image[10:500, 500:2000] 中以(y, x)为起点,裁剪大小为(h, w)的图像: image[y:y+h, x:x+w]


调整大小:Resizing


1555915836285489.png

图片来源: Pixabay

1571106850739250.png

调整20%之后

import cv2
scale_percent = 20 # percent of original sizewidth = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent / 100)
dim = (width, height)

resized = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)

viewImage(resized, "After resizing with 20%")

调整大小的函数保持了和原来图像一样的尺寸比。

更多关于图像缩放的函数,查看这里


旋转:Rotating

1555916257652263.jpeg

上方: 照片来自Pexels的Jonathan Meyer.

1555916280946983.jpeg

下方:旋转180度后的狗狗

import cv2
(h, w, d) = image.shape
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, 180, 1.0)
rotated = cv2.warpAffine(image, M, (w, h))
viewImage(rotated, "Doggo after rotation by 180 degrees")

image.shape输出了图像的高度,宽度和通道数。M是旋转矩阵——根据图像中心旋转180度。-ve按照顺指针方向旋转图像 & +ve 则是按照逆时针方向旋转。


灰度和阈值(黑 & 白效果)

1555915918169963.png

图像来源: Pexels

import cv2
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, threshold_image = cv2.threshold(im, 127, 255, 0)
viewImage(gray_image, "Gray-scale doggo")
viewImage(threshold_image, "Black & White doggo")

gray_image是图像的灰度单通道版本。阈值函数将所有阴影变为比127更暗(更小)到0并且所有更亮(更大)到255。

另外一个例子:

ret, threshold = cv2.threshold(im, 150, 200, 10)

这将使所有阴影小于150到10并且全部大于200。

更多关于阈值函数,查阅这里

1571110608797396.jpeg1571110624779655.png

                  左方: 灰度图像狗狗                                                                  右方: 黑白狗狗

模糊/平滑


1555916405323358.jpeg

1555915839776104.png

上方: 图像来自Pixabay. 下方: 模糊的狗狗


import cv2
blurred = cv2.GaussianBlur(image, (51, 51), 0)
viewImage(blurred, "Blurred doggo")

GussianBlur函数接收3个参数:

  • 第一个参数是你想要模糊的图像

  • 第二个参数必须是两个正奇数的元组。当他们增加时,模糊效果会增加。

  • 第三个参数是sigmaX和sigmaY。当保留为0时,他们将根据内核大小自动计算

更多的模糊函数,参看 这里

在图像上绘制矩形/边界框


1555915874205228.png

1555915879289363.png

上方: 图像来自Pexels. 下方: 狗狗脸上画了一个矩形框

import cv2
output = image.copy()
cv2.rectangle(output, (2600, 800), (4100, 2400), (0, 255, 255), 10)
viewImage(output, "Doggo with a rectangle on his face")

矩形框函数接收5个参数:

  • 第一个参数是图像

  • 第二个参数是x1, y1 ——对应左上角

  • 第三个参数是x2, y2 ——对应右下角

  • 第四个参数是矩形颜色(GBR/RGB,具体取决于你导入图像的方式)

  • 第五个参数矩形线条的粗细

在图片上绘制线段

1555915903960609.png

1555915940223332.png

上方: 图像来自Pexels. 下方: 2只狗狗被一条直线分隔

import cv2
output = image.copy()
cv2.line(output, (60, 20), (400, 200), (0, 0, 255), 5)
viewImage(output, "2 Doggos separated by a line")

line函数需要传入5个参数:

  • 第一个参数是你需要在上面绘制线段的图像。

  • 第二个参数是直线的x1, y1坐标。

  • 第三个参数是直线的x2 y2坐标。

  • 第四个参数是线段的颜色(可以是GBR/也可以是RGB,这取决于你导入的图片的格式)。

  • 第五个参数是线段的粗细。

在图片上输入文字

1555915925776950.png

1555915932293400.png

上方: 图像来自Pexels. 下方: 含有文字的图片

import cv2
output = image.copy()
cv2.putText(output, "We <3 Dogs", (1500, 3600),cv2.FONT_HERSHEY_SIMPLEX, 15, (30, 105, 210), 40) 
viewImage(output, "image with text")

putText 函数包含七个参数:

  • 第一个参数是您需要在上面输入文字的图片

  • 第二个参数是需要输入的文字内容

  • 第三个参数是文字开始区域的左下角的x,y坐标

  • 第四个参数是字体

  • 第五个参数是字体大小

  • 第六个参数是字体颜色(可以是GBR/也可以是RGB,这取决于你导入的图片的格式)。

  • 第七个参数是字体的粗细

人脸识别

1555915949261320.png

来自于 Pixabay的免费图片

import cv2

image_path = "./Path/To/Photo.extension"face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(
    gray,
    scaleFactor= 1.1,
    minNeighbors= 5,
    minSize=(10, 10)
)

faces_detected = format(len(faces)) + " faces detected!"print(faces_detected)# Draw a rectangle around the facesfor (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2)
    
viewImage(image,faces_detected)

detectMultiScale函数是一个检测物体的通用函数。当我们把它用于人脸检测时,它就会从图像中检测出人脸。

detectMultiScale函数 包含四个参数 

  • 第一个参数是灰度图

  • 第二个参数是缩放比例。因为在我们的图片中,有些人脸由于更靠近照相机,导致他们看起来比后面的人脸更大些。缩放参数就是为了解决这种问题的。

  • 检测算法使用了滑动窗口来检测目标物体。minNeighbors参数定义了当识别出一个人脸之前在当前物体周围需要检测的物体数目。

  • 同时minSize参数给出了窗口的大小

1555915905928527.png


  • 在图片中检测出两张人脸

  • 通过轮廓来检测物体

  • 使用基于颜色的图片分段,我们可以实现物体的检测。cv2.findContours 和 cv2.drawContours  两个函数可以帮我们实现上述目标。

  • 近期,我写了一篇非常详细的文章,文章的题目是使用python来实现基于颜色的图片分段的物体检测。如果你想了解关于轮廓的知识,您可以阅读这篇文章。

  • 最后,保存图片

  • import cv2
    image = cv2.imread("./Import/path.extension")
    cv2.imwrite("./Export/Path.extension", image)

最后总结

OpenCv是一个包含大量易于使用的算法的库,这些算法可用于3D建模、高级图像和视频编辑、跟踪视频中的识别对象、对在视频中执行特定操作的人进行分类、从图像集中查找类似图像等等。
归根结底,学习opencv对于那些想参与与图像相关的机器学习项目的人来说至关重要。


发起:王立鱼 校对:唐里 审核:咩咩咩鱼

参与翻译(2人):linlh、肯恩•阿瑟

英文原文:OpenCV-Python Cheat Sheet: From Importing Images to Face Detection

THE END

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:自动化视觉跟踪

下一篇:Res2Net深度多尺度目标检测架构

用户评价
全部评价

热门资源

  • 应用笔画宽度变换...

    应用背景:是盲人辅助系统,城市环境中的机器导航...

  • GAN之根据文本描述...

    一些比较好玩的任务也就应运而生,比如图像修复、...

  • 端到端语音识别时...

    从上世纪 50 年代诞生到 2012 年引入 DNN 后识别效...

  • 人体姿态估计的过...

    人体姿态估计是计算机视觉中一个很基础的问题。从...

  • 谷歌发布TyDi QA语...

    为了鼓励对多语言问答技术的研究,谷歌发布了 TyDi...