在OpenCV中,区域感兴趣(Region of Interest,简称ROI)切割是一种常用的技术,用于从图像中提取或修改图像的特定部分。
比如对于一个人的照片,假如我们要检测眼睛,因为眼睛肯定在脸上,所以我们感兴趣的只有脸这部分,其他都不care,所以可以单独把脸的部分截取出来,这样就可以大大节省计算量,提高运行速度。
我们在使用OpenCV进行读取图像时,图像数据会被存储为Numpy数组,ROI切割 原理也是基于Numpy数组的切片操作来完成的,因此在对应的组件中就需要填我们要切割的ROI区域的坐标来完成ROI切割操作。目前只能手动填写坐标,后续深度学习后有其他方法代替。
注意:在OpenCV中,坐标的x轴的正方向是水平向右,y轴的正方向是垂直向下,与数学上的二维坐标并不相同。
下面使用ROI来切割图像中的人脸,首先需要检测人脸,然后根据检测到的脸部位置进行切割。OpenCV提供了预训练的人脸检测模型,如Haar Cascade。你可以从OpenCV的GitHub仓库或者通过OpenCV的cv2.CascadeClassifier加载模型。对于每个检测到的人脸,你可以使用ROI(Region of Interest)来切割这部分图像。
代码实现:
import cv2
# 加载图像
image = cv2.imread('./images/png/girl01.png')
if image is None:
print("Error: Image not found.")
exit()
# 加载人脸检测模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
if face_cascade.empty():
print("Error: Face cascade file not found.")
exit()
# 转换为灰度图像并检测人脸
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
# 切割人脸区域并显示或保存
for (x, y, w, h) in faces:
face_roi = image[y:y + h, x:x + w]
cv2.imshow('Face', face_roi)
cv2.waitKey(0) # 等待按键后继续执行,或者设置为0以自动关闭窗口
cv2.destroyAllWindows() # 关闭所有窗口
