# Python學習筆記 0002 (讀取圖片、影片調整、影片尺寸) ## 讀取圖片 ```javascript= img = cv2.imread("Theme1/img1.jpg") cv2.imshow("234",img) cv2.waitKey(0) ``` ![](https://i.imgur.com/psXwPFW.png) - cv2.waitKey(0) 0 等待無限久234.jpg 5000 等待5秒就關閉234.jpg 10000 等待10秒就關閉234.jpg 如果沒有這一行 開啟234.jpg後,馬上關閉 - cv2.imread("Theme1/img1.jpg") 在Theme1資料夾讀取img1.jpg這個檔案 - img = cv2.imread - cv2.imshow ## 讀取影片 ### 範例 ```javascript= import cv2 cap = cv2.VideoCapture("simple.mp4") while True: sucess, img = cap.read() cv2.imshow("video",img) if cv2.waitKey(1) & 0xFF == ord('q'): break ``` - sucess, img = cap.read() (一直讀取cap) (讀取結束後就存到img) 當成功執行了img = cap.read() 宣告為 true,sucess,true 當執行失敗了 宣告為 false,sucess,false - if cv2.waitKey(0) & 0xFF == ord('q'): 如果按了Q 就結束"while迴圈" - cv2.VideoCapture("simple.mp4")中的simple.mp4可以改成圖像檔 ### VideoCapture處理 - 一般而言,都是這樣寫的。 先取回一幀影像,然後進行處理,膨脹閉合之類的,再使用CNN來辨識一下...等等。 全部都處理完了,再繼續截取下一幀影像。 這種寫法有什麼問題呢? 其實只要稍微改動一下上述的程式,就可以看出來。 我們把 cv2.waitkey(1) 改成 cv2.waitkey(1000),意思是程式到這邊等待 1 秒。 - 在實務上的情況,我們不會直接使用waitkey(1000), 而是每一次迴圈內影像處理的流程費時 1 秒,也許會快一些或是慢一些。 然後我們就會發現一件事:怎麼影像不動了?或是影像怎麼會延遲? - 尤其是影像上面如果有日期時間的話,就更明顯的看到秒數連動都不會動。 明明已經過了10秒鐘,取回10張影像,但是影像顯示的時間卻沒有任何改變? 原因是因為VideoCapture會把從攝影機取回來的影像先放到緩衝區,等待使用者將緩衝區內的影像取走,再填充新的影像進去。 - 如果攝影機的拍攝頻率是一秒10幀影像(10fps),但我們一秒只讀取一張, 那就表示我們會一直讀取到同一時刻的影像,直到把緩衝區清空為止, 又緩衝區有多少幀影像,則是取決於攝影機設定的拍攝頻率。 也因此在不明所以的人眼中看起來的問題就是: 為什麼怎麼我的影像串流會出現延遲的問題? - 而這個問題最根本的原因是: 從緩衝區取出影像的速度,低於填入影像的速度! [來源](https://dotblogs.com.tw/shaynling/2017/12/28/091936) ### debug範例 ![](https://i.imgur.com/BrWB9Wg.png) 這段cv2.imshow 在while True中 ![](https://i.imgur.com/KijlUaT.png) 'break' outside loop 這段break 在if cv2.waitKey(0) & 0xFF == ord中 正確應該要在while True中才對 ![](https://i.imgur.com/MZOU68w.png) 調整後break 在while True>if cv2.waitKey中 程式也順利執行了 ![](https://i.imgur.com/pKqfTqD.png) ## 調整影片尺寸 ```javascript= import cv2 frameWidth = 320 frameHeight = 240 cap = cv2.VideoCapture("simple.mp4") while True: sucess, img = cap.read() img = cv2.resize(img,(frameWidth,frameHeight)) cv2.imshow("video",img) if cv2.waitKey(0) & 0xFF == ord('q'): break ``` ![](https://i.imgur.com/nDw3ifY.png) - frameWidth = 320 frameHeight = 240 - while 迴圈裏頭增加了 img = cv2.resize(img,(frameWidth,frameHeight)) ## 查看Opencv函式庫 resize ![](https://i.imgur.com/CzrC8Se.png) 按住CTRL+滑鼠左鍵按下resize 就會到__init__.py中的resize位置查看定義 ![](https://i.imgur.com/Ez42BJl.png) :::spoiler 一篇一個OpenCV函式(cv2.imwrite) cv2.imwrite 原型:imwrite(filename,img,params=None) 作用:寫入影象 引數:filename,寫入的檔名。img,待寫入的影象。 params,特定格式下儲存的引數編碼,一般情況下為None。 https://www.itread01.com/content/1550310670.html ::: :::spoiler 一篇一個numpy函式(expand_dims) - expand_dims 擴展數組的形狀。 用法 (axis = 0 ~ 1): x = np.array([1,2]) y = np.expand_dims(x, axis = 0) - 範例 ```javascript= import numpy as np x = np.array([1, 2, 3, 4]) y = np.expand_dims(x, axis = 0) z = np.expand_dims(x, axis = 1) print(x.shape) print(y.shape) print(z.shape) print(x) print(y) print(z) ``` - 輸出 (4,) (1, 4) (4, 1) [1 2 3 4] [[1 2 3 4]] [[1] [2] [3] [4]] https://hackmd.io/@yillkid/rJp5h90s8/https%3A%2F%2Fhackmd.io%2F%40yillkid%2FHy5a_5A-F#array :::