《是男人就坚持100秒(DodgeFace)》是一款用面部躲避小球的游戏。通过摄像头捕捉面部,玩家需移动身体或转头躲避飞来的小球。未检测到脸会Game Over,脸像素过小时会变红提示,过小则结束。按r可重开,默认开GPU运行,也可改设为全身躲避,调整球半径即可。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

因为项目需要用到摄像头和显示效果,所以无法在aistudio上直接运行,Fork项目后可见可运行文件,下面直接上效果
参赛作品名
是男人就坚持100秒(DodgeFace)
作品简介
和传统的《是男人就坚持X秒》一样,只不过这次你需要让你的脸来躲避那些飞来的小球
使用方式
> 保证你的脸在摄像头可以拍摄的范围内,运行程序
python DodgeFace.py
> 移动你的身体、转动你的头颅躲避那些飞来的小球
> 如果没检测到你的脸会直接Game Over哦
> 程序中设定了危险像素大小,当你的脸小于某个像素量(dangerPixel)的时候,你的脸会变红,提示你靠近摄像头一点,否则当脸的像素小于最小像素量(minPixel)的时候则会直接Game Over。
> 如果不小心死掉了,按r重新开始,按其他的则退出游戏
一些提示
> 程序默认开启了GPU以保证程序的正常运行,如果没有GPU可能会很卡,咳咳
> 当然可以换成整个人来躲避球,这个只需要改动一行代码就行,不过建议同时改大球的半径,不然我怕你看不清球,哈哈
> 有点忙,还有些优化的地方没有做,之后再补吧,嘻嘻
> 希望大家玩得开心~
# 对两个分割魔性封装了一下,这里可以根据你需要的去选择相应的类class segUtils: def __init__(self): super(segUtils, self).__init__() self.ace2p = hub.Module(name='ace2p') def getMask(self, frame): res = self.ace2p.segmentation([frame], use_gpu=True) if isinstance(res, list): resint = res[0]['data'] resint[resint != 13] = 0 resint[resint == 13] = 1 return resint else: return Noneclass segHuman: def __init__(self): super(segHuman, self).__init__() self.module = hub.Module(name='humanseg_mobile') self.prev_gray = None self.prev_cfd = None def getMask(self, frame, cap=None): if cap is None: res = self.module.segment(images=[frame], use_gpu=True) if isinstance(res, list): return np.around(res[0]['data'] / 255) else: res, gray, cfd = self.module.video_stream_segment(images=frame, frame_id=cap.get(1), use_gpu=True, prev_gray=self.prev_gray, prev_cfd=self.prev_cfd) self.prev_gray = gray self.prev_cfd = cfd res[res = 100] = 1 return res
# 小球的类,因为完全弃用了pygame, 要自己这样写draw了class Ball: x = None y = None speed_x = None speed_y = None radius = None color = None def __init__(self, x, y, speed_x, speed_y, radius, color): self.x = x self.y = y self.speed_x = speed_x self.speed_y = speed_y self.radius = radius self.color = color def draw(self, screen): t,l,b,r = getPIXEL(self.x, self.y, self.radius) if isinstance(self.color, int): screen[t:b,l:r,:] = self.color else: screen[t:b,l:r,0] = self.color[0] screen[t:b,l:r,1] = self.color[1] screen[t:b,l:r,2] = self.color[2] def move(self, screen): self.x += self.speed_x self.y += self.speed_y if self.x > W - self.radius or self.x H - self.radius or self.y
# 小球生成器, 生不生成球,一秒生成几个,都在这里进行控制哦,另外小球的每帧的运动绘制,也在这里def create_ball(): r = 3 color = 0 x, y = randomXY() if inseg(x,y,r+30): x, y = randomXY() speed_x = random.randint(-10, 10) speed_y = random.randint(-10, 10) b = Ball(x, y, speed_x, speed_y, r, color) balls.append(b) def ball_manager(): global showimg global currentIndex global currentTime global lastTime global gm global genTime if currentTime != lastTime: if currentIndex = len(gm): currentIndex = len(gm) - 1 lastTime = currentTime for b in balls: if b.move(showimg): return True return False











