【1】引言
前序已經學習了python+opencv畫線段、圓形、矩形、多邊形和文字的相關操作,具體文章鏈接包括且不限于:
python學opencv|讀取圖像(十八)使用cv2.line創造線段_cv2. 畫線段-CSDN博客
python學opencv|讀取圖像(二十二)使用cv2.polylines()繪制多邊形-CSDN博客
python學opencv|讀取圖像(二十五)使用cv2.putText()繪制文字進階-垂直鏡像文字-CSDN博客
在此基礎上,我們更進一步,嘗試繪制會動的彈球。
【2】技術分析
要想繪制彈球,首先要繪制圓形,所以要充分掌握繪制圓形的操作:
python學opencv|讀取圖像(二十)使用cv2.circle()繪制圓形_cv2.circle()函數-CSDN博客
在此基礎上,我們需要通過使用循環函數來創建動態的圓心,比如常見的while()函數。
然后我們還要用time()函數還控制輸出幀率,這樣才能看到動畫。
【3】代碼測試
首先我們給出完整代碼,然后再詳細分析:
import cv2 as cv # 引入CV模塊
import time #引入time模塊
import numpy as np #引入numpy模塊width,height=500,500 #輸入畫布大小
r=20 #設定圓心大小
x=r+200 #設定初始X軸坐標
y=r+200 #設定初始Y軸坐標
x_v=y_v=5 #設定初始移動速度while cv.waitKey(1)==-1:if x>0.85*(width) or x<0.15*(width): #在畫布寬度(15%-85%)的區間內,彈球可直線運行x_v *=-1 #在畫布寬度的15%或者85%的位置,彈球將反向直線運行if y > 0.85*(height) or y < 0.15*(height) : #在畫布高度(15%-85%)的區間內,彈球可直線運行y_v *= -1 #在畫布高度的15%或者85%的位置,彈球將反向直線運行x+=x_v #圓心x隨著速度變化y+=y_v #圓心y隨著速度變化canvas=np.ones((width,height,3),np.uint8)*255 #繪制畫布cv.circle(canvas,(x,y),r,(255,0,0),-1) #繪制圓形#cv.imshow('qiuqiu', canvas) # 在屏幕展示繪制圓形的效果time.sleep(1/1500) #每秒1500幀#cv.waitKey() # 圖像不會自動關閉
cv.destroyAllWindows() # 釋放所有窗口
首先是引入相關模塊:
import cv2 as cv # 引入CV模塊 import time #引入time模塊 import numpy as np #引入numpy模塊
然后約定好繪制圓形的初始數據:
width,height=500,500 #輸入畫布大小 r=20 #設定圓心大小 x=r+200 #設定初始X軸坐標 y=r+200 #設定初始Y軸坐標 x_v=y_v=5 #設定初始移動速度
然后使用while函數創造會反向的彈球:
while cv.waitKey(1)==-1:if x>0.85*(width) or x<0.15*(width): #在畫布寬度(15%-85%)的區間內,彈球可直線運行x_v *=-1 #在畫布寬度的15%或者85%的位置,彈球將反向直線運行if y > 0.85*(height) or y < 0.15*(height) : #在畫布高度(15%-85%)的區間內,彈球可直線運行y_v *= -1 #在畫布高度的15%或者85%的位置,彈球將反向直線運行x+=x_v #圓心x隨著速度變化y+=y_v #圓心y隨著速度變化canvas=np.ones((width,height,3),np.uint8)*255 #繪制畫布cv.circle(canvas,(x,y),r,(255,0,0),-1) #繪制圓形#cv.imshow('qiuqiu', canvas) # 在屏幕展示繪制圓形的效果time.sleep(1/1500) #每秒1500幀cv.destroyAllWindows() # 釋放所有窗口
運行代碼后獲得的彈球動畫為:
python+opencv簡單彈球
【4】細節說明
在while()函數中,使用x>0.85*(width) or x<0.15*(width)和y > 0.85*(height) or y < 0.15*(height)約定了彈球活動的范圍,這樣可以在比較清晰的界面中看到球體反彈。
此外我們會發現沒有使用cv2.imwrite()函數來保存圖像,因為保存后的圖像并不容易打開,所以暫時未啟用這個函數。
【5】總結
掌握了python+opencv繪制簡單彈球動畫的技巧。