首頁 > 軟體

如何使用Python的OpenCV庫處理影象和視訊

2022-10-30 14:01:00

介紹

眾所周知,計算機視覺在機器學習和人工智慧領域獲得了巨大的普及。影象識別技術允許計算機處理比人眼更多的資訊,通常更快、更準確,或者只是在人們不參與觀看的情況下處理。因此,你可能想知道機器如何學習和解釋視覺世界。

在本文中,我將介紹如何使用 Python 的 OpenCV 庫開始處理影象和視訊。我們將涵蓋以下主題:

  • 計算機視覺簡介
  • OpenCV 庫及其應用簡介
  • 如何使用 OpenCV 庫處理影象和視訊

計算機視覺

它是人工智慧和電腦科學的一個領域,訓練計算機理解視覺世界。它是機器學習的主要組成部分之一。它處理自然世界的影象(高維資料)。它執行各種任務,例如獲取、分析和處理以理解影象並將其轉換為數位或符號資訊。

當今的計算機視覺演演算法基於圖形識別,通常依賴於折積神經網路 (CNN)。由於該領域的各種進步,計算機視覺正在蓬勃發展,並且它的受歡迎程度在過去幾年中呈指數增長。

計算機視覺的應用範圍從缺陷檢測到入侵者檢測、口罩檢測到腫瘤檢測、作物監測到植物監測、車輛分類到交通流量分析等。該技術主要應用於零售和製造、交通、媒體、農業、醫療保健、體育、銀行、擴增實境、家庭安全等。

OpenCV

Python 包含一個名為 OpenCV 的庫,用於在計算機視覺領域工作。它是一個開源庫,於 1999 年推出。我們可以執行影象處理、影象分析、視訊分析等任務。該庫主要用 C++ 編寫,具有 C++、Python、Java 和 MATLAB 等介面。

應用:

  • 2D 和 3D 特徵工具包
  • 視訊/影象搜尋檢索
  • 臉部辨識系統
  • 手勢識別
  • 移動機器人
  • 物件識別
  • 醫學影像分析
  • 運動追蹤
  • 擴增實境

安裝

使用 pip 命令可以輕鬆安裝 OpenCV,如下所示

pip install opencv-python

使用 OpenCV 處理影象

在處理影象時,OpenCV 有許多可以對影象執行的操作。其中,我將討論:

  1. 讀取影象
  2. 調整影象大小
  3. 旋轉影象
  4. 翻轉影象
  5. 重寫影象
  6. 裁剪影象
  7. 在影象上繪製各種形狀

1. 從檔案中讀取影象

  1. 使用函數imread()讀取圖片 (支援BMP、jpeg、tiff、png、便攜圖片格式等)
  2. 為了顯示我們在上一步中讀取的影象,我們使用函數“imshow()”。這個函數的第一個引數是標題,第二個是我們讀到的影象。
  3. waitkey() 函數顯示一個視窗幾毫秒。毫秒數作為引數傳遞給函數。如果 0 作為引數傳遞,它將永遠等待,直到按下任何鍵。
  4. 最後,destroyAllWindows() 將影象視窗顯示後從記憶體中刪除。

例子:

python 程式碼:

import cv2
 
img=cv2.imread('img.jpeg')
cv2.imshow('Image',img)
cv2.waitKey()
cv2.destroyAllWindows()

輸出

2. 調整影象大小:

在影象處理中,經常需要調整影象的大小。OpenCV 為我們提供了幾種輕鬆重新縮放影象的方法。讓我們通過一個例子來理解。

例子:

img2=cv2.resize(img,(400,400))
#resize by a fraction of original size
img3=cv2.resize(img,(0,0),fx=0.5,fy=0.6)
#using INTER_AREA to shrink the image
img4=cv2.resize(img,(600,700),interpolation=cv2.INTER_AREA)

3. 旋轉影象

使用 OpenCV 旋轉影象的語法是

M=cv2.getRotationMatrix2D(center, angle,scale)

然後我們使用方法

cv2.wrapAffine(src,M, (h,w))

讓我們通過一個例子來深入瞭解:

例子:

#calculate height and width to get center
(h,w)=img.shape[:2]
center=(w/2,h/2)
 
#rotate by 90 degrees
M = cv2.getRotationMatrix2D(center, 90, 1.0)
img90 = cv2.warpAffine(img, M, (h, w))
 
#rotate by 180 degrees
M = cv2.getRotationMatrix2D(center, 180, 1.0)
img180 = cv2.warpAffine(img, M, (h, w))
 
#rotate by 270 degrees
M = cv2.getRotationMatrix2D(center, 270, 1.0)
img270 = cv2.warpAffine(img, M, (h, w))

4. 翻轉影象:

要翻轉影象,我們使用函數 cv2.flip() 並傳遞引數,即影象和翻轉程式碼(水平或垂直)

例子:

#flip- vertical axes
img=cv2.flip(img,0) 
#flip- horizontal axes
img=cv2.flip(img,1)

5. 重寫影象

要將影象重寫為新檔案,我們使用函數 imwrite() 如下:

cv2.imwrite('new_img.jpg',img)

6. 裁剪影象

#crop from top
img=img[0:100,0:100]
#crop by specifying height and width
img=img[50:200,50:100]

7. 繪製形狀

使用 OpenCV,我們可以使用不同的函數在影象上快速繪製各種形狀,如圓形、矩形、多邊形等。讓我們用一個例子來理解:

例子:

#creating a blank image
import cv2 as cv2
import numpy as np
img=np.zeros((500,500,3),dtype=float)
#changing the color of the image to green
img[:]=0,255,0
#Red
img[:]=0,0,255
#changing the color of a particular portion
img[200:300,300:450]=0,255,0
#drawing a rectangle
cv2.rectangle(img,(100,100),(180,180),color=(255,0,0),thickness=5)
#draw a circle with filling the color
cv2.circle(img,center=(100,300),radius=60,color=(0,255,0),thickness=-1)
#drawing a line 
cv2.line(img,(0,0),(317,356),thickness=3,color=(0,255,0))
#adding text
cv2.putText(img,org=(50,50),fontScale=3,color=(255,0,0)
,thickness=2,lineType=cv2.LINE_AA,text="IMAGES", fontFace=cv2.FONT_HERSHEY_COMPLEX_SMALL)
cv2_imshow(img)
cv2.waitKey(0)

使用 OpenCV 處理視訊

視訊是幀序列或影象序列。影象通常採用 BGR(藍、綠、紅)的形式。每個畫素的值都在 0-255 之間。要開始使用 OpenCV 處理視訊,我們使用以下函數:

Cv2.VideoCapture():它建立與視訊的連線。它帶有一個引數,該引數指示是使用內建攝像頭還是附加攝像頭。值“0”表示內建攝像頭。

Cap.read():這個方法可以讓我們得到一個幀。

Cv2.cvtColor():允許你更改影象使用的顏色模型。這包括從 BGR 轉換為 RGB 和灰度。

在處理視訊方面,在本文中,我們將學習

  1. 如何捕獲視訊幀的不同屬性
  2. 讀取視訊檔
  3. 寫視訊

1. 捕獲視訊幀的屬性:

讓我們看幾個捕獲視訊屬性的範例。

要捕獲幀形狀:

frame.shape
(2160, 3840, 3)
plt.imshow(frame)
plt.show()

要更改框架的顏色,我們使用函數 cv2.cvtColor(),如下所示:

#changing the color of the frame
plt.show()
plt.imshow(cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY))

為了捕捉視訊,我們使用函數 cv2.VideoCapture()

cap=cv2.VideoCapture('/content/video.mp4')
cap.read()

要獲取框架的高度,我們使用 cap.get() 函數如下:

#height
cap.get(cv2.CAP_PROP_FRAME_HEIGHT)

為了獲得框架的寬度,我們使用:

#width
cap.get(cv2.CAP_PROP_FRAME_WIDTH)

要獲取幀數,我們使用函數 cap.get() 如下:

#number of frames
cap.get(cv2.CAP_PROP_FRAME_COUNT)

為了獲得每秒的幀數,我們使用

#number of frames per sec
cap.get(cv2.CAP_PROP_FPS)

2. 讀取視訊檔

  1. 匯入 cv2
  2. 然後我們使用函數 cv2.VideoCapture() 來捕捉視訊。
  3. 接下來,我們迴圈遍歷每一幀並使用函數 cap.read() 讀取幀。
  4. 為了顯示每一幀,我們使用方法 cv2.imshow()。
  5. 最後,我們使用 waitKey() 函數中斷迴圈,當用戶按下任意鍵時,該函數會中斷迴圈。
  6. destroyAllWindows() 函數將關閉視窗。

例子:

#importing dependencies
import cv2
from matplotlib import pyplot as plt
#establish capture
cap=cv2.VideoCapture('/content/video.mp4')
#loop through each frame
while(cap.isOpened()):
  ret,frame=cap.read()
  frame=cv2.resize(frame,(1200,700))
  cv2.imshow(‘Video',frame)
  if cv2.waitKey(10) & 0xFF == ord('q'):
    break
#close down everything
cap.release()
cv2.destroyALLWindows()

3. 編寫視訊檔

  1. 匯入 cv2
  2. 使用函數 cv2.VideoCapture() 捕獲視訊
  3. 然後我們使用函數 cv2.VideoWriter 來編寫視訊。該函數將引數作為
    1. cv2.VideoWriter(filename, fourcc, fps, framesize)
    2. filename - 捕獲的輸入視訊檔
    3. Fourcc - 用於指定視訊編解碼器的程式碼
    4. fps - 每秒幀數
    5. framesize - 視訊框的高度和寬度
  4. 接下來,我們迴圈遍歷每一幀並使用物件 video_writer 來寫入幀。
  5. 最後,我們使用 waitKey() 函數來打破迴圈
  6. 使用函數 destroyAllWindows() 關閉視窗
import cv2
from google.colab.patches import cv2_imshow
cap=cv2.VideoCapture('/content/video.mp4')
height=int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
width=int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
fps=int(cap.get(cv2.CAP_PROP_FPS))
frame_size = (width,height)
video_writer= cv2.VideoWriter('/content/output.avi',cv2.VideoWriter_fourcc('M','J','P','G'), fps, frame_size)
for frame_idx in range(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))):
  ret,frame=cap.read()
  gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
  video_writer.write(gray)
  if cv2.waitKey(10) & 0xFF== ord('q'):
    break
cap.release()
cv2.destroyALLWindows()

結論

本文幫助你建立了與計算機視覺相關的出色應用程式。希望你現在對以下內容有一個很好的瞭解:

  • 什麼是計算機視覺
  • OpenCV 庫的應用
  • 使用 OpenCV 庫處理影象
  • 使用 OpenCV 庫處理視訊

總結

到此這篇關於如何使用Python的OpenCV庫處理影象和視訊的文章就介紹到這了,更多相關Python OpenCV處理影象和視訊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com