圖片讀寫
- 讀入圖像
使用函數 cv2.imread() 讀入圖像。
這幅圖像應該在此程序的工作路徑,或者給函數提供完整路徑,第二個參數是要告訴函數應該如何讀取這幅圖片。
cv2.IMREAD_COLOR:讀入一副彩色圖像。圖像的透明度會被忽略,這是默認參數。
cv2.IMREAD_GRAYSCALE:以灰度模式讀入圖像
cv2.IMREAD_UNCHANGED:讀入一幅圖像,並且包括圖像的 alpha 通道 - 顯示圖像
使用函數 cv2.imshow() 顯示圖像。
窗口會自動調整爲圖像大小。第一個參數是窗口的名字,其次纔是我們的圖像。
你可以創建多個窗口,但是必須給他們不同的名字。
cv2.waitKey() 是一個鍵盤綁定函數。需要指出的是它的時間尺度是毫
秒級。函數等待特定的幾毫秒,看是否有鍵盤輸入。特定的幾毫秒之內,如果
按下任意鍵,這個函數會返回按鍵的 ASCII 碼值,程序將會繼續運行。如果沒
有鍵盤輸入,返回值爲 -1,如果我們設置這個函數的參數爲 0,那它將會無限
期的等待鍵盤輸入。
cv2.destroyAllWindows() 可以輕易刪除任何我們建立的窗口。如果
你想刪除特定的窗口可以使用 cv2.destroyWindow(),在括號內輸入你想刪
除的窗口名。 - 保存圖像
使用函數 cv2.imwrite() 來保存一個圖像。首先需要一個文件名,之後才
是你要保存的圖像。
# opencv3 模塊導入
import cv2
# 以灰度模式讀入圖像
img = cv2.imread(r'F:/Pictures/tiger.jpg',cv2.IMREAD_GRAYSCALE)
print('type of img:', type(img))
print('shape of image: ', img.shape)
# 顯示圖片
cv2.imshow('tiger', img)
# 保存圖片('s'鍵保存退出)
k = cv2.waitKey(0)
if k == ord('s'):
cv2.imwrite(r'F:/Pictures/tiger_gray.png', img)
cv2.destroyAllWindows()
type of img: <class 'numpy.ndarray'>
shape of image: (476, 593)
- 使用matplotlib顯示opencv打開的圖片
opencv對多個圖片輸出在同一個窗口並沒有直接的支持手段,但有時候我們會有這個需求,
這時可以用matplotlib搭配使用。而且matplotlib可以在notebook上直接顯示無需彈窗。
彩色圖像使用 OpenCV 加載時是 BGR 模式。但是 Matplotlib 是 RGB模式。
所以彩色圖像如果已經被 OpenCV 讀取,那它將不會被 Matplotlib 正確顯示。
使用matplotlib顯示opencv打開的圖片之前,需要用
img =img[:, :, ::-1]
或img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)轉化一下。
import matplotlib.pyplot as plt
import cv2
imgs = ['tiger.jpg', 'tiger_gray.png']
plt.figure(dpi=100)
for i, m in enumerate(imgs):
img = cv2.imread(r'F:/Pictures/'+ m)[:,:,::-1]
plt.subplot(1, 2, i+1)
plt.imshow(img)
plt.xticks([])
plt.yticks([])
plt.show()
視頻讀寫
- cv2.VideoCapture() 打開一個視頻文件或設備
- cap.read() 讀取一幀
- cv2.VideoWriter_fourcc(*‘XVID’) 設置編碼格式
- cv2.VideoWriter() 確定一個輸出文件的名字。接下來指定 FourCC 編碼。播放頻率和幀的大小也都需要確定。最後一個是 isColor 標籤。如果是 True,每一幀就是彩色圖,否則就是灰度圖
- cap.isOpened() 檢查是否成功初始化。如果返回值是True,那就沒有問題。否則就要使用函數 cap.open()
- cap.get(propId) 獲得視頻的一些參數信息,propId 可以是 0 到 18 之間的任何整數。
cap.set(propId,value) 來修改其中的一些值
cap.get(3) 和 cap.get(4) 來查看每一幀的寬和高。默認情況下得到的值是 640X480。但是我可以使用ret=cap.set(3,320)和 ret=cap.set(4,240) 來把寬和高改成 320X240
import cv2
# 打開視頻文件 media.mp4
cap = cv2.VideoCapture('media.mp4')
while(True):
# ret讀取成功標誌, frame一幀圖片數據
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) == ord('q'):
break
# 釋放視頻設備或文件
cap.release()
cv2.destroyAllWindows()
import cv2
# 打開攝像頭
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) == ord('q'):
break
else:
break
# Release everything if job is finished
out.release()
cap.release()
cv2.destroyAllWindows()
繪圖
繪圖函數:
- cv2.line()
- cv2.circle()
- cv2.rectangle()
- cv2.ellipse()
- cv2.putText()
上面所有的這些繪圖函數需要設置下面這些參數:
- img:你想要繪製圖形的那幅圖像。
- color:形狀的顏色。以 RGB 爲例,需要傳入一個元組,例如:(255,0,0)代表藍色。對於灰度圖只需要傳入灰度值。
- thickness:線條的粗細。如果給一個閉合圖形設置爲 -1,那麼這個圖形就會被填充。默認值是 1.
- linetype:線條的類型, 8 連接,抗鋸齒等。默認情況是 8 連接。 cv2.LINE_AA爲抗鋸齒,這樣看起來會非常平滑。
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = np.zeros((500, 500, 3), np.uint8)
cv2.line(img, (0, 0), (300,300), (255,0,0), 5)
cv2.circle(img, (100,150), 60, (0,255,0), -1)
cv2.rectangle(img, (150,0), (300,150), (0,0,255), 3)
plt.figure(dpi=150)
plt.xticks([])
plt.yticks([])
plt.imshow(img)
plt.show()
鼠標事件
- cv2.setMouseCallback() 鼠標事件回調函數
#查看所有的鼠標事件
import cv2
for i in dir(cv2):
if 'EVENT'in i:
print(i)
EVENT_FLAG_ALTKEY
EVENT_FLAG_CTRLKEY
EVENT_FLAG_LBUTTON
EVENT_FLAG_MBUTTON
EVENT_FLAG_RBUTTON
EVENT_FLAG_SHIFTKEY
EVENT_LBUTTONDBLCLK
EVENT_LBUTTONDOWN
EVENT_LBUTTONUP
EVENT_MBUTTONDBLCLK
EVENT_MBUTTONDOWN
EVENT_MBUTTONUP
EVENT_MOUSEHWHEEL
EVENT_MOUSEMOVE
EVENT_MOUSEWHEEL
EVENT_RBUTTONDBLCLK
EVENT_RBUTTONDOWN
EVENT_RBUTTONUP
# demo-1 鼠標左鍵雙擊畫圓
import cv2
import numpy as np
#mouse callback function
def draw_circle(event,x,y,flags,param):
if event==cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img,(x,y),100,(255,0,0),-1)
# 創建圖像與窗口並將窗口與回調函數綁定
img=np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
if cv2.waitKey(20)== ord('q'):
break
cv2.destroyAllWindows()
# demo-2 鼠標按下擡起畫矩形
import cv2
sx, sy = 0, 0
# 鼠標事件回調
def draw_rectangle(event, x, y, flags, param):
global sx, sy
if event == cv2.EVENT_LBUTTONDOWN:
sx, sy = x, y
elif event == cv2.EVENT_LBUTTONUP:
cv2.rectangle(img, (sx,sy), (x,y), (255,0,255), 3)
# 創建圖像與窗口並將窗口與回調函數綁定
img = cv2.imread('F:/Pictures/tiger.jpg')
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_rectangle)
while(1):
cv2.imshow('image',img)
if cv2.waitKey(20)== ord('q'):
break
cv2.destroyAllWindows()