如何使用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. 從文件中讀取圖像
- 使用函數imread()讀取圖片 (支持BMP、jpeg、tiff、png、便攜圖片格式等)
- 為瞭顯示我們在上一步中讀取的圖像,我們使用函數“imshow()”。這個函數的第一個參數是標題,第二個是我們讀到的圖像。
- waitkey() 函數顯示一個窗口幾毫秒。毫秒數作為參數傳遞給函數。如果 0 作為參數傳遞,它將永遠等待,直到按下任何鍵。
- 最後,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. 捕獲視頻幀的屬性:
讓我們看幾個捕獲視頻屬性的示例。
要捕獲幀形狀:
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. 讀取視頻文件
- 導入 cv2
- 然後我們使用函數 cv2.VideoCapture() 來捕捉視頻。
- 接下來,我們循環遍歷每一幀並使用函數 cap.read() 讀取幀。
- 為瞭顯示每一幀,我們使用方法 cv2.imshow()。
- 最後,我們使用 waitKey() 函數中斷循環,當用戶按下任意鍵時,該函數會中斷循環。
- 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. 編寫視頻文件
- 導入 cv2
- 使用函數 cv2.VideoCapture() 捕獲視頻
- 然後我們使用函數 cv2.VideoWriter 來編寫視頻。該函數將參數作為
- cv2.VideoWriter(filename, fourcc, fps, framesize)
- filename – 捕獲的輸入視頻文件
- Fourcc – 用於指定視頻編解碼器的代碼
- fps – 每秒幀數
- framesize – 視頻框的高度和寬度
- 接下來,我們循環遍歷每一幀並使用對象 video_writer 來寫入幀。
- 最後,我們使用 waitKey() 函數來打破循環
- 使用函數 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!
推薦閱讀:
- python通過opencv調用攝像頭操作實例分析
- python 基於opencv操作攝像頭
- opencv-python圖像處理安裝與基本操作方法
- python基於opencv實現人臉識別
- OpenCV半小時掌握基本操作之圖像基礎操作