计算机视觉运行人脸识别的时候出现的问题

我从网上down下了一个关于人脸识别的代码,然后导入自己的训练集之后,再运行它就会报错,它显示数组不够,但是我没懂

img

params可能是空序列,也就是说您的


parmas = model.predicr(face)

这句啥也没有获取到就一个空序列。

您在您的print(parmas) 的一行


exit() # 退出程序回到系统界面。或者
input() # 程序暂时等待键盘输入。

看看您的屏幕终端打印了什么!!!


  您的变量parmas没有获取到期望的值,而导致cv2那行对parmas第一个元素的引用parmas[0]“超出下标”,也就是“下标引用溢出”而引发异常提示报错。


这是一个列表索引超出范围的错误

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7801091
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:游戏控制上下左右键的移动
  • 除此之外, 这篇博客: 用字符串的方式看黑人抬棺,我的快乐就这么简单中的 不多说啥废话了,直接给代码吧: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    import cv2
    import subprocess
    from moviepy.editor import *
    from PIL import Image,ImageFont,ImageDraw
    import os
    from cv2 import VideoWriter, VideoWriter_fourcc, imread, resize
    def get_char(r,g,b,alpha = 256):
        ascii_char = list("#RMNHQODBWGPZ*@$C&98?32I1>!:-;. ")
        if alpha == 0:
            return ''
        length = len(ascii_char)
        gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
        unit = (256.0+1)/len(ascii_char)
        return ascii_char[int(gray/unit)]
    
    def video_to_pic(vp,video_path):
        number = 0
        if vp.isOpened():
            video = VideoFileClip(video_path)
            audio = video.audio
            audio.write_audiofile(video_path.split(".")[0]+".mp3")
            r,frame = vp.read()
            if not os.path.exists('cache_pic'):
                os.mkdir('cache_pic')
            os.chdir('cache_pic')
        else:
            r = False
        while r:
            number += 1
            cv2.imwrite(str(number)+'.jpg',frame)
            r,frame = vp.read()
        print('\n由视频一共生成了{}张图片!'.format(number))
        os.chdir("..")
        return number, video_path.split(".")[0]+".mp3"
    
    
    def img_to_char(image_path,raw_width,raw_height,task):
        width = int(raw_width/ 6)
        height = int(raw_height / 15)
        im = Image.open(image_path).convert('RGB')#必须以RGB模式打开
        im = im.resize((width,height),Image.NEAREST)
        txt = ''
        color = []
        for i in range(height):
            for j in range(width):
                pixel = im.getpixel((j, i))
                color.append((pixel[0],pixel[1],pixel[2])) #将颜色加入进行索引
                if len(pixel)==4 :
                    txt +=get_char(pixel[0],pixel[1],pixel[2],pixel[3])
                else:
                    txt +=get_char(pixel[0],pixel[1],pixel[2])
            txt += '\n'
            color.append((255,255,255))
    
        im_txt = Image.new("RGB",(raw_width,raw_height),(255,255,255))
        dr = ImageDraw.Draw(im_txt)
        font = ImageFont.load_default().font
        x,y = 0,0
        font_w,font_h=font.getsize(txt[1])
        font_h *= 1.37 #调整字体大小
        for i in range(len(txt)):
            if(txt[i]=='\n'):
                x += font_h
                y = -font_w
            dr.text((y,x),txt[i] ,fill = color[i])
            y+=font_w
        os.chdir('cache_char')
        im_txt.save(str(task)+'.jpg')
        os.chdir("..")
        return 0
    
    
    def star_to_char(number,save_pic_path):
        if not os.path.exists('cache_char'):
            os.mkdir('cache_char')
        img_path_list = [save_pic_path + r'/{}.jpg'.format(i) for i in range(1,number+1)] #生成目标图片文件的路径列表
        task = 0
        for image_path in img_path_list:
            img_width , img_height = Image.open(image_path).size   #获取图片的分辨率
            task += 1
            img_to_char(image_path, img_width , img_height, task)
            print('{}/{} is finished.'.format(task,number))
        print('=======================')
        print('All image was finished!')
        print('=======================')
        return 0
    
    def jpg_to_video(char_image_path,FPS):
        video_fourcc=VideoWriter_fourcc(*"MP42")  # 设置视频编码器,这里使用使用MP42编码器,可以生成更小的视频文件
        char_img_path_list = [char_image_path + r'/{}.jpg'.format(i) for i in range(1,number+1)] #生成目标字符图片文件的路径列表
        char_img_test = Image.open(char_img_path_list[1]).size   #获取图片的分辨率
        video_writter= VideoWriter('video/new_char_video.mp4' , video_fourcc , FPS , char_img_test)
        load = 'loading'
        count = 0 #用来清空load进度条的计数
        for image_path in char_img_path_list:
            img = cv2.imread(image_path)
            video_writter.write(img)
            load = load + '.'
            count += 1
            if count % 50 == 0 :
                load = 'loading'
                print()
            print('\r',load,end='')
        video_writter.release()
        print('\n')
        print('=======================')
        print('The video is finished!')
        print('=======================')
        return 'video/new_char_video.mp4'
    
    def video_add_mp3(file_name, mp3_file):
        outfile_name = file_name.split('.')[0] + '-finish.mp4'
        subprocess.call('ffmpeg -i ' + file_name
                        + ' -i ' + mp3_file + ' -strict -2 -f mp4 '
                        + outfile_name, shell=True)
    
    if __name__ == '__main__':
        video_path = 'video/video.mp4'
        save_pic_path = 'cache_pic'
        save_charpic_path = 'cache_char'
    
        vp = cv2.VideoCapture(video_path)
        number, mp3_file = video_to_pic(vp,video_path)
        FPS = vp.get(cv2.CAP_PROP_FPS)
        star_to_char(number , save_pic_path)
        vp.release()
        file_name = jpg_to_video(save_charpic_path,FPS)
        video_add_mp3(file_name, mp3_file)
    
  • 您还可以看一下 MDCC2016老师的移动直播技术专场:百万弹幕下的直播礼物系统课程中的 百万弹幕下的直播礼物系统(上)小节, 巩固相关知识点

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

我懂了,是数组的问题,数组下标是从0开始引用的,但是我的名字是从1开始定义的,一共16个名字但是数组下标最后一个是15所以它报错了