如何使用Python的OpenCV庫處理圖像和視頻

介紹

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

在本文中,我將介紹如何使用 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()

輸出

8fcf702413cc22140704667f34159ac5.png

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))

34c7e0af8647c752d14a76f26d2e0446.jpeg

4. 翻轉圖像:

要翻轉圖像,我們使用函數 cv2.flip() 並傳遞參數,即圖像和翻轉代碼(水平或垂直)

例子:

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

9e581f15a328c079c06a495c68fd5ab7.jpeg

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]

7d058824699703414b838ee6563a971c.jpeg

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)

e97758f81813a3bdff9bea40ad456e7f.png

使用 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))

de074b28336c1c21270ccbdba5bb1f94.png

為瞭捕捉視頻,我們使用函數 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處理圖像和視頻內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: