专业的编程技术博客社区

网站首页 > 博客文章 正文

OpenCV-Python:从导入图像到人脸检测

baijin 2024-08-31 16:16:10 博客文章 5 ℃ 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 - 1(红色)与B - 3(蓝色)调换位置,使红色变为(0,0,255)而不是(255,0,0)。
  2. 将颜色空间更改为RGB:
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

用rgb_image而不是image继续你的代码。

警告2:要关闭显示图像的窗口,请按任意按钮。如果你使用关闭按钮,它可能会导致freezes (当使用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()

裁剪

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

这里image[10:500, 500:2000] 是 image[y:y+h, x:x+w]

Resizing

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%")

此resizing函数保持原始图像的尺寸比。

旋转

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角度逆时针旋转图像。

灰度和阈值(黑白效果)

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是图像的灰度单通道版本。

此threshold函数将把所有比127更暗的变为0,所有比127亮的变为255。

另一个例子:

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

这将使所小于150的变为10,大于150的变为200。

模糊/平滑

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

GaussianBlur函数有3个参数:

  • 第一个参数是您要模糊的图像。
  • 第二个参数必须是2个正奇数的元组。当它们增加时,模糊效果会增加。
  • 第三个参数是sigmaX和sigmaY。当保留为0时,它们将根据核大小自动计算。

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

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") 

rectangle函数有5个参数:

  • 第一个参数是图像。
  • 第二个参数是x1,y1 - 左上角。
  • 第三个参数是x2,y2 - 右下角。
  • 第四个参数是矩形颜色(GBR / RGB,具体取决于您导入图像的方式)。
  • 第五个参数是矩形线的粗细。

画线

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取决于您导入图像的方式)。
  • 第五个参数是线条粗细。

在图像上增加文字

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函数有7个参数

  • 第一个参数是您要写入的图像。
  • 第二个参数是文本本身。
  • 第三个参数是文本开始的x,y - 左下角坐标。
  • 第四个参数是字体类型。
  • 第五个参数是字体大小。
  • 第六个参数是颜色(GBR / RGB取决于您导入图像的方式)。
  • 第七个参数是文本的粗细。

人脸检测

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函数有4个参数

  • 第一个参数是灰度图像。
  • 第二个参数是scaleFactor。因为有些脸可能离镜头更近,所以看起来会比后面的脸更大。scale factor弥补了这一点。
  • 检测算法使用移动窗口来检测对象。minNeighbors定义在声明找到的面之前在当前对象附近检测到的对象数。
  • minSize,给出每个窗口的大小。

Contours - 对象检测的方法

使用基于颜色的图像分割,您可以检测对象。 cv2.findcontour和cv2.drawContours是帮助您实现这一点的两个函数。

保存图像

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

结束

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

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表