# Python學習筆記 0002 (讀取圖片、影片調整、影片尺寸)
## 讀取圖片
```javascript=
img = cv2.imread("Theme1/img1.jpg")
cv2.imshow("234",img)
cv2.waitKey(0)
```

- 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範例

這段cv2.imshow 在while True中

'break' outside loop
這段break 在if cv2.waitKey(0) & 0xFF == ord中
正確應該要在while True中才對

調整後break 在while True>if cv2.waitKey中
程式也順利執行了

## 調整影片尺寸
```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
```

- frameWidth = 320
frameHeight = 240
- while 迴圈裏頭增加了
img = cv2.resize(img,(frameWidth,frameHeight))
## 查看Opencv函式庫 resize

按住CTRL+滑鼠左鍵按下resize
就會到__init__.py中的resize位置查看定義

:::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
:::