OpenCV 中的 Gui 特性

圖片讀寫

  • 讀入圖像
    使用函數 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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章