从视频中获取发丝都能看见的人体步态轮廓图

从视频中获取发丝都能看见的人体步态轮廓图

​编辑写在前面

实现代码: 

        前言

        代码 

后话:


写在前面

         最近在研究步态识别,复现了相关的论文算法:比较火的GaitSet等,也从网上下载了中科大开源的数据集CASIA-B进行训练,一切看起来都是那么的美好!

        但是,当我自己制作了视频数据集之后,却不知道怎么转换为CASIA-B中一样的二值人体轮廓图,网上告知的是用实例分割办法,我尝试使用Mask-RCNN搭建了实例分割平台,并且进行了测试,最终的效果却非常的不尽人意:转换出来的二值轮廓图轮廓模糊不清晰,完全无法与05年的CASIA-B比较,更别说更新的数据集了,这可怎么办呢?

         深度学习这个方法行不通之后,我把目光放在了机器学习,最后发现了一个非常棒的办法:背景减除法

        先附上一张效果图:

从视频中获取发丝都能看见的人体步态轮廓图_第1张图片

        可以看到,效果非常的nice!因为只有一张图片,所以效果展示的也不够完全,实际上如果是视频,我们甚至可以看到发丝的飘动! 

        !!!警告:拍摄的摄像头不可以动!!!具体原因是因为背景减除法的原理就是把不动的东西删掉!

        !!!警告:拍摄的摄像头不可以动!!!具体原因是因为背景减除法的原理就是把不动的东西删掉!

        !!!警告:拍摄的摄像头不可以动!!!具体原因是因为背景减除法的原理就是把不动的东西删掉!

实现代码: 

        前言

        大家看到这里,会不会觉得:哇!效果和博主说的一样好的话,那代码是不是非常复杂呀?这才是最令人激动的,在此感谢方便的OpenCv,不用搭配复杂环境,不用复现复杂函数,只需要简单的一个调用。就可以实现我上述的功能!

        对于实验过程,在我尝试过

BackgroundSubtractorCNT、BackgroundSubtractorGMG、BackgroundSubtractorGSOC、BackgroundSubtractorLSBP、BackgroundSubtractorMOG、 BackgroundSubtractorMOG2、BackgroundSubtractorKNN等众多方式后,

        实验结果表明,对于人体轮廓图的提取,表现效果最好的是:BackgroundSubtractorMOG!

        提醒一句

        上述的Opencv是opencv_contrib!

        上述的Opencv是opencv_contrib!

        上述的Opencv是opencv_contrib!

        代码 

        由于机器学习的这个代码有个缺陷就是前面几张乃至十几张效果有时候会非常不好,所以我们只选用中间30%到70%的质量比较高的图片。

import os.path
import cv2
# ---------------------------

def from_video_get_img(video_path):
    print(video_path)
    print(video_path + ' Is Loading...')

    # 创建存放结果图片的文件
    save_file_name = video_path.split('/')[-1].split('.')[0]
    save_fgmask_path = 'Package/Fgmask/' + save_file_name + '/'
    if not os.path.exists(save_fgmask_path):
        os.makedirs(save_fgmask_path)

    # 读取视频
    cap = cv2.VideoCapture(video_path)
    if cap.isOpened():
        # best>MOG
        fgbg = cv2.bgsegm.createBackgroundSubtractorMOG()
        fgmask_img_list = []
        id = 0
        flag = True
        while flag:
            ret, frame = cap.read()
            if ret:
                fgmask = fgbg.apply(frame)

                fgmask_img_list.append(fgmask)

                id += 1
                cv2.imshow('frame', fgmask)
                cv2.waitKey(1)
            else:
                break
    cap.release()
    cv2.destroyAllWindows()
    # 写入中间30%-70%的图片张以确保质量
    length = len(fgmask_img_list)
    for i in range(int(length*0.3), int(length*0.7)+1):
        cv2.imwrite(save_fgmask_path+str(i)+'.png', fgmask_img_list[i])

if __name__ == "__main__":
    # 在此强调 video 一定要改名为:名字代号_走路状态_序号.视频类型 的格式,不然程序会报错
    # 如果想要不报错 请修改 save_file_name 这个变量的赋值过程
    from_video_get_img('video/2/tds_nm_03.MOV')

后话:

        希望的写的文章能帮助大家!

        整体项目可以看这篇博客:https://blog.csdn.net/qq_51831335/article/details/124319777?spm=1001.2014.3001.5502

你可能感兴趣的:(步态识别,java,开发语言)