---
# System prepended metadata

title: Python學習筆記 0002 (讀取圖片、影片調整、影片尺寸)

---

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