Opencv+python 零基础入门作业(二)

题目:在作业1的基础上画一个小球(通过键盘输入小球半径和颜色),让其沿着空心圆的路径运动一周,窗口显示小球运动的动态效果,并将小球运动的过程录成一个视频文件保存到硬盘

备注:作业一:读入一幅图像,在上面画一个空心圆(通过键盘输入圆心坐半径和颜色值),窗口显示画圆前后的效果,并保存画圆之后的图像到硬盘上为一个新的图像文件。

 

一开始的思路是制作的小球绕这个圆的路径分为四分,奈何自己数学功底不够,弄不出来,还是选择了bresenham算法,把小球的圆心当做是上一题要画的点,那么半径就是这两个圆的半径之和

分成8份开始运动,注意他们的编码格式,用了8个循环画出来,代码就显得很长,最后制作视频的时候再循环读取,我发现图片格式与视频格式不一致时制作的视频是打不开的,不知道能不能解决

  1 #测试用例:圆心坐标(100,100) 圆半径:50,圆颜色(255,0,0)
  2 #小球半径25,小球颜色(0,255,0)
  3 
  4 import numpy as np
  5 import time
  6 import cv2
  7 
  8 img = cv2.imread('1.jpg')
  9 (center_x,center_y) = eval(input("请输入圆心坐标(输入格式为:(x,y)):"))
 10 r = eval(input("请输入大圆的半径:"))
 11 color1 = eval(input("请输入大圆颜色(用三原色格式):"))
 12 cv2.circle(img,(center_x,center_y),1,color1,-1)   #画圆心
 13 (x,y)=(r,0)  #起始点
 14 d=3-2*r
 15 
 16 while x>=y:    #在y=x这条直线上绘画结束
 17     cv2.circle(img,(center_x+x,center_y+y),1,color1,1) 
 18     cv2.circle(img,(center_x+x,center_y-y),1,color1,1)   
 19     cv2.circle(img,(center_x-x,center_y+y),1,color1,1)    
 20     cv2.circle(img,(center_x-x,center_y-y),1,color1,1)    
 21     cv2.circle(img,(center_y+y,center_x+x),1,color1,1)    
 22     cv2.circle(img,(center_y+y,center_x-x),1,color1,1)    
 23     cv2.circle(img,(center_y-y,center_x+x),1,color1,1)
 24     cv2.circle(img,(center_y-y,center_x-x),1,color1,1)
 25     
 26     if d>=0:         #朝西北方向移动
 27         d=d+4*y-4*x+10
 28         x=x-1       
 29     else:           #朝正北方向移动
 30         d=d+4*y+6  
 31     y=y+1            #像素点朝北移动
 32 
 33 cv2.imwrite('2.jpg',img)  #保存画完圆的图
 34 
 35 
 36 #作业一与作业二分界线
 37 
 38 r2 = eval(input("请输入小圆的半径:"))
 39 color2 = eval(input("请输入小圆颜色(用三原色格式):"))
 40 r=r+r2  #实际上是小圆的圆心是大圆+小圆的半径组成,他的路径是这个圆的弧
 41 (x,y)=(r,0)  #起始点
 42 d=3-2*r
 43 picnum = 0
 44 
 45 while x>=y:    
 46     img2 = cv2.imread('2.jpg') 
 47     cv2.circle(img2,(center_x+x,center_y+y),r2,color2,-1)
 48     picnum=picnum+1 
 49     filename='D:/pythontest/'+str(picnum)+'.jpg'  #图片保存路径
 50     cv2.imwrite(filename,img2)
 51     if d>=0:         
 52         d=d+4*y-4*x+10
 53         x=x-1       
 54     else:           
 55         d=d+4*y+6  
 56     y=y+1
 57 
 58 total=picnum
 59 
 60 (x,y)=(r,0)  
 61 d=3-2*r
 62 picnum = total*2 +1 
 63     
 64 while x>=y:    
 65     img2 = cv2.imread('2.jpg') 
 66     cv2.circle(img2,(center_y+y,center_x+x),r2,color2,-1)
 67     picnum=picnum-1
 68     filename='D:/pythontest/'+str(picnum)+'.jpg'  #图片保存路径
 69     cv2.imwrite(filename,img2)
 70     if d>=0:         
 71         d=d+4*y-4*x+10
 72         x=x-1       
 73     else:           
 74         d=d+4*y+6  
 75     y=y+1
 76 
 77 (x,y)=(r,0)  
 78 d=3-2*r
 79 picnum = total*2 +1
 80 while x>=y:    
 81     img2 = cv2.imread('2.jpg') 
 82     cv2.circle(img2,(center_y-y,center_x+x),r2,color2,-1)
 83     picnum=picnum+1
 84     filename='D:/pythontest/'+str(picnum)+'.jpg'  #图片保存路径
 85     cv2.imwrite(filename,img2)
 86     if d>=0:         
 87         d=d+4*y-4*x+10
 88         x=x-1       
 89     else:           
 90         d=d+4*y+6  
 91     y=y+1
 92 
 93 
 94 (x,y)=(r,0)  
 95 d=3-2*r
 96 picnum = total*4 +3
 97 while x>=y:    
 98     img2 = cv2.imread('2.jpg') 
 99     cv2.circle(img2,(center_x-x,center_y+y),r2,color2,-1)
100     picnum=picnum-1
101     filename='D:/pythontest/'+str(picnum)+'.jpg'  #图片保存路径
102     cv2.imwrite(filename,img2)
103     if d>=0:         
104         d=d+4*y-4*x+10
105         x=x-1       
106     else:           
107         d=d+4*y+6  
108     y=y+1
109 
110 (x,y)=(r,0)  
111 d=3-2*r
112 picnum = total*4 +4
113 while x>=y:    
114     img2 = cv2.imread('2.jpg') 
115     cv2.circle(img2,(center_x-x,center_y-y),r2,color2,-1)
116     picnum=picnum+1
117     filename='D:/pythontest/'+str(picnum)+'.jpg'  #图片保存路径
118     cv2.imwrite(filename,img2)
119     if d>=0:         
120         d=d+4*y-4*x+10
121         x=x-1       
122     else:           
123         d=d+4*y+6  
124     y=y+1
125     
126 (x,y)=(r,0)  
127 d=3-2*r
128 picnum = total*6 +5
129 while x>=y:    
130     img2 = cv2.imread('2.jpg') 
131     cv2.circle(img2,(center_y-y,center_x-x),r2,color2,-1)
132     picnum=picnum-1
133     filename='D:/pythontest/'+str(picnum)+'.jpg'  #图片保存路径
134     cv2.imwrite(filename,img2)
135     if d>=0:         
136         d=d+4*y-4*x+10
137         x=x-1       
138     else:           
139         d=d+4*y+6  
140     y=y+1
141 
142 (x,y)=(r,0)  
143 d=3-2*r
144 picnum = total*6 +6
145 while x>=y:    
146     img2 = cv2.imread('2.jpg') 
147     cv2.circle(img2,(center_y+y,center_x-x),r2,color2,-1)
148     picnum=picnum+1
149     filename='D:/pythontest/'+str(picnum)+'.jpg'  #图片保存路径
150     cv2.imwrite(filename,img2)
151     if d>=0:         
152         d=d+4*y-4*x+10
153         x=x-1       
154     else:           
155         d=d+4*y+6  
156     y=y+1
157 
158 
159 (x,y)=(r,0)  
160 d=3-2*r
161 picnum = total*8 +7
162 while x>=y:    
163     img2 = cv2.imread('2.jpg') 
164     cv2.circle(img2,(center_x+x,center_y-y),r2,color2,-1)
165     picnum=picnum-1
166     filename='D:/pythontest/'+str(picnum)+'.jpg'  #图片保存路径
167     cv2.imwrite(filename,img2)
168     if d>=0:         
169         d=d+4*y-4*x+10
170         x=x-1       
171     else:           
172         d=d+4*y+6  
173     y=y+1
174     
175 print("视频素材制作完成")
176 
177 
178 
179 
180 fourcc = cv2.VideoWriter_fourcc(*'XVID') 
181 
182 fps = 30  
183 size = (1152,648)  # 需要转为视频的图片的尺寸,我发现图片尺寸与这个不一致制作的视频不能播放,不知道怎么觉得
184 # 可以使用cv2.resize()进行修改
185 
186 video = cv2.VideoWriter('C:/Users/aa/Desktop/test.avi', fourcc,int(fps), size)  #保存到桌面
187 
188 
189 
190 picnum=8*total+7
191 
192 while picnum>=1:
193     path = 'D:/pythontest/'+str(picnum)+'.jpg'
194     img = cv2.imread(path)
195     video.write(img)
196     picnum=picnum-1
197 video.release()
198 print("视频制作完毕")
199 
200 
201 
202 cap = cv2.VideoCapture("test.avi")
203 while cap.isOpened():
204     ret, frame = cap.read()
205     if ret:
206         cv2.imshow("frame", frame)
207     else:
208         print("视频播放完成!")
209         break
210     key = cv2.waitKey(25)
211     if key == 27:  # 按键esc
212         break
213 cap.release()
214 cv2.destroyAllWindows()        

 

posted @ 2021-07-06 11:25  橘某  阅读(118)  评论(0)    收藏  举报