当前热点-在 Python 中使用 OpenCV 构建 Color Catcher 游戏
介绍
【资料图】
你是否曾经想在 Python 中使用 OpenCV 创建自己的游戏?
今天我们将构建一个名为 Color Catcher 的游戏,该游戏挑战玩家使用手部跟踪机制接住从屏幕顶部掉落的彩球。
设置游戏窗口
构建游戏的第一步是使用 OpenCV 设置游戏窗口。我们将定义窗口大小、创建窗口并设置其在屏幕上的位置:
#Setupthegamewindow
window_size=(640,480)
window_name="ColorCatcher"
cv2.namedWindow(window_name)
cv2.moveWindow(window_name,0,0)
定义游戏对象
接下来,我们将定义游戏对象。在 Color Catcher 中,我们有两个主要的游戏对象:捕手和球。
捕手是玩家用手移动的矩形,而球是从屏幕顶部落下的随机生成的圆圈。我们将定义这些游戏对象的属性:
#Setupthegameobjects
catcher_color=(0,0,255)
catcher_width=100
catcher_height=20
catcher_position=np.array([window_size[0]//2,window_size[1]-catcher_height],dtype=int)
catcher_velocity=np.array([10,0],dtype=int)
ball_radius=20
ball_speed=5
ball_colors=[(0,255,0),(255,0,0),(0,0,255)]
balls=[]
score=0
从网络摄像头捕获视频
为了跟踪玩家的手部动作,我们需要使用 OpenCV 从网络摄像头捕获视频。
我们将创建一个视频捕获设备并循环播放视频的每一帧:
#Setupthevideocapturedevice
cap=cv2.VideoCapture(0)
whileTrue:
#Readaframefromthevideocapturedevice
ret,frame=cap.read()
ifnotret:
break
检测玩家的手
为了跟踪玩家的手部动作,我们将使用 OpenCV 的轮廓检测功能。首先,我们将每个帧转换为灰度并应用阈值以便更容易检测轮廓:
#Converttheframetograyscaleandapplyathreshold
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
_,thresh=cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
接下来,我们将在阈值图像中找到轮廓,并确定面积最大的轮廓,这应该是玩家的手:
#Findthecontoursinthethresholdedimage
contours,_=cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
#Findthecontourwiththelargestarea,whichshouldbethehand
ifcontours:
hand_contour=max(contours,key=cv2.contourArea)
hand_hull=cv2.convexHull(hand_contour)
hand_center=np.mean(hand_contour,axis=0,dtype=int)[0]
移动捕手
一旦我们检测到玩家手的位置,我们就可以相应地移动捕手。
在代码中,我们检查手中心的 x 坐标并将其与接球手位置的 x 坐标进行比较。如果手在接球手的左侧,我们通过从接球手的当前位置减去接球手的速度,将接球手向左移动。如果手在捕手的右侧,我们通过将捕手的速度添加到其当前位置来将捕手移动到右侧。
ifhand_center[0]
catcher_position-=catcher_velocity
elifhand_center[0]>catcher_position[0]+catcher_widthandcatcher_position[0]+catcher_width catcher_position+=catcher_velocity 生成和移动球: 如果当前比赛中的球数少于五个,我们将生成具有随机颜色和位置的新球。我们将包含球的颜色、位置和速度的元组附加到balls列表中。 iflen(balls)<5: ball_color=random.choice(ball_colors) ball_position=np.array([random.randint(ball_radius,window_size[0]-ball_radius),0],dtype=int) ball_velocity=np.array([0,ball_speed],dtype=int) balls.append((ball_color,ball_position,ball_velocity)) 然后我们遍历balls列表中的每个球,通过将其速度添加到其当前位置来更新其位置,并检查它是否与接球手发生碰撞或击中游戏窗口的底部。 如果球与接球手发生碰撞,我们将其从balls列表中移除,增加玩家的得分,然后跳出循环。 如果球击中了游戏窗口的底部,我们将其从balls列表中移除并跳出循环。 foriinrange(len(balls)): balls[i]=(balls[i][0],balls[i][1]+balls[i][2],balls[i][2]) ball_position=balls[i][1] ifball_position[1]+ball_radius>=catcher_position[1]and ball_position[0]>=catcher_position[0]and ball_position[0]<=catcher_position[0]+catcher_width: balls.pop(i) score+=1 break elifball_position[1]+ball_radius>=window_size[1]: balls.pop(i) break 绘制游戏对象: 最后,我们使用cv2.rectangle()和cv2.circle()函数在框架上绘制游戏对象。我们使用np.zeros()创建一个黑色框架,将捕手绘制为红色矩形,并将每个球绘制为彩色圆圈。 我们还使用cv2.putText()函数在框架的左上角显示玩家的分数。 frame=np.zeros(window_size+(3,),dtype=np.uint8) cv2.rectangle(frame,tuple(catcher_position),tuple(catcher_position+np.array([catcher_width,catcher_height])),catcher_color,-1) forballinballs: cv2.circle(frame,tuple(ball[1]),ball_radius,ball[0],-1) cv2.putText(frame,"Score:{}".format(score),(10,30),cv2.FONT_HERSHEY_SIMPLEX,1,(255,255,255),2) cv2.imshow(window_name,frame) 退出游戏: 最后,游戏循环包含在while循环中。在这个循环中,执行以下任务: 使用cap.read()方法从视频捕获设备读取新帧。处理框架以检测手区域并相应地移动捕手。如有必要,将生成一个具有随机颜色和位置的新球。球被移动并检查是否与接球手发生碰撞。游戏对象绘制在框架上。框架显示在屏幕上。循环继续,直到用户按下“q”键。 按“q”键可以退出游戏。这是使用cv2.waitKey()方法完成的,该方法等待键盘事件的给定毫秒数。如果按键被按下,该方法返回按键的 ASCII 代码,如果没有按键被按下,则返回 -1。 我们使用按位与运算符 ( &) 提取结果的最低有效 8 位,这为我们提供了按 256 模的按下键的 ASCII 代码。我们将此值与 "q" 键 ( ord("q")) 的 ASCII 代码进行比较,如果匹配则退出循环。 #Exitthegameiftheuserpressesthe"q"key ifcv2.waitKey(1)&0xFF==ord("q"): break 退出循环后,我们分别使用cap.release()和cv2.destroyAllWindows()方法释放视频捕获设备并关闭游戏窗口。 #Releasethevideocapturedeviceandclosethegamewindow cap.release() cv2.destroyAllWindows() 就是这样!你现在应该能够运行代码并玩游戏了。这个游戏是一个简单的例子,说明了如何使用计算机视觉来实时控制游戏对象的移动。当然,还有很大的改进和优化空间,但这应该足以让你入门。 编码愉快! 完整代码: https://github.com/Yaga987/Computer-Vision/blob/main/CompVisGame.py 标签:

当前热点-在 Python 中使用 OpenCV 构建 Color Catcher 游戏
2023-05-19

【爱新疆 游首府】单株看牡丹 花海观芍药 乌鲁木齐市种苗场赏花“盛宴”邀你打卡-天天快讯
2023-05-19

蜜源官方邀请码是多少
2023-05-19

国内首次二氧化碳管道全尺寸爆破试验成功 实时
2023-05-19

当日快讯:推特致函微软,称后者可能违反API使用政策|今日热议
2023-05-19

债务上限谈判现曙光 美股纳指收涨1.51% 今亮点
2023-05-19

天天快看点丨5月18日醋酐产业链价格汇总
2023-05-19

2022年山东公共资源交易完成交易额1.88万亿元 焦点速读
2023-05-19

阻止广告弹窗设置 怎么阻止电脑广告弹窗
2023-05-19

单份文件归档方法中(ldquo 不要迷恋哥 哥只是个传说 rdquo 出自哪里)-世界热门
2023-05-19
【爱新疆 游首府】单株看牡丹 花海观芍药 乌鲁木齐市种苗场赏花“盛宴”邀你打卡-天天快讯
蜜源官方邀请码是多少
国内首次二氧化碳管道全尺寸爆破试验成功 实时
当日快讯:推特致函微软,称后者可能违反API使用政策|今日热议
债务上限谈判现曙光 美股纳指收涨1.51% 今亮点
天天快看点丨5月18日醋酐产业链价格汇总
2022年山东公共资源交易完成交易额1.88万亿元 焦点速读
阻止广告弹窗设置 怎么阻止电脑广告弹窗
单份文件归档方法中(ldquo 不要迷恋哥 哥只是个传说 rdquo 出自哪里)-世界热门
婆娑的意思图片_婆娑的意思|全球微头条
每日快播:5月18日基金净值:华夏中证5G通信主题ETF联接A最新净值0.933,涨2.58%
itat证书查询网址_itat证书查询|今日关注
俄罗斯莫斯科发现高致病性禽流感病例|视点
快消息!新开山_关于新开山简介
爵士音乐的特点是什么一句话概括_爵士音乐的特点 天天新消息
世界讯息:北控水务集团(00371):北控杭州获授1.4亿元贷款融资
5·19中国旅游日上海佘山国家森林公园成人票半价_当前热闻
手机可以挂机网络游戏推荐 挂机玩随时收资源_速看
任敏丁禹兮“喜提”金扫帚奖,赵非获奖,最令人失望导演最该反思-热推荐
华阳变速:公司通过竞标现已中标比亚迪部分产品,尚需签订正式的采购合同,并经过试制、验证等环节才能实现销售收入
澄迈房产买了会后悔?半岛·海洋国际“候鸟”良心答案!
工伤认定期限是多长时间?过了工伤认定期限怎么办?
2023年甘南社保个人和单位缴纳多少钱一个月?甘南社保个人缴费标准 环球热消息
信用卡不给办理停息挂账怎么办?停息挂账公司怎么收费?_天天消息
全球微速讯:花生二烯酸(C20:2)检测
湖北大冶:认真调研自我“诊断” 找准服务群众“良方”_全球要闻
莫扎特死亡真相是什么?因为什么疾病而死的? 环球微速讯
热门:迷你世界礼包码领取永久2023迷你币有效_迷你世界礼包
4艘中国护卫舰全部交付,巴基斯坦喜提新舰,印度航母要睡不着了


- 天天热点评!第三季度西欧PC市场遇冷:笔记本电脑、台式机和工作站总出货量同比下降22%
- 捷强装备(300875.SZ):减持期已过半、中金卓誉未减持公司股份_热门看点
- 国家卫健委:19日新增本土确诊2656例
- 用于65W电源应用的超低待机能耗方案
- 达意隆:公司的机器人产品主要应用于食品、饮料、日化等行业
- “大胃王”创始人被批捕,吃播界的“卷”仍在继续
- 福将!迪马利亚第63分钟被换下:国家队生涯谢幕,自1966年以来,首位在世界杯决赛制造点球和进球的球员
- 浓眉25+8摔伤惊魂仍坚持 他一下场湖人攻防全崩
- 要闻速递:塔里木油田:“北气南调”保供南疆
- 【天天新要闻】中鼎股份: 关于获得供应商项目定点书的公告
- 环球视点!异动快报:长江通信(600345)5月18日10点51分触及涨停板
- 热议:2023内蒙古农业大学职业技术学院招聘人员笔试成绩查询等有关事宜公告
- 兰大二院举办“世界高血压日”义诊宣传活动 全球热点
- 环球关注:云南思茅警方破获一起重大非法经营案
- 世界时讯:美国空天战机x37b_美军的X 37B是空天战斗机吗 它主要执行什么任务
- 大学四年满绩点!北工大小伙实力追梦的样子,真帅! 世界速看料
- 新鲜丝瓜过夜如何保存 新鲜丝瓜怎么保存 当前速看
- 美媒:想造电动汽车电池,中国绕不开|天天热消息
- 1976年的9月9号是什么(1976年9月9日是什么日子) 焦点
- Gartner:2023年全球半导体收入将下降11.2%-每日资讯
- 环球关注:汉语语法知识大全全集_汉语语法知识大全
- 北京回龙观的邮政编码_北京长平区回龙观西大街琥珀天地邮政编码是? 天天短讯
- 微信游戏的第一次对外联动,竟然给了米哈游?
- 广汇物流: 广汇物流股份有限公司第九届监事会2023年第四次会议决议公告
- 世界报道:中亚首家鲁班工坊:中国职业教育的“新名片”
- 动车车次查询厦门 动车车次查询|天天报资讯
- 全球观点:威奥股份(605001.SH):乌兰察布太证拟清仓式减持合计不超过143.11万股
- qq购物号_qq怎么申请购物号
- ai怎么填充专色颜色 ai吸管工具怎么填充
- 当前资讯!脱脂奶粉与全脂奶粉的区别在哪里_脱脂奶粉与全脂奶粉有何不同
- 微头条丨应用现代化,成就高质量增长的现代化企业
- 2023中国房地产上市公司研究成果发布会 | 5月18日14:00!欢迎围观
- 环球热点!社区养老保险介绍_社区养老保险资料
- 消息称三星仅部分 Galaxy 手机可获得安卓 14 Ultra HDR 功能
- 头上又是一片绿?旺达再次晒出和绯闻对象歌手甘特的合照..._热点聚焦
- 5月17日 13:39分 三丰智能(300276)股价快速拉升|全球观察
- 世界球精选!厦门信达免税商场总经理_厦门信达免税商场
- 当前焦点!中信证券:预计锂价反弹行情将延续 关注锂价上涨带来的板块估值修复
- 国家能源集团常州电厂2×100万千瓦机组扩建项目汽机胶球清洗设备采购招标 世界新消息
- 齐鲁银行04月19日获沪股通增持53.31万股
- 天天看点:南方较强降雨南移 北方高温范围明显缩减
- 环球动态:我的世界怎么做火箭大炮 我的世界怎么做火箭
- 统计局:4月一线城市商品住宅销售价格同比上涨、二三线城市同比降势趋缓 今日精选
- 天天简讯:“二阳潮”来了?不是感冒是新冠,6个症状,八成是中招了,建议提前了解
- 每日看点!2023年4月长租公寓市场报告
- 世界即时:搭上中老铁路,“榴莲自由”不远了
- 世界观点:低利率来袭 增额终身寿险咨询量显著增加
- 女性如何健康度过更年期?专家建议早期医疗干预-焦点讯息
- 詹姆斯:早知道马龙会成为主教练 我还在他父亲手下打过球
- 计算器上rad和deg是什么意思_tan60 deg 什么意思
- 每日消息!淘宝卖家限购怎么取消_青岛2018取消限购时间
- 全球新资讯:山西省2023年4月高等教育自学考试成绩查询的公告
- 天天快讯:epic显示网络连接问题 虚幻引擎报错的解决办法
- 200余人达成就业意向!“中小企业百日校招”走进重庆理工大学
- 世界微资讯!意媒:那不勒斯与米兰争镰田大地,若失败将与米兰尤文争巴尔丹齐
- 王卫11.8亿转卖丰网,顺丰的快递版图还是缺角?
- 世界快看点丨广道数字:订单签署及执行情况良好 将加强在AI等领域的布局
- 今日热门!骑游北京,边骑边逛!21条北京文旅骑游线路发布
- 信号山:频收罚单、多项投诉指标位居第一 平安银行如何破局? 全球快资讯
- 头条焦点:肖质彬调研永州市红十字重点工作