0x00 方案概述,技术栈
深度学习训练模型:YOLOv5框架
图像识别:OpenCV
编程语言:python
IDE:Pycharm
运行环境:Pytorch+CUDA+Anaconda
这篇博客我不会特别具体的讲操作流程,更注重用到的一些函数和库之类的
实现方法大概是:实时截取屏幕,然后通过比对模型来识别截取图片上的CT,T阵营人物。然后获取坐标,传给我们自己写的函数,然后调用操控鼠标的库,实现开枪。
0x01 YOLOv5框架
什么叫yolov5?其实就是 You Only Look Once 意思是这个框架简单到你看一次,或者上手试着用一次你就会了。
V5和V4没有递进关系,两个是独立的框架,不存在哪个最好哪个不好。
首先我们从GitHub上把yolov5的框架clone下来,为了方便,我们使用Ceaser的Csgo-yolov5模型,全是中文备注,更方便我们去训练模型
制作数据集,打标签:
配置环境:
要在本地先查看你的CUDA版本
然后根据一系列信息在官网安装pytorch
首先先在csgo游戏中截取大量游戏过程中的图片
打标签有两种方式:
1:Make Sense在线打标签
2:python的一个库labelimg 使用pip install安装
使用train.py等待完成安装
0x02 实现屏幕截取
api-生成窗口cv2.namedWindow
cv2.namedWindow('csgo-detect', cv2.WINDOW_NORMAL)
函数原型:
void nameWindow(const string& winname,int flags = WINDOW_AUTOSIZE) ;
arg1:新建的窗口的名称。自己随便取
arg2:窗口的标识,一般默认为WINDOW_AUTOSIZE
-
WINDOW_AUTOSIZE 窗口大小自动适应图片大小,并且不可手动更改。(上面图1就是使用的它)
-
WINDOW_NORMAL 用户可以改变这个窗口大小(上面图2就是使用的它)
-
WINDOW_OPENGL 窗口创建的时候会支持OpenGL
api-改变窗口尺寸cv2.resizeWindow
cv2.resizeWindow('csgo-detect', re_x // 3, re_y // 3)
arg1:窗口名
arg2,arg3:位置
api-展示窗口cv2.imshow
cv2.imshow('csgo-detect', img)
arg1:窗口名
arg2:图片
api-等待函数cv2.waitKey
if cv2.waitKey(1) & 0xFF == ord('q'): cv2.destroyAllWindows() break
刚开始只知道加上cv2.waitKey之后cv2.imshow就可以显示图像了
为什么cv2.imshow之后要跟cv2.waitkey
imshow的作用是在GUI里显示一幅图像,但是它有个特点我们没有太注意,就是它的持续时间。
测试后可得
waitkey控制着imshow的持续时间,当imshow之后不跟waitkey时,相当于没有给imshow提供时间展示图像,所以只有一个空窗口一闪而过。添加了waitkey后,哪怕仅仅是cv2.waitkey(1),我们也能截取到一帧的图像。所以cv2.imshow后边是必须要跟cv2.waitkey的。
imshow源码里的注释
This function should be followed by cv::waitKey function which displays the image for specified . milliseconds. Otherwise, it won't display the image.
这个函数之后应接cv2.waitKey函数来显示指定图像。否则,它不会显示图像。
为什么要这么麻烦的设计
This function is the only method in HighGUI that can fetch and handle events, so it needs to be
这个函数是HighGUI窗口中唯一的获取和处理事件的方法,因此它必须存在
cv2.waitKey(1) & 0xFF == ord(‘q’) 的作用
在linux上使用waitkey有时会出现waitkey返回值超过了(0-255)的范围的现象,通过&0xff来解决这个现象
ord是把字符转换成ascii码
cv2.waitkey和time.sleep的区别
有人写在代码时把waitkey当sleep用过,你会发现有时waitkey并不起作用。
官方解释:The function only works if there is at least one HighGUI window created and the window is active
翻译:这个函数只有在至少一个HighGUI窗口存在的情况下才会起作用。
waitkey的延时机制是有条件的,必须在它之前创造HighGUI窗口它才会起作用。而time.sleep是无条件的延时机制。
api-关闭所有窗口destroyAllWindows()
cv2.destroyAllWindows(

最低0.47元/天 解锁文章
1191

被折叠的 条评论
为什么被折叠?



