再发:python+opencv模拟radar的代码步骤详解
1说明:
======
1.1视频版是无声的 , 已发西瓜视频 。
1.2图文版:这里发布 , 讲解代码和注释 。
1.3环境:
python3.8 , 深度操作系统deepin-linux , 微软编辑器vscode , opencv版本4.2.0 。
2.1---第1步:模块导入---
importnumpyasnpimportcv22.2---第2步:颜色定义---这样使后面代码简洁些---
white=(255,255,255)red=(0,0,255)blue=(255,0,0)yellow=(0,255,255)green=(0,255,0)2.3---第3步:初始化画布---
#生成一个w*h的空灰度图像画布
#建议定义一个sizec=画布大小=窗口大小
【再发:python+opencv模拟radar的代码步骤详解】#建议宽和高相等 , 便于后面代码简洁些
sizec=1200#可调节canvas=np.zeros((sizec,sizec,3),np.uint8)2.4---第4步:圆参数---
#---第4步:圆参数---#圆心坐标点位置xc=yc=int(sizec/2)#最小那个同心圆的半径r=100#绘制雷达显示器界面的3个同心圆:小、中、大同心圆cv2.circle(canvas,(xc,yc),r,green,2)cv2.circle(canvas,(xc,yc),2*r,green,2)cv2.circle(canvas,(xc,yc),3*r,green,2)#附加:与扫描半径的最外圆 , 与扫描半径统一cv2.circle(canvas,(xc,yc),int(xc-50),green,2)2.5---第5步:绘制十字线---
#垂直十字线cv2.line(canvas,(50,yc),(sizec-50,yc),yellow,2)cv2.line(canvas,(xc,50),(xc,sizec-50),yellow,2)#交叉十字线#定义坐标x=int(sizec/2-(xc-50)*np.sin(0.25*np.pi))y=int(sizec/2+(xc-50)*np.sin(0.25*np.pi))#第1条斜交叉线start_point1=(x,x)end_point1=(y,y)cv2.line(canvas,start_point1,end_point1,white,1)#第2条斜交叉线start_point2=(x,y)end_point2=(y,x)cv2.line(canvas,start_point2,end_point2,white,1)2.6---第6步:东南西北 , 添加正北指向和距离刻度文字---
font=cv2.FONT_HERSHEY_SIMPLEX#坐标点可以适当调节cv2.putText(canvas,"E",(sizec-20,yc),font,1,white,1)cv2.putText(canvas,"S",(xc,sizec-20),font,1,white,1)cv2.putText(canvas,"W",(5,yc),font,1,white,1)cv2.putText(canvas,"N",(xc,40),font,1,white,1)2.7---第7步:左上角参数---
#添加参数指示文字 , 左上角坐标点x=0 , y=0;#坐标x=10 , 坐标对齐;y=15起 , 间隔20 , 往下排cv2.putText(canvas,"Speed(m/s):",(10,15),font,0.5,white,1)cv2.putText(canvas,"Rotation:",(10,35),font,0.5,white,1)cv2.putText(canvas,"FirstCoordinate(X):",(10,55),font,0.5,white,1)cv2.putText(canvas,"FirstCoordinate(Y):",(10,75),font,0.5,white,1)2.8---第8步:定义函数动态扫描---
#定义绘制扫描辉亮函数 , ang为扫描线所在角度位置defdrawScanner(ang):img=np.zeros((sizec,sizec,3),np.uint8)a=255/60#将颜色值255等分60 , 60为辉亮夹角foriinrange(60):#逐次绘制1度扇形 , 颜色从255到0#绿色余辉:0,255,0cv2.ellipse(img,(xc,yc),(xc-50,yc-50),1,ang-i,ang-i-1,(0-i*a,255-i*a,0-i*a),-1)returnimg2.9---第9步:雷达扫描循环设置---
#初始参数定义#运动目标初始值 , beta飞行角度,speed速度beta=300/180*np.pi#飞行方位角speed=600#飞行速度#点的坐标设置pointStartX=pintEndY=pointEndX=500pointStartY=10i=0delteT=1#目标运动的比例值while(1):i+=1pointStartX+=int(speed*delteT*0.01*np.cos(beta))pointStartY+=-int(speed*delteT*0.01*np.sin(beta))#目标点的运动轨迹 , 第一个1是指线条宽度 , 后一个1线条的粗细 , 差不多#cv2.circle(canvas,(pointStartX,pointStartY),1,blue,1)#目标运动轨迹点#复制雷达界面 , 将目标运动和参数指示绘制在复制图上temp=np.copy(canvas)#目标点 , 10代表圆圈半径大小 , 红色,6代表圆的线条粗细cv2.circle(temp,(pointStartX,pointStartY),10,red,6)#目标点1cv2.circle(temp,(pointStartX-200,pointStartY-200),10,white,4)#目标点2cv2.circle(temp,(pointStartX-400,pointStartY-400),10,yellow,2)#目标点3cv2.circle(temp,(pointStartX-600,pointStartY-600),10,blue,4)#目标点4cv2.circle(temp,(pointStartX-800,pointStartY-800),10,red,6)#目标点5cv2.circle(temp,(pointStartX-1000,pointStartY-1000),10,white,4)#目标点6cv2.circle(temp,(pointStartX-1200,pointStartY-1200),10,yellow,2)#目标点7#这个判断 , 就是从新归位 , 再次依次出现上述目标ifpointStartX>=sizecandpointStartY>=sizec:pointStartX=500pointStartY=10#左上角显示数字字符cv2.putText(temp,str(speed),(200,15),font,0.5,green,1)cv2.putText(temp,str(beta/np.pi*180),(200,35),font,0.5,green,1)#注意坐标点是动态的 , 用红色显示 , 可变坐标cv2.putText(temp,str(pointStartX),(200,55),font,0.5,red,1)cv2.putText(temp,str(pointStartY),(200,75),font,0.5,red,1)#调用函数绘制扫描余辉scanImg=drawScanner(i)blend=cv2.addWeighted(temp,1.0,scanImg,0.6,0.0)#将雷达显示与扫描余辉混合cv2.imshow('PythonOpencvRadar',blend)#cv2显示 , 标题名ifcv2.waitKey(100)==27:#按下ESC键退出break3效果图:
推荐阅读
- 桃树|桃树蚜虫在这两个关键期防治,能管一季不再发生
- 国家医保局|国家医保局:DRG付费试点城市进入模拟运行
- 太阳|挂在窗户上的太阳能灯,能模拟日出日落,在室内种一个太阳|海外黑科技
- 罗谢尔·瓦伦斯基|确诊病例恐将反弹,美疾控中心再发警告:新冠变种或致美国第四次病例激增
- 国防科技大学|对292张图像实现量子行走模拟!国防科大研究登上Science子刊
- 火星|科学家在南极洲建设火星模拟基地?为人类开发殖民火星的“能力”
- 早餐不用再发愁,一根茄子就搞定,简单营养又美味,越吃越想吃
- 新冠疫情|新冠疫情未平,德国科学家再发末日警告:4.2万年前电磁灾难将来袭
- 超级地球|桑迪亚国家实验室模拟超级地球环境,地球不再是唯一?
- 面包别再发酵两次了,学会这做法,一次发酵也柔软,味道不输买的!
