如何在opencv python中裁剪帧中的面而不丢失质量

如何在opencv python中裁剪帧中的面而不丢失质量,python,opencv,computer-vision,image-scaling,Python,Opencv,Computer Vision,Image Scaling,我有一个计算机视觉项目,我正在从usb摄像头的实时视频源中推断。虽然这款相机是罗技全高清相机,但由于安装问题,它的安装位置与人们通常工作的地方有点远。应用程序检测人脸,如果该人脸未被识别或不在数据库中,应用程序将开始保存人脸图像,以便这些图像可用于重新训练人脸识别模型 以下是整个管道的工作原理: Frame -> Person detection in frame -> Person tracking starts |-> Face dete

我有一个
计算机视觉
项目,我正在从usb摄像头的实时视频源中推断。虽然这款相机是罗技全高清相机,但由于安装问题,它的安装位置与人们通常工作的地方有点远。应用程序检测人脸,如果该人脸未被识别或不在数据库中,应用程序将开始保存人脸图像,以便这些图像可用于重新训练人脸识别模型

以下是整个管道的工作原理:

Frame -> Person detection in frame -> Person tracking starts 
                 |-> Face detection from person image -> Face recognition
                                                            |-> If unrecognized starts saving face images
现在让我们拍摄下一帧图像:

正如您所看到的,图像非常清晰,脸部清晰可见。现在,在此上运行
人员检测
并保存人员图像后,它看起来如下所示:

现在,如果我们在上面的人物图像中检测到人脸并保存人脸图像,它如下所示:

现在你可以看到,人脸图像的大小非常小,因此我们需要调整它的大小,使其正确可见。因此,调整大小后,它看起来如下所示:

现在调整大小后,它看起来有点模糊,因此有时会被人脸识别忽略或无法识别。下面是我用来保存和调整图像大小的代码:

width = face_endX - face_startX
height = face_endY - face_startY

face_image = person_image[face_startY:face_startY + height, face_startX:face_startX + width]

scale_percent = 150  
width = int(face_image.shape[1] * scale_percent / 100)
height = int(face_image.shape[0] * scale_percent / 100)

dim = (width, height)
resized_img = cv2.resize(image, dim, interpolation=cv2.INTER_LANCZOS4)  

cv2.imwrite("face_image.jpg", resized_img)
所以在上面的代码中,我首先得到宽度和高度,然后使用面边界框坐标,创建一个面图像。然后,我将缩放百分比设置为150,然后调整图像大小并保存图像


有没有人能帮我推荐一些好的方法,让图像可以调整一点大小,同时保持图像质量。

你正在做我能想到的一切。两个小建议,1。您可以尝试不同的插值方法,例如立方体。2.在写入图像时,默认情况下,它以95%的质量压缩为jpg,要么将质量参数增加到99,要么将图像另存为.png以压缩质量的最后一位。@Baraa我将尝试使用
立方插值
,但老实说,所有插值对我来说都是一样的。你能解释更多关于
压缩成jpg,质量为95%
并另存为
.png
的信息吗。将图像另存为
.png
是否保留图像质量。?
cv2.imwrite
具有设置jpg质量速率的选项。您可以这样设置:
cv2.imwrite(res\u path,res,[int(cv2.imwrite\u JPEG\u QUALITY),100])
此外,如果您将图像扩展名设置为
.png
,它将以无损png格式保存。我认为这两种方法都不会有太大的区别,但值得一试。你不能简单地通过调整大小来增加图像中的信息。你得到的小图像是你所有的像素。如您所见,增加图像大小只是将信息分散到更大的区域。为了避免进一步的插值,您可以不调整正在拍摄的图像的大小。或者只将其调整到某个大小以上。你正在做我能想到的一切。两个小建议,1。您可以尝试不同的插值方法,例如立方体。2.在写入图像时,默认情况下,它以95%的质量压缩为jpg,要么将质量参数增加到99,要么将图像另存为.png以压缩质量的最后一位。@Baraa我将尝试使用
立方插值
,但老实说,所有插值对我来说都是一样的。你能解释更多关于
压缩成jpg,质量为95%
并另存为
.png
的信息吗。将图像另存为
.png
是否保留图像质量。?
cv2.imwrite
具有设置jpg质量速率的选项。您可以这样设置:
cv2.imwrite(res\u path,res,[int(cv2.imwrite\u JPEG\u QUALITY),100])
此外,如果您将图像扩展名设置为
.png
,它将以无损png格式保存。我认为这两种方法都不会有太大的区别,但值得一试。你不能简单地通过调整大小来增加图像中的信息。你得到的小图像是你所有的像素。如您所见,增加图像大小只是将信息分散到更大的区域。为了避免进一步的插值,您可以不调整正在拍摄的图像的大小。或者只将其调整到某个大小以上。