本文为 AI 研习社编译的技术博客,原标题 : OpenCV-Python Cheat Sheet: From Importing Images to Face Detection 作者 | Salma Ghoneim 翻译 | linlh、肯恩•阿瑟 编辑 | 王立鱼 原文链接: https://heartbeat.fritz.ai/opencv-python-cheat-sheet-from-importing-images-to-face-detection-52919da36433 注:本文的相关链接请访问文末【阅读原文】
OpenCV是一个计算机视觉和机器学习的开源库。拥有2500+个优化算法——一套非常全面的既经典又最先进的计算机视觉和机器学习算法的集合,具备很多接口,包括Python,Java,C++和Matlab。
这次,让我们来攻克Python的接口:
目录:
安装方式有两种:Window用户,Linux用户;不管是使用哪种方式都请阅读原文查看。
import cv2
image = cv2.imread("./Path/To/Image.extension")
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
提醒1:通过OpenCV的种方式读取图像,它不是RGB色域的——而是BGR色域的。有时候这不会是一个问题,只有在你想加入彩色内容到你的图像中的时候会有麻烦。
有两个解决办法:
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
然后在你的rgb_image上继续编写代码,而不是在image上。
提醒2:按下任意按键,来关闭显示图像的窗口。如果你使用关闭按钮可以能会导致卡主(在我使用Jupyter Notebook时,有发生这样的情况)
简单起见,整个教程中我会使用下面的方法来显示图像:
import cv2
def viewImage(image, name_of_window):
cv2.namedWindow(name_of_window, cv2.WINDOW_NORMAL)
cv2.imshow(name_of_window, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
图片来源: Pixabay
图片来源: Pixabay
裁剪后的狗狗
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]
图像来源: Pexels
调整20%之后
import cv2
scale_percent = 20 # percent of original size
width = 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%")
调整大小的函数保持了和原来图像一样的尺寸比。
更多关于图像缩放的函数,查看原文。
上方: 照片来自Pexels的Jonathan Meyer.下方:旋转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 190 degrees")
image.shape输出了图像的高度,宽度和通道数。M是旋转矩阵——根据图像中心旋转180度。-ve按照顺指针方向旋转图像 & +ve 则是按照逆时针方向旋转。
图像来源: 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。
更多关于阈值函数,查阅原文。
上方: 灰度图像狗狗 下方: 黑白狗狗
上方: 图像来自Pixabay. 下方: 模糊的狗狗
import cv2
blurred = cv2.GaussianBlur(image, (51, 51), 0)
viewImage(blurred, "Blurred doggo")
GussianBlur函数接收3个参数:
更多的模糊函数,参看原文。
上方: 图像来自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个参数:
上方: 图像来自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个参数:
上方: 图像来自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 函数包含七个参数:
非常抱歉,此处我们不能放狗狗的图片了。:(
来自于 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 faces
for (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函数 包含四个参数 :
在图片中检测出两张人脸
使用基于颜色的图片分段,我们可以实现物体的检测。cv2.findContours 和 cv2.drawContours 两个函数可以帮我们实现上述目标。
近期,我写了一篇非常详细的文章,文章的题目是使用python来实现基于颜色的图片分段的物体检测。如果你想了解关于轮廓的知识,你可以去阅读这篇文章。
import cv2
image = cv2.imread("./Import/path.extension")
cv2.imwrite("./Export/Path.extension", image)
想要继续查看该篇文章相关链接和参考文献?
点击底部【阅读原文】即可访问:
https://ai.yanxishe.com/page/TextTranslation/1659