对他人的人脸进行采集


import sys
import cv2
import os
# dlib是一个机器学习的开源库,包含了机器学习的很多算法,使用起来很方便。也提供了一些python接口。
import dlib

source_path = './input_img'
faces_other_path = 'other_faces'

size = 64
if not os.path.exists(faces_other_path):
    os.makedirs(faces_other_path)

"""特征提取器:dlib自带的frontal_face_detector"""
detector = dlib.get_frontal_face_detector()


"""os,walk()会返回一个生成器,每次迭代都会返回一个元组,元组返回三个元素,分别是当前目
录(path),当前目录的子目录(dirnames),当前目录的文件(filenames). """

num = 1
for (path, dirnames, filenames) in os.walk(source_path):
    for filename in filenames:
        if filename.endswith('.jpg'):   # 用endswith判断一个文件名是不是以jpg
            print('Being processed picture %s' % num)
            img_path = path+'/'+filename
            img = cv2.imread(img_path)   # 读图片
            # 转为灰度图片
            gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            """ 使用detector进行人脸检测 dets为返回的结果"""
            dets = detector(gray_img, 1)  # 1采样次数

            """--------------------------------------------------------------------
            使用enumerate 函数遍历序列中的元素以及它们的下标,i为人脸序号,d为i对应的元素;
            left:人脸左边距离图片左边界的距离 ;right:人脸右边距离图片左边界的距离 
            top:人脸上边距离图片上边界的距离 ;bottom:人脸下边距离图片上边界的距离
            ----------------------------------------------------------------------"""
            for i, d in enumerate(dets):
                x1 = d.top() if d.top() > 0 else 0
                y1 = d.bottom() if d.bottom() > 0 else 0
                x2 = d.left() if d.left() > 0 else 0
                y2 = d.right() if d.right() > 0 else 0

                face = img[x1:y1,x2:y2]
                face = cv2.resize(face, (size,size))   # 调整图片的尺寸
                cv2.imshow('image',face)
                cv2.imwrite(faces_other_path+'/'+str(num)+'.jpg', face)   # 保存
                num += 1
            # waitKey() 函数的功能是不断刷新图像 , 频率时间为delay , 单位为ms,该函数通常用在显示图像函数之后。
            """参数:delay延时时间,单位ms;
               delay>0时,延迟"delay"ms;
               当delay<=0的时,如果没有键盘触发,则一直等待"""
            key = cv2.waitKey(30)
            if key == 27:
                sys.exit(0)

为什么我最后的图片没有保存在我的指定目录里面

你需要检查你的图片保存路径和文件名是否正确。在你的代码中,你的图片保存路径是 other_faces,这意味着在运行脚本的当前目录下,应该有一个名为 other_faces 的文件夹。如果没有,请确保你已经创建了这个文件夹。然后,请确保文件名是正确的,即保存的文件名应该是数字加上 .jpg 后缀,例如 1.jpg,2.jpg 等,可以使用print语句来检查你的文件名是否正确。如果你的代码在显示图片后无法保存图片,那么你需要检查你的Python工作目录是否有写入权限。为了解决这个问题,可以改变图片保存路径到你能够访问并有写入权限的目录,比如 ./output_img/other_faces 或者 /tmp/other_faces(根据你自己环境的情况改变)。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7743569
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:基于摄像头标定的实际应用
  • 除此之外, 这篇博客: 详解机器人标定中的 分离轴 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    分离轴的设计方式有很多,XY + θ, X+Y θ, X θ+Y….,具体状况具体分析,目的是要找到旋转中心,做好9点标定。

    1.相机非线性校正

    2.相机与机器人做9点标定

    3.计算机器人的旋转中心

    4.相机通过公式计算得出最终的输出结果

    旋转中心方法用于所有机器人与视觉配合场景

    方法:计算工件实际发生的偏移量和旋转量,结合机器人的旋转中心进行二次补偿后,把补偿量

    发送给机器人,然后机器人把补偿量补偿后进行抓取或放置即可;

    计算某个点绕另外一点旋转一定角度后的坐标,如图:

    机器人与视觉标定理论详解

    A(x,y)绕B(rx0,ry0)旋转a度后的位置为C(x0,y0),则有如下关系式:

    x0= cos (a) * (x-rx0) – sin (a) * (y-ry0) +rx0

    y0= cos (a) * (y-ry0) + sin (a) * (x-rx0) +ry0

  • 您还可以看一下 邓俊老师的软件项目管理实战课程中的 课程及自我介绍小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^