一逮壁、OpenCV-Python的安裝
直接使用pip方法進(jìn)行安裝
pip install opencv-python
可能還會(huì)用到其他的庫(kù)村斟,這里一起安裝奶陈。
pip install numpy
pip install matplotlib
直接使用pip可能會(huì)出現(xiàn)安裝時(shí)下載速度較慢的問(wèn)題,可以通過(guò)切換下載源來(lái)解決蔚舀。切換下載源有兩種方法:
1.在每次使用pip時(shí)聲明下載源饵沧,如:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
2.直接為pip設(shè)置下載源
在 C:\Users\xxx\ 下新建一個(gè)pip文件夾,在文件夾下新建一個(gè)pip.ini文件赌躺,pip.ini中寫下如下文本即可
[grobal]
index-url=https://pypi.tuna.tsinghua.edu.cn/simple
其中index-url即為pip使用下載源狼牺,這里也可以還可以換成別的安裝源,比如:
1.豆瓣http://pypi.douban.com/simple
2.阿里云http://mirrors.aliyun.com/pypi/simple
3.中科大http://pypi.mirrors.ustc.edu.cn/simple
4.清華https://pypi.tuna.tsinghua.edu.cn/simple
二礼患、圖片操作
這一部分將教我們學(xué)會(huì)怎樣讀入一幅圖像锁右,怎樣顯示一幅圖像,以及如何保存一幅圖像讶泰。
1.讀入圖像
使用函數(shù) cv2.imread(filename, flags=None)
讀入圖像咏瑟。第一個(gè)參數(shù)為需要讀取的圖片的路徑;第二個(gè)參數(shù)時(shí)要告訴函數(shù)如何讀取圖片痪署。
import cv2
img = cv2.imread('lena.jpg', cv2.IMREAD_COLOR)
cv2.imread()的第二參數(shù):
- cv2.IMREAD_ANYCOLOR
- cv2.IMREAD_ANYDEPTH
- cv2.IMREAD_COLOR # 讀入彩圖
- cv2.IMREAD_GRAYSCALE # 讀入灰度圖
- cv2.IMREAD_IGNORE_ORIENTATION
- cv2.IMREAD_LOAD_GDAL
- cv2.IMREAD_REDUCED_COLOR_2 # 讀入彩圖并縮小到原來(lái)的1/2
- cv2.IMREAD_REDUCED_COLOR_4
- cv2.IMREAD_REDUCED_COLOR_8
- cv2.IMREAD_REDUCED_GRAYSCALE_2 # 讀入灰度圖并縮小到原來(lái)的1/2
- cv2.IMREAD_REDUCED_GTAYSCALE_4
- cv2.IMREAD_REDUCED_GRAYSCALE_8
- cv2.IMREAD_UNCHANGED
2.顯示圖像
使用函數(shù) cv2.imshow(winname, mat)
顯示圖像码泞。第一個(gè)參數(shù)為窗口的名字,隨意設(shè)置狼犯;第二個(gè)參數(shù)為需要傳入的圖像余寥。
import cv2
img = cv2.imread('lena.jpg', cv2.IMREAD_COLOR)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(delay=None)
是一個(gè)鍵盤綁定函數(shù),需要指出的是它的時(shí)間尺度是毫秒級(jí)悯森。函數(shù)等待特定的幾毫秒宋舷,看是否有鍵盤輸入。特定的幾毫秒之內(nèi)瓢姻,如果按下任意鍵祝蝠,這個(gè)函數(shù)會(huì)返回按鍵的 ASCII 碼值,程序?qū)?huì)繼續(xù)運(yùn)行幻碱。如果沒(méi)有鍵盤輸入绎狭,返回值為 -1,如果我們?cè)O(shè)置這個(gè)函數(shù)的參數(shù)為 0褥傍,那它將會(huì)無(wú)限期的等待鍵盤輸入儡嘶。它常被用來(lái)檢測(cè)特定按鍵是否被按下。cv2.destroyAllWindows()
刪除所有我們建立的窗口恍风。如果想要?jiǎng)h除特定的窗口可以使用cv2.destroyWindow(winname)
所以蹦狂,上述代碼表示顯示一張圖像誓篱,如果有按鍵輸入,就關(guān)閉圖像凯楔。
3.保存圖像
使用函數(shù) cv2.imwrite(filename, img, params=None)
來(lái)保存圖像燕鸽。
import cv2
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('image',img)
k = cv2.waitKey(0)&0xFF
if k == 27: # wait for ESC key to exit
cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
cv2.imwrite('lena_gray.jpg',img)
cv2.destroyAllWindows()
如果電腦是64位系統(tǒng),通常需要將 k = cv2.waitKey(0) 改成 k = cv2.waitKey(0)&0xFF
三啼辣、視頻操作
這一部分主要是學(xué)習(xí)如何讀取視頻文件,如何顯示視頻和保存視頻文件御滩;另外還學(xué)習(xí)如何從攝像頭獲取并顯示視頻鸥拧。
1.用攝像頭捕獲視頻
我們經(jīng)常會(huì)使用攝像頭捕獲實(shí)時(shí)圖像,而OpenCV恰好為我們提供了一個(gè)簡(jiǎn)單的接口削解。
為了獲取視頻富弦,我們應(yīng)該線創(chuàng)建一個(gè)VideoCapture對(duì)象,即 cap = cv2.VideoCapture()
氛驮,它的參數(shù)可以是設(shè)備的索引號(hào)腕柜,也可以是一個(gè)視頻文件。一般的筆記本電腦都有內(nèi)置的攝像頭矫废,所以參數(shù)就是0盏缤。當(dāng)然,我們也可以通過(guò)設(shè)置成1或者其他索引號(hào)來(lái)選擇別的攝像頭蓖扑。這樣唉铜,我們就可以一幀一幀地捕獲視頻了。另外律杠,最后別忘了停止捕獲視頻潭流。
import cv2
# 1.創(chuàng)建一個(gè)VideoCapture對(duì)象,使用筆記本電腦內(nèi)置攝像頭
cap = cv2.videoCapture(0)
while(Ture):
# 2.攝像頭捕獲一幀數(shù)據(jù)
ret, frame = cap.read()
# 3.顯示一幀數(shù)據(jù)
cv2.imshow('frame', frame)
if(cv2.waitKey(1)&0xFF == ord('q')):
break
# 4.停止捕獲視頻
cap.release()
cv2.destroyAllWindows()
cap.read()
返回一個(gè)布爾值(True/False)柜去。如果幀讀取正確則返回True灰嫉。所以這個(gè)函數(shù)通常被用來(lái)檢查視頻文件是否已經(jīng)到了結(jié)尾。
另外幾個(gè)重要的函數(shù):
cap.get(propId)
獲取視頻地一些參數(shù)信息嗓奢。這里的propId可以是0到18之間的任何整數(shù)讼撒。
propId參數(shù)
- CV_CAP_PROP_POS_MSEC視頻文件的當(dāng)前位置(以毫秒為單位)或視頻捕獲時(shí)間戳」傻ⅲ—— 0
- CV_CAP_PROP_POS_FRAMES接下來(lái)要解碼/捕獲的幀的基于0的索引椿肩。—— 1
- CV_CAP_PROP_POS_AVI_RATIO視頻文件的相對(duì)位置:0 - 電影的開(kāi)始豺谈,1 - 電影的結(jié)尾郑象。—— 2
- CV_CAP_PROP_FRAME_WIDTH視頻流中幀的寬度茬末〕ч唬—— 3
- CV_CAP_PROP_FRAME_HEIGHT視頻流中幀的高度盖矫。—— 4
- CV_CAP_PROP_FPS幀速率击奶”菜—— 5
- CV_CAP_PROP_FOURCC編解碼器的4字符代碼」窭—— 6
- CV_CAP_PROP_FRAME_COUNT視頻文件中的幀數(shù)湃望。—— 7
- CV_CAP_PROP_FORMAT返回的Mat對(duì)象的格式retrieve()痰驱≈ぐ牛—— 8
- CV_CAP_PROP_MODE指示當(dāng)前捕獲模式的特定于后端的值〉S常—— 9
- CV_CAP_PROP_BRIGHTNESS圖像的亮度(僅適用于相機(jī))废士。—— 10
- CV_CAP_PROP_CONTRAST圖像對(duì)比度(僅適用于相機(jī))蝇完」傧酰—— 11
- CV_CAP_PROP_SATURATION圖像的飽和度(僅適用于相機(jī))《掏桑—— 12
- CV_CAP_PROP_HUE圖像的色調(diào)(僅適用于相機(jī))氢架。—— 13
- CV_CAP_PROP_GAIN圖像的增益(僅適用于相機(jī))朋魔〈锕浚—— 14
- CV_CAP_PROP_EXPOSURE曝光(僅適用于相機(jī))∑坛—— 15
- CV_CAP_PROP_CONVERT_RGB布爾標(biāo)志缎玫,指示是否應(yīng)將圖像轉(zhuǎn)換為RGB〗庾遥—— 16
- CV_CAP_PROP_WHITE_BALANCE白平衡(當(dāng)前不支持)—— 17
- CV_CAP_PROP_RECTIFICATION立體攝像機(jī)的整流標(biāo)志(注意:目前僅支持DC1394 v 2.x后端)—— 18
cap.set(propId, value)
可以用來(lái)設(shè)置某些參數(shù)的值赃磨。比如可以通過(guò)使用 cap.set(3, 320)和cap.set(4, 240)將寬和高設(shè)置成320×240
cap.isOpened()
檢查是否成功初始化攝像頭設(shè)備,成功則返回True洼裤,否則則需要使用 cap.open()
開(kāi)啟邻辉。
2.從文件中播放視頻
與從攝像頭中捕獲一樣,只需要將設(shè)備索引號(hào)改成視頻文件的名字即可播放視頻文件腮鞍。在播放每一幀時(shí)值骇,使用 cv2.waiKey() 設(shè)置適當(dāng)?shù)某掷m(xù)時(shí)間。如果設(shè)置的太低視頻就會(huì)播放的非骋乒快吱瘩,如果設(shè)置的太高就會(huì)播放的很慢(你可以使用這種方法控制視頻的播放速度)。通常情況下 25 毫秒就可以了迹缀。
import cv2
cap = cv2.VideoCapture('vtest.avi')
while(cap.isOpened()):
ret, frame = cap.read()
# 轉(zhuǎn)成灰度圖
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
3.保存視頻
在我們捕獲視頻使碾,并對(duì)每一幀都進(jìn)行加工之后我們想要保存這個(gè)視頻蜜徽。對(duì)于圖片來(lái)時(shí)很簡(jiǎn)單只需要使用 cv2.imwrite()。但對(duì)于視頻來(lái)說(shuō)就要多做點(diǎn)工作票摇。
我們要?jiǎng)?chuàng)建一個(gè) VideoWriter 的對(duì)象拘鞋。我們應(yīng)該確定一個(gè)輸出文件的名字。接下來(lái)指定 FourCC 編碼(下面會(huì)介紹)矢门。播放頻率和幀的大小也都需要確定盆色。最后一個(gè)是 isColor 標(biāo)簽。如果是 True祟剔,每一幀就是彩色圖隔躲,否則就是灰度圖。
FourCC 就是一個(gè) 4 字節(jié)碼峡扩,用來(lái)確定視頻的編碼格式≌媳荆可用的編碼列表可以從fourcc.org查到教届。這是平臺(tái)依賴的。下面這些編碼器對(duì)我來(lái)說(shuō)是有用個(gè)驾霜。
- In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID is more preferable. MJPG results in high size video. X264 givesvery small size video)
- In Windows: DIVX (More to be tested and added)
- In OSX : (I don’t have access to OSX. Can some one fill this?)
FourCC 碼以下面的格式傳給程序案训,以 MJPG 為例:
cv2.cv.FOURCC('M','J','P','G')
或者 cv2.cv.FOURCC(*'MJPG')
下面的代碼是從攝像頭中捕獲視頻,沿水平方向旋轉(zhuǎn)每一幀并保存它粪糙。
import cv2
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
frame = cv2.flip(frame,0) # 旋轉(zhuǎn)
# 保存
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()