dlib库的68点特征点面部标记检测器怎么应用到pycharm

图像课报告中需要做人脸识别
人脸检测是一个部分,下载68点face_landmarks的.dat文件后,pycharm中乱码无法查看
终端直接运行的话,特征点功能直接跳过,原图进入原图出来
.py文件单独运行报错,说面部编辑器那块儿argument is required

img

img

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,对您的问题及这个报错信息分别回答如下。
一、【对于乱码以及前面的这些问题】解决如下:
要在PyCharm中使用dlib库进行人脸识别,可以按照以下步骤操作:

1、 安装dlib库。可以使用pip命令在终端上安装dlib库:

pip install dlib

2、 下载68点face_landmarks的.dat文件,保存到本地路径中。

可以从dlib官网下载:http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2

3、 在PyCharm中创建一个新的Python文件,导入dlib库和cv2库,例如:

import dlib
import cv2

4、 在代码中加载face_landmarks的.dat文件,例如:
其中,predictor_path为face_landmarks的.dat文件的路径。这里需要将其替换为实际的路径。代码如下:

predictor_path = 'path/to/shape_predictor_68_face_landmarks.dat'
predictor = dlib.shape_predictor(predictor_path)

5、 加载图片并进行人脸检测和特征点检测,例如:

img_path = 'path/to/image.jpg'
img = cv2.imread(img_path)

detector = dlib.get_frontal_face_detector()
dets = detector(img, 1)

for i, det in enumerate(dets):
    shape = predictor(img, det)
    for j in range(68):
        x = shape.part(j).x
        y = shape.part(j).y
        cv2.circle(img, (x, y), 2, (0, 255, 0), -1)

其中,img_path为要处理的图片的路径。首先,使用dlib的get_frontal_face_detector()函数进行人脸检测,返回检测到的人脸的位置。
然后,使用dlib的shape_predictor()函数对每个人脸进行特征点检测,返回68个特征点的位置。
最后,使用cv2库的circle()函数在图像上绘制特征点。
需要注意的是,这里的特征点的编号是从0到67,需要使用part()函数来获取特定编号的特征点。

6、 运行代码,在PyCharm中查看结果。可以使用cv2库的imshow()函数在窗口中显示处理后的图片,例如:

cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

如果在PyCharm中运行时出现错误,可以查看错误信息并尝试解决。如果在终端中运行时特征点功能直接跳过,可以检查代码是否正确,以及face_landmarks的.dat文件是否存在并被正确加载。如果报错说面部编辑器那块儿argument is required,可以检查代码中是否缺少必要的参数,例如图片的路径等。


二、【对于最后的报错信息“.py文件单独运行报错argument is required”】这个问题的解决如下。

根据您提供的报错信息,可以看出是命令行参数不正确导致的。下面是针对报错信息的解释和解决方法:

1. 报错信息中提到了`facial_landmarks.py`,这是您的Python脚本文件名称,可以看出是通过命令行运行的。
2. 报错信息中的`--shape-predictor`是一个命令行参数,应该是用来指定face_landmarks.dat文件的路径。
3. 报错信息中显示`facial_landmarks.py: error: argument -p/--shape-predictor: expected one argument`,这意味着在使用`-p`或`--shape-predictor`参数时,需要提供一个参数值,即face_landmarks.dat文件的路径。
4. 从报错信息中也可以看出,您在运行脚本时没有提供正确的命令行参数,导致程序无法正常执行。

解决方法如下:

  1. 打开命令行窗口(Windows下为cmd),进入到包含您的Python脚本文件的目录中。

  2. 运行以下命令:

    python facial_landmarks.py -p <face_landmarks.dat文件路径> -1 <待检测的人脸图像路径>
    

    上面命令中,请注意替换<face_landmarks.dat文件路径><待检测的人脸图像路径>为实际的文件路径。如果您的face_landmarks.dat文件和待检测的人脸图像文件都在同一目录下,可以直接使用文件名而不用写完整路径。

  3. 运行命令后,您应该能够看到人脸图像上标记了68个特征点的结果。

如果您想在PyCharm中运行脚本,可以按照以下步骤操作:

1. 在PyCharm中打开您的脚本文件。
2. 在PyCharm的顶部菜单栏中选择`Run`->`Edit Configurations`。
3. 在弹出的配置窗口中,选择`Script path`并在右侧选择您的脚本文件。
4. 在`Script parameters`中输入命令行参数,如`-p <face_landmarks.dat文件路径> -1 <待检测的人脸图像路径>`。
5. 点击`OK`保存配置,然后按下`Shift+F10`或点击绿色运行按钮运行脚本。

希望这些信息能够帮助您解决问题。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

引用chatGPT作答,对于在PyCharm中无法查看下载的.dat文件的问题,可以尝试将文件编码格式修改为UTF-8,具体步骤如下:

1.右键点击.dat文件,选择"Open with" -> "Notepad++"(如果没有Notepad++,可以先下载安装)
2.在Notepad++中打开文件后,选择"Encoding" -> "Convert to UTF-8"
3.保存文件,然后在PyCharm中重新打开文件,应该可以正常查看
对于特征点功能直接跳过的问题,可能是由于没有正确调用人脸特征点检测的代码导致的。您可以查看代码中与特征点检测相关的部分是否正确,并确保调用了正确的函数。

对于报错信息中提到的面部编辑器那块儿argument is required,可能是由于代码中使用的人脸检测库需要传入参数而导致的。您可以查看代码中对该库的调用部分,确认传入了必要的参数,并确保参数的格式正确。如果不确定应该传入哪些参数,可以查看该库的文档或示例代码。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,确保你已经安装了dlib库,如果没有安装你需要通过命令行输入以下命令来安装:

pip install dlib

接下来,你可以从dlib的官方页面下载面部标记器的预训练模型 “shape_predictor_68_face_landmarks.dat” 并把它放在与你的程序相同的目录下。

在PyCharm中,你可以通过以下方式导入dlib库:

import dlib

对于你提到的问题: “如果直接在终端中运行,pycharm中乱码无法查看,特征点功能直接跳过,原图进入原图出来.py文件单独运行报错,说面部编辑器那块儿argument is required。”

这是因为你需要为你的程序提供参数。你不仅需要传入图像,而且需要创建一个dlib面部检测器和预测器。这可以通过以下代码完成:

import dlib
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

现在,你可以使用detector对象在图像中检测人脸,并使用predictor对象查找特征点。以下代码解释了如何使用dlib的68个点特征点预测器来检测人脸,并显示特征点:

import cv2
import dlib

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") 

# 读取图像
img = cv2.imread('image.jpg')

# 将图片转为灰度图像
gray = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2GRAY)

# 在灰度图上应用人脸检测器
faces = detector(gray)

# 在每张脸上应用面部特征检测器
for face in faces:
    landmarks = predictor(image=gray, box=face)
    
    # 打印特征点
    for n in range(0, 68):
        x = landmarks.part(n).x
        y = landmarks.part(n).y
        cv2.circle(img=img, center=(x, y), radius=2, color=(0, 255, 0), thickness=-1)

# 显示图像
cv2.imshow(winname="Face", mat=img)

# 等待按键
cv2.waitKey(delay=0)

# 关闭所有窗口
cv2.destroyAllWindows()

在这个例子中,我们使用OpenCV来读取图像,并将其转换为灰度图像。然后,我们使用dlib的人脸检测器来检测图像中的所有人脸。对于每个脸部,我们应用dlib的面部特征检测器来查找68个特征点,并将它们绘制在图像上。

最后,我们使用OpenCV来显示图像,并在用户按下任意键后等待关闭所有窗口。

希望这可以帮助你解决你的问题!
如果我的回答解决了您的问题,请采纳!