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()