天天看點

opencv-python學習筆記(二)—— 圖檔視訊讀寫、繪制幾何形狀、滑鼠事件等系列文章目錄前言一、圖檔讀寫二、視訊讀寫二、繪制幾何形狀三、滑鼠畫筆四、Trackbar

系列文章目錄

opencv-python學習筆記(一)—— opencv介紹

opencv-python學習筆記(二)—— 圖檔視訊讀寫、繪制幾何形狀、滑鼠事件等

opencv-python學習筆記(三)—— 像素操作、幾何變換、性能優化

opencv-python學習筆記(四)—— 圖像處理之色彩空間、圖像幾何變換

文章目錄

  • 系列文章目錄
  • 前言
  • 一、圖檔讀寫
  • 二、視訊讀寫
    • 1. 從相機讀取視訊
    • 2. 從檔案讀取視訊
    • 3. 儲存視訊
  • 二、繪制幾何形狀
    • 1. 直線
    • 2. 矩形
    • 3. 圓
    • 4. 橢圓
    • 5. 多邊形
    • 6. 文字
  • 三、滑鼠畫筆
    • 1. 輕按兩下畫圓
    • 2. 拖動畫矩形或圓
  • 四、Trackbar

前言

在這裡,你将學習如何顯示和儲存圖像和視訊,控制滑鼠事件和建立trackbar。

一、圖檔讀寫

從檔案中讀取圖像(使用cv::imread)

在OpenCV視窗中顯示圖像(使用cv::imshow)

将一個圖像寫入一個檔案(使用cv::imwrite)

代碼:

import cv2 as cv
import sys
img = cv.imread(cv.samples.findFile("starry_night.jpg"))	# 讀
if img is None:
    sys.exit("Could not read the image.")
cv.imshow("Display window", img)	# 顯示
k = cv.waitKey(0)
if k == ord("s"):
    cv.imwrite("starry_night.png", img)	# 儲存
           

結果:

opencv-python學習筆記(二)—— 圖檔視訊讀寫、繪制幾何形狀、滑鼠事件等系列文章目錄前言一、圖檔讀寫二、視訊讀寫二、繪制幾何形狀三、滑鼠畫筆四、Trackbar

二、視訊讀寫

1. 從相機讀取視訊

有時候需要用錄影機捕捉實時視訊流。OpenCV提供了一個非常簡單的接口來實作這一點。讓我們從攝像頭(我正在使用筆記本電腦上的内置攝像頭)擷取一個視訊,将其轉換為灰階視訊并顯示出來。

為了擷取視訊,你需要建立一個videoccapture對象。它的參數可以是裝置索引值或視訊檔案的名稱。裝置索引值用來指定要連接配接的相機。通常如果隻連接配接了一個攝像頭。則傳遞0(或-1),如果有第二個相機,則可以通過傳遞1來選擇第二個相機,以此類推。然後可以逐幀擷取資料。但在最後,别忘了釋放VideoCapture。

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened():
    print("Cannot open camera")
    exit()
while True:
    # Capture frame-by-frame
    ret, frame = cap.read()
    # if frame is read correctly ret is True
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    # Our operations on the frame come here
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # Display the resulting frame
    cv.imshow('frame', gray)
    if cv.waitKey(1) == ord('q'):
        break
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()
           

cap.read()傳回bool (True/False)。如果幀被正确讀取,它将為True。你可以通過檢查這個傳回值來檢查是否正确讀取。

有時,cap可能沒有初始化成功。在這種情況下,此代碼将報錯。可以通過cap.isOpened()方法檢查它是否初始化成功。

可以通過cap.get(cv.CAP_PROP_FRAME_WIDTH)和cap.get(cv.CAP_PROP_FRAME_HEIGHT)擷取每一幀的寬度和高度。預設為640x480。如果想把它改成320x240。隻需使用ret=cap.set(cv.CAP_PROP_FRAME_WIDTH,320)和ret = cap.set(cv.CAP_PROP_FRAME_HEIGHT,240)。

2. 從檔案讀取視訊

從檔案中擷取視訊和從相機中擷取視訊類似,隻需要将錄影機索引值更改為視訊檔案名。

使用cv.waitKey()可以控制視訊播放的速度,一般為25ms即可。

import numpy as np
import cv2 as cv
cap = cv.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 = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    cv.imshow('frame', gray)
    if cv.waitKey(1) == ord('q'):
        break
cap.release()
cv.destroyAllWindows()
           

3. 儲存視訊

下面的代碼讀取錄影機,并翻轉每一幀,然後儲存視訊。

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.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 = cv.flip(frame, 0)
    # write the flipped frame
    out.write(frame)
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break
# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()
           

二、繪制幾何形狀

用OpenCV繪制不同的幾何形狀。

1. 直線

要畫一條直線,需要傳遞直線的起始和結束坐标。我們将建立一個黑色的圖像,并在它上面從左上角到右下角畫一條藍線。

import numpy as np
import cv2 as cv
# Create a black image
img = np.zeros((512,512,3), np.uint8)
# Draw a diagonal blue line with thickness of 5 px
cv.line(img,(0,0),(511,511),(255,0,0),5)
           

2. 矩形

要畫一個矩形,需要矩形的左上角和右下角。這次我們将在圖像的右上角繪制一個綠色矩形。

3. 圓

要畫一個圓,需要它的圓心坐标和半徑。我們将在上面畫的矩形内畫一個圓。

4. 橢圓

要繪制橢圓,我們需要傳遞幾個參數。一個參數是中心位置(x,y)。下一個參數是軸長度(長軸長度,短軸長度)。angle是橢圓逆時針方向的旋轉角。startAngle和endAngle表示從長軸順時針方向測量的橢圓弧的起始和結束。下面的例子在圖像的中心畫了一個半橢圓。

5. 多邊形

要畫一個多邊形,首先需要指定多邊形的頂點坐标。在這裡,我們用黃色畫一個有四個頂點的小多邊形。

pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(0,255,255))
           
注意:如果第三個參數為False,得到是連接配接所有點的折線,而不是一個封閉的形狀

6. 文字

font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)
           

效果:

opencv-python學習筆記(二)—— 圖檔視訊讀寫、繪制幾何形狀、滑鼠事件等系列文章目錄前言一、圖檔讀寫二、視訊讀寫二、繪制幾何形狀三、滑鼠畫筆四、Trackbar

三、滑鼠畫筆

1. 輕按兩下畫圓

建立了一個簡單的應用程式,在輕按兩下圖像的任何位置上繪制一個圓。

import numpy as np
import cv2 as cv
# mouse callback function
def draw_circle(event,x,y,flags,param):
    if event == cv.EVENT_LBUTTONDBLCLK:
        cv.circle(img,(x,y),100,(255,0,0),-1)
# Create a black image, a window and bind the function to window
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
    cv.imshow('image',img)
    if cv.waitKey(20) & 0xFF == 27:
        break
cv.destroyAllWindows()
           
opencv-python學習筆記(二)—— 圖檔視訊讀寫、繪制幾何形狀、滑鼠事件等系列文章目錄前言一、圖檔讀寫二、視訊讀寫二、繪制幾何形狀三、滑鼠畫筆四、Trackbar

2. 拖動畫矩形或圓

通過拖動滑鼠繪制矩形或圓形(取決于我們選擇的模式)

這個具體的例子将真的有助于建立和了解一些互動式應用程式,如目标跟蹤,圖像分割等。

import numpy as np
import cv2 as cv
drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1
# mouse callback function
def draw_circle(event,x,y,flags,param):
    global ix,iy,drawing,mode
    if event == cv.EVENT_LBUTTONDOWN:
        drawing = True
        ix,iy = x,y
    elif event == cv.EVENT_MOUSEMOVE:
        if drawing == True:
            if mode == True:
                cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
            else:
                cv.circle(img,(x,y),5,(0,0,255),-1)
    elif event == cv.EVENT_LBUTTONUP:
        drawing = False
        if mode == True:
            cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
        else:
            cv.circle(img,(x,y),5,(0,0,255),-1)
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
    cv.imshow('image',img)
    k = cv.waitKey(1) & 0xFF
    if k == ord('m'):
        mode = not mode
    elif k == 27:
        break
cv.destroyAllWindows()            
           
opencv-python學習筆記(二)—— 圖檔視訊讀寫、繪制幾何形狀、滑鼠事件等系列文章目錄前言一、圖檔讀寫二、視訊讀寫二、繪制幾何形狀三、滑鼠畫筆四、Trackbar

四、Trackbar

建立一個應用程式:顔色顯示視窗和三個跟蹤條來指定B、G、R顔色。滑動跟蹤欄,相應的視窗顔色就會改變。

import numpy as np
import cv2 as cv
def nothing(x):
    pass
# Create a black image, a window
img = np.zeros((300,512,3), np.uint8)
cv.namedWindow('image')
# create trackbars for color change
cv.createTrackbar('R','image',0,255,nothing)
cv.createTrackbar('G','image',0,255,nothing)
cv.createTrackbar('B','image',0,255,nothing)
# create switch for ON/OFF functionality
switch = '0 : OFF \n1 : ON'
cv.createTrackbar(switch, 'image',0,1,nothing)
while(1):
    cv.imshow('image',img)
    k = cv.waitKey(1) & 0xFF
    if k == 27:
        break
    # get current positions of four trackbars
    r = cv.getTrackbarPos('R','image')
    g = cv.getTrackbarPos('G','image')
    b = cv.getTrackbarPos('B','image')
    s = cv.getTrackbarPos(switch,'image')
    if s == 0:
        img[:] = 0
    else:
        img[:] = [b,g,r]
cv.destroyAllWindows()
           
opencv-python學習筆記(二)—— 圖檔視訊讀寫、繪制幾何形狀、滑鼠事件等系列文章目錄前言一、圖檔讀寫二、視訊讀寫二、繪制幾何形狀三、滑鼠畫筆四、Trackbar

繼續閱讀