Python OpenCV 儲存寫入video影片到檔案

本篇介紹如何用 Python 搭配 OpenCV 模組的 cv2.VideoCapture 將來源的影像(攝影機或串流影片),儲存寫入video影片到檔案裡。

使用範例

如果遇到 ImportError: No module named 'cv2' 這個錯誤訊息的話,請安裝 python 的 OpenCV 模組,參考這篇安裝吧!。

先前的文章我們學習了如何讀取播放影片,那這篇要來學習如何儲存影片,
如果要將來源影片(不論來源是攝影機影像還是影片)要存成圖片的話只要使用 cv2.imwrite() 就可以了,
那如果想要存成影片檔的話,我們可以使用 VideoWriter 這個 class,
cv2.VideoWriter() 的第一個參數是指定輸出的檔名,例如:下列範例中的 output.avi,
第二個參數為指定 FourCC
第三個參數為 fps 影像偵率,
第四個參數為 frameSize 影像大小,
最後參數代表是否要存彩色,否則就存灰階,預設為 true,

FourCC 是 4-byte 大小的碼,用來指定影像編碼方式,
如同下列範例的 fourcc 變數,它可以由 cv2.VideoWriter_fourcc() 來產生,
cv2.VideoWriter_fourcc() 的參數是傳入四個字元就會回傳該 fourcc,可使用的編碼列表可以參考www.fourcc.org,同時也要看該平台有沒有支援。

常見的編碼格式有,以使用MJPG為例子的話,可以用這兩種寫法都一樣,
cv2.VideoWriter_fourcc(‘M’,’J’,’P’,’G’) 或者是 cv2.VideoWriter_fourcc(*’MJPG’)。

opencv-save-video.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2

cap = cv2.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
# 水平上下翻轉影像
#frame = cv2.flip(frame, 0)
# write the flipped frame
out.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) == ord('q'):
break
# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()

如果要輸出附檔名為 mp4 可用下列寫法的其中一種,

1
2
3
4
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V')
fourcc = cv2.VideoWriter_fourcc(*'MP4V')
fourcc = cv2.VideoWriter_fourcc(*'mp4v')

其他參考
OpenCV: Getting Started with Videos
https://docs.opencv.org/master/dd/d43/tutorial_py_video_display.html
OpenCV 擷取網路攝影機串流影像,處理並寫入影片檔案教學 - G. T. Wang
https://blog.gtwang.org/programming/opencv-webcam-video-capture-and-file-write-tutorial/

其它相關文章推薦
Python OpenCV 彩色轉灰階(RGB/BGR to GRAY)
Python OpenCV 彩色轉HSV(RGB/BGR to HSV)
Python OpenCV 彩色轉YCbCr(RGB/BGR to YCbCr)
Python OpenCV 灰階轉彩色(Gray to RGB/BGR)
Python OpenCV 影像二值化 Image Thresholding
Python OpenCV 影像平滑模糊化 blur
Python OpenCV 影像邊緣偵測 Canny Edge Detection
Python OpenCV 垂直vconcat 和水平hconcat 影像拼接
Python OpenCV resize 圖片縮放
Python 新手入門教學懶人包

在 Raspbian 上手動安裝 Python 3

Raspberry Pi 上可以灌很多 OS, 其中常見的 OS 就是 Raspbian,現在改名叫 Raspberry Pi OS,
是基於 Debian 開發的 OS,今天我們要在這裡面安裝 Python 3。

在 Raspbian 上手動編譯安裝 Python 3.6

如果想要確認樹梅派安裝的 OS 是不是 Raspbian,可以看看這篇
我自己樹梅派安裝的 OS 版本為 raspbian-jessie

我是看參考這篇做的,這篇是教手動編譯 Python-3.6.5 但我也成功。
https://gist.github.com/dschep/24aa61672a2092246eaca2824400d37f

1
2
$ sudo apt-get update
$ sudo apt-get install build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev
1
2
3
4
5
6
$ wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz
$ tar xf Python-3.6.5.tar.xz
$ cd Python-3.6.5
$ ./configure
$ make
$ sudo make altinstall

之後我是使用 python3.6 這個指令,pip 使用 pip3.6 這個指令。
當時用 apt 安裝是安裝3.4,輸入 python3 也是軟連結執行 python3.4,
sudo apt purge python3 + sudo apt autoremove 完全移除 python3 後發現 python3 軟連結不見了,
除非自己建立一個 /usr/bin/python -> python 3.6 的軟連結,
不知道有沒有其他更高招的方式。還是其實手動編譯 sudo make install 會建立軟連結?

其他參考
http://www.knight-of-pi.org/installing-python3-6-on-a-raspberry-pi/
這篇也是差不多,他是手動編譯 Python-3.6.3 稍微舊一點

Qt 5.15 之後不再提供預編譯安裝包

根據 5.15.0 的文件指出
http://download.qt.io/official_releases/qt/5.15/5.15.0/OFFLINE_REAMDE.txt

1
2
3
Due to The Qt Company offering changes, open source offline installers are not available any more since Qt 5.15. Read more about offering changes in the https://www.qt.io/blog/qt-offering-changes-2020 blog.

If you need offline installers, please consider our new Qt for Small Business offering: https://www.qt.io/blog/available-now-qt-for-small-businesses

由於Qt公司的政策改變,以後不再提供預先編譯好的離線獨立安裝包,只能線上安裝了,
要離線安裝包,要購買 Qt for Small Business 產品。

其他參考
歷代的離線安裝包下載網址
https://download.qt.io/archive/qt/
http://download.qt.io/official_releases/qt/
Qt 線上安裝器下載網址
http://download.qt.io/official_releases/online_installers/
【Qt】 Qt 5.15 在线安装_风语留痕-CSDN博客
https://blog.csdn.net/kingkee/article/details/106424024

其它相關文章推薦
[Qt] 讀檔,讀取 txt 文字檔
[Qt] 寫檔,寫入 txt 文字檔
安裝 Qt 在 Windows 7 (使用MSVC)
Qt產生的exe發布方式
Qt 新增多國語言.ts翻譯檔案
Qt5的中文亂碼問題如何解決

Python OpenCV 讀取播放video影片檔案

本篇介紹如何用 Python 搭配 OpenCV 模組的 cv2.VideoCapture 讀取影片檔案並播放顯示影片串流的畫面。

使用範例

如果遇到 ImportError: No module named 'cv2' 這個錯誤訊息的話,請安裝 python 的 OpenCV 模組,參考這篇安裝吧!。

用 VideoCapture 來播放video影片跟播放camera攝影機串流影像是一樣的,只是將參數中的攝影機代號換成影片的檔案名稱,
在顯示 frame 影像時,如果影像播放的很快的話,可以藉由調整 cv2.waitKey() 的參數來控制 frame 與 frame 之前的延遲,
如果 cv2.waitKey() 參數調的太小,那麼影片就會播的很快,
反之 cv2.waitKey() 參數調的太大,那麼影片就會播的很慢,
正常情況下 25 ms(milliseconds) 會是剛剛好的預設值。

opencv-video.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2

cap = cv2.VideoCapture('vtest.avi')

while cap.isOpened():
ret, frame = cap.read()
# if frame is read correctly ret is True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame', gray)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()

播放中的截圖如下所示:
原本影片是彩色影像的,我們透過cv2.cvtColor() 將影像從彩色轉成灰階再顯示出來。

下一篇教學是如何儲存寫入video影片到檔案

其他參考
OpenCV: Getting Started with Videos
https://docs.opencv.org/master/dd/d43/tutorial_py_video_display.html
OpenCV 擷取網路攝影機串流影像,處理並寫入影片檔案教學 - G. T. Wang
https://blog.gtwang.org/programming/opencv-webcam-video-capture-and-file-write-tutorial/

其它相關文章推薦
Python OpenCV 彩色轉灰階(RGB/BGR to GRAY)
Python OpenCV 彩色轉HSV(RGB/BGR to HSV)
Python OpenCV 彩色轉YCbCr(RGB/BGR to YCbCr)
Python OpenCV 灰階轉彩色(Gray to RGB/BGR)
Python OpenCV 影像二值化 Image Thresholding
Python OpenCV 影像平滑模糊化 blur
Python OpenCV 影像邊緣偵測 Canny Edge Detection
Python OpenCV 垂直vconcat 和水平hconcat 影像拼接
Python OpenCV resize 圖片縮放
Python 新手入門教學懶人包
小專案 Python OpenCV 圖片轉字元圖畫

在 Raspbian 確認軟體版本與硬體版本

本篇紀錄在 Raspbian (現在改名叫 Raspberry Pi OS) 如何檢查確認軟體版本與硬體版本,

確認軟體版本 Software Version

不是韌體唷!指確認你安裝OS的版本,
透過下列指令可以看到我安裝OS的是 Raspbian GNU/Linux,版本為 8 (jessie)

1
2
3
4
5
6
7
8
9
$ cat /etc/os-release
NAME="Raspbian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

參考
How To for Raspberry – Checking the Raspbian version (update & upgrade) – Meccanismo Complesso
https://www.meccanismocomplesso.org/en/how-to-for-raspberry-checking-the-raspbian-version-update-upgrade/
[常見問與答] 如何看 Raspbian 的版本資訊? - Raspberry Pi台灣樹莓派Raspberry Pi台灣樹莓派
https://www.raspberrypi.com.tw/10400/check-what-raspbian-version-you-are-running-on-the-raspberry-pi/

確認硬體版本 Hardware Version

透過下列指令查詢我的 Pi,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ cat /proc/cpuinfo
processor : 0
model name : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS : 2.00
Features : half thumb fastmult vfp edsp java tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xb76
CPU revision : 7

Hardware : BCM2708
Revision : 000e
Serial : 00000000f566b1cb

透過下列參考的文章用 Hardware Revision Code from cpuinfo 的 000e 去對應看看型號是什麼,
所以我的 Pi 是 Model B Rev 2

1
2
$ cat /proc/device-tree/model
Raspberry Pi Model B Rev 2

參考
Checking Your Raspberry Pi Revision Number & Board Version - Raspberry Pi Spy
https://www.raspberrypi-spy.co.uk/2012/09/checking-your-raspberry-pi-board-version/
How to Check the Software and Hardware Version of a Raspberry Pi | ozzmaker.com
https://ozzmaker.com/check-raspberry-software-hardware-version-command-line/

Python lambda 運算式用法與範例

本篇介紹 Python 的 lambda 運算式的用法教學,並附上常見的範例,匿名函數就是指一個沒有名稱的函數,學會 lambda 可以將原 Python 程式改寫成簡短,另一方面是也看得懂別人寫的 lambda。

以下 Python lambda 教學內容將分為以下幾部分,

  • Python lambda 的基本使用範例
  • Python 函數的回傳值也可以直接回傳 lambda 運算式
  • 在 tkinter/PyQt 裡使用 lambda 的實際例子

那我們就開始吧!

Python lambda 的基本使用範例

Python 中 lambda 的用法如下,

1
lambda arg1, arg2, ... : expression

範例 1-1. add
add 是兩數相加的函式,帶入兩個數字,回傳相加後的結果。
程式碼如下:

python-lambda-add1.py
1
2
3
4
5
6
7
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

add = lambda x, y: x + y
print(add(1, 2))
print(add(3, 5))
print(add)

輸出如下:

1
2
3
3
8
<function <lambda> at 0x7fada83b1f28>

範例 1-2. pow
pow 是次方的函式,帶入數值後回傳 x 的 y 次方後的結果。
其中 ** 是次方運算子 power operator
簡單說 2**3 等價於 2*2*2
程式碼如下:

python-lambda-pow1.py
1
2
3
4
5
6
7
8
9
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

pow = lambda x, y: x ** y
print(pow(2, 2))
print(pow(2, 4))
print(pow(5, 2))
print(pow(5, 3))
print(pow)

輸出如下:

1
2
3
4
5
4
16
25
125
<function <lambda> at 0x7f1820cc2730>

範例 1-3. max
max 是回傳兩數字最大的數字,
這邊使用了 python 三元運算子的技巧,可以看看之前 Python 的三元運算子 ternary operator 的介紹
程式碼如下:

python-lambda-max1.py
1
2
3
4
5
6
7
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

max = lambda x, y: x if x > y else y
print(max(1, 2))
print(max(3, 5))
print(max)

輸出如下:

1
2
3
2
5
<function <lambda> at 0x7f1eaa90ef28>

Python 函數的回傳值也可以直接回傳 lambda 運算式

範例 2-1. add

python-lambda-add2.py
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def aaa():
return lambda x, y: x + y

add = aaa()
print(add(1, 2))
print(add(3, 5))
print(add)

輸出如下:

1
2
3
3
8
<function aaa.<locals>.<lambda> at 0x7fa52255e730>

範例 2-2. pow

python-lambda-pow2.py
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def aaa():
return lambda x, y: x ** y

pow = aaa()
print(pow(2, 2))
print(pow(2, 4))
print(pow(5, 2))
print(pow(5, 3))
print(pow)

輸出如下:

1
2
3
4
5
4
16
25
125
<function aaa.<locals>.<lambda> at 0x7fcdf4146730>

範例 2-3. max

python-lambda-max2.py
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def aaa():
return lambda x, y: x if x > y else y

max = aaa()
print(max(1, 2))
print(max(3, 5))
print(max)

輸出如下:

1
2
3
2
5
<function aaa.<locals>.<lambda> at 0x7f0a2f7e6730>

在 tkinter/PyQt 裡使用 lambda 的實際例子

在 GUI 程式中常常有一些 UI 元件的互動操作,例如某事件完成後只是想要將 UI 改變個文字,或是只是想要將 UI 改變狀態,這種只要一行就可以完成的程式碼,但不想額外為了這一行建立一個函式的話,就可以考慮使用 lambda 的技巧來完成。

我們來看看在 tkinter 裡使用 lambda 的實際例子,如下例 tkinter 中處理按鈕事件的 button_event 函式裡只有僅僅一行程式碼,很單純地只是改變按鈕的文字而已,這種情形就可以換成 lambda 的寫法,

1
2
3
4
5
def button_event():
mybutton.config(text='hello world')

mybutton = tk.Button(root, text='button', command=button_event)
mybutton.pack()

改成 lambda 寫法以後,就可以移除 button_event 這個函式了,將原本 button_event 函式裡的程式碼放在 lambda 運算式裡,這樣就是個運用 lamdba 好時機的例子,

1
2
3
4
5
6
7
# def button_event():
# mybutton.config(text='hello world')

mybutton = tk.Button(root, text='button',
command=lambda: mybutton.config(text='hello world')
)
mybutton.pack()

詳細範例可以看看 Python tkinter Button 按鈕用法與範例這篇,

接著我們來看看在 PyQt5 裡使用 lambda 的實際例子,下例 PyQt5 處理按鈕事件中的 onButtonClick 函式裡也一樣只有僅僅一行程式碼,僅僅只是改變按鈕文字而已,這也可以寫成 lambda 來精簡程式碼,

1
2
3
4
5
6
7
def initUI(self):
# ...
self.mybutton = QPushButton('button', self)
self.mybutton.clicked.connect(self.onButtonClick)

def onButtonClick(self):
self.mybutton.setText('hello world')

改寫 lambda 後變成這樣,將原本在 onButtonClick 的程式碼搬到 lambda 運算式裡,這樣就可以把 onButtonClick 函式給移除了,

1
2
3
4
5
6
7
8
9
10
def initUI(self):
# ...
self.mybutton = QPushButton('button', self)
# self.mybutton.clicked.connect(self.onButtonClick)
self.mybutton.clicked.connect(
lambda: self.mybutton.setText('hello world')
)

# def onButtonClick(self):
# self.mybutton.setText('hello world')

詳細範例可以看看 Python PyQt5 QPushButton 按鈕用法與範例這篇,
在某些狀況下 lambda 就變成很好使用的技巧,程式撰寫也比較快速,程式碼也比較精簡,要不要使用 lambda 取決於當下的情況,不一定改用 lambda 運算式就一定好,需要自己評估衡量。

以上就是 Python lambda 運算式用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它參考
lambda 運算式
https://openhome.cc/Gossip/Python/LambdaExpression.html
Python 速查手冊 - 3.9 lambda 運算
http://kaiching.org/pydoing/py/python-lambda.html
Python Lambda
https://www.w3schools.com/python/python_lambda.asp
Python進階技巧 (4) — Lambda Function 與 Closure 之謎! - 整個程式都是我的咖啡館 - Medium
https://medium.com/citycoddee/python%E9%80%B2%E9%9A%8E%E6%8A%80%E5%B7%A7-4-lambda-function-%E8%88%87-closure-%E4%B9%8B%E8%AC%8E-7a385a35e1d8
Falldog的程式戰場: [Python] lambda簡介
http://falldog7.blogspot.com/2009/07/python-lambda.html

其它相關文章推薦
如果你想學習 Python 相關技術,可以參考看看下面的文章,
Python 新手入門教學懶人包
Python 讀取 txt 文字檔
Python 讀取 csv 檔案
Python 寫入 csv 檔案
Python str 字串用法與範例
Python list 串列用法與範例
Python set 集合用法與範例
Python dict 字典用法與範例
Python tuple 元組用法與範例
Python 字串分割 split
Python 取代字元或取代字串 replace
Python 讓程式 sleep 延遲暫停時間
Python 產生 random 隨機不重複的數字 list
Python PyAutoGUI 使用教學
Python OpenCV resize 圖片縮放

開源專案-仙劍奇俠傳

今天介紹Github上開源專案的仙劍奇俠傳遊戲,

sdlpal/sdlpal

https://github.com/sdlpal/sdlpal
星星數:1.1kstars
技術:C,SDL,ffmpeg
使用 SDL 重製的中文經典遊戲「仙劍奇俠傳」,
也被移植到 Android 與 iOS 上,亦是你在手機上就能玩「仙劍奇俠傳」,真是有趣,
有機會再來分享這裡面的遊戲軟體架構吧~

其他參考
[1] 當Why 再也不是為什麼: [Note] Linux 下編譯 仙劍奇俠傳 遊戲 (sdlpal)。
http://larry-why.blogspot.com/2014/09/note-linux-sdlpal.html
[2] 仙剑奇侠传(sdlpal源码)联网研究(一) - 知乎
https://zhuanlan.zhihu.com/p/62836580
[3] sdlpal仙剑源码正式研究(二) - 知乎
https://zhuanlan.zhihu.com/p/59795137
[4] sdlpal仙剑源码正式研究(三) - 知乎
https://zhuanlan.zhihu.com/p/60136163
[5] Maemo SDK 軟體移植初步:以 SDLPAL 為範例 | DarkRanger’s Secret Area
https://darkranger.no-ip.org/content/maemo-sdk-%E8%BB%9F%E9%AB%94%E7%A7%BB%E6%A4%8D%E5%88%9D%E6%AD%A5%EF%BC%9A%E4%BB%A5-sdlpal-%E7%82%BA%E7%AF%84%E4%BE%8B

其它相關文章推薦
開源專案CursorJail-滑鼠鎖定工具
開源專案-2048
開源專案-tetris俄羅斯方塊
開源專案-數獨sudoku
開源專案-金庸群俠傳

開源專案-數獨sudoku

今天介紹Github上開源專案的數獨sudoku遊戲,

jubalh/nudoku

https://github.com/jubalh/nudoku
星星數:168stars
技術:C,ncurses,Makefile
網站:http://jubalh.github.io/nudoku/
在 console 上玩數獨,
Ubuntu 還能透過 apt 安裝,

1
apt-get install nudoku

macOS 還能透過 brew 安裝,

1
brew install nudoku


mayerui/sudoku

https://github.com/mayerui/sudoku
星星數:140stars
技術:C++,CMake
C++ 實現的跨平台數獨遊戲,console 操作易上手。

其它相關文章推薦
開源專案CursorJail-滑鼠鎖定工具
開源專案-2048
開源專案-tetris俄羅斯方塊
開源專案-金庸群俠傳
開源專案-仙劍奇俠傳

Python numpy 計算平均值 mean/average

本篇紀錄如何使用 python numpy 的 np.mean 來計算平均值 mean/average 的方法。

範例. 用 numpy 計算平均值

以下 python 範例使用 numpy 來計算平均值 mean/average,使用 np.array 帶入 python list,接著再使用 np.mean 計算平均值。

python-numpy-mean.py
1
2
3
4
5
6
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import numpy as np

arr = np.array([5, 6, 8, 9])
print(np.mean(arr))

輸出如下:

1
7.0

範例. Python 內建的 statistics.mean 計算平均值

這個範例是使用 Python 內建的 statistics 來計算平均值 mean。

python-mean.py
1
2
3
4
5
6
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import statistics

arr = [5, 6, 8, 9]
print(statistics.mean(arr))

輸出如下:

1
7

參考
numpy.mean() in Python - GeeksforGeeks
https://www.geeksforgeeks.org/numpy-mean-in-python/
https://docs.scipy.org/doc/numpy/reference/generated/numpy.mean.html
https://blog.csdn.net/taotiezhengfeng/article/details/72397282
https://www.geeksforgeeks.org/python-statistics-mean-function/

其它相關文章推薦
如果你想學習 Python 相關技術,可以參考看看下面的文章,
Python numpy 計算標準差 standard deviation
Python 新手入門教學懶人包
Python str 字串用法與範例
Python list 串列用法與範例
Python set 集合用法與範例
Python dict 字典用法與範例
Python tuple 元組用法與範例

Python 計算 set 集合長度

本篇 ShengYu 介紹 Python 計算 set 集合長度,Python 計算集合長度的用法與範例如下,

len() 計算集合的元素個數,

1
2
3
4
5
s1 = {1, 2, 3, 4, 5}
print(len(s1))

s2 = {1, 1, 2, 3, 3}
print(len(s2))

輸出結果如下,

1
2
5
3

其它相關文章推薦
如果你想學習 Python 相關技術,可以參考看看下面的文章,
Python set 集合用法與範例
Python 計算 str 字串長度
Python 計算 list 串列長度
Python 計算 dict 字典長度
Python 計算 tuple 元組長度
Python 新手入門教學懶人包
Python 讀檔,讀取 txt 文字檔
Python 字串分割 split
Python 取代字元或取代字串 replace
Python 產生 random 隨機不重複的數字 list
Python print 格式化輸出與排版
Python PIL 讀取圖片並顯示
Python OpenCV resize 圖片縮放