如何使用Python的OpenCV庫處理圖像和視頻
介紹
眾所周知,計算機視覺在機器學(xué)習(xí)和人工智能領(lǐng)域獲得了巨大的普及。圖像識別技術(shù)允許計算機處理比人眼更多的信息,通常更快、更準(zhǔn)確,或者只是在人們不參與觀看的情況下處理。因此,你可能想知道機器如何學(xué)習(xí)和解釋視覺世界。
在本文中,我將介紹如何使用 Python 的 OpenCV 庫開始處理圖像和視頻。我們將涵蓋以下主題:
- 計算機視覺簡介
- OpenCV 庫及其應(yīng)用簡介
- 如何使用 OpenCV 庫處理圖像和視頻
計算機視覺
它是人工智能和計算機科學(xué)的一個領(lǐng)域,訓(xùn)練計算機理解視覺世界。它是機器學(xué)習(xí)的主要組成部分之一。它處理自然世界的圖像(高維數(shù)據(jù))。它執(zhí)行各種任務(wù),例如獲取、分析和處理以理解圖像并將其轉(zhuǎn)換為數(shù)字或符號信息。
當(dāng)今的計算機視覺算法基于模式識別,通常依賴于卷積神經(jīng)網(wǎng)絡(luò) (CNN)。由于該領(lǐng)域的各種進步,計算機視覺正在蓬勃發(fā)展,并且它的受歡迎程度在過去幾年中呈指數(shù)增長。
計算機視覺的應(yīng)用范圍從缺陷檢測到入侵者檢測、口罩檢測到腫瘤檢測、作物監(jiān)測到植物監(jiān)測、車輛分類到交通流量分析等。該技術(shù)主要應(yīng)用于零售和制造、交通、媒體、農(nóng)業(yè)、醫(yī)療保健、體育、銀行、增強現(xiàn)實、家庭安全等。
OpenCV
Python 包含一個名為 OpenCV 的庫,用于在計算機視覺領(lǐng)域工作。它是一個開源庫,于 1999 年推出。我們可以執(zhí)行圖像處理、圖像分析、視頻分析等任務(wù)。該庫主要用 C++ 編寫,具有 C++、Python、Java 和 MATLAB 等接口。
應(yīng)用:
- 2D 和 3D 特征工具包
- 視頻/圖像搜索檢索
- 人臉識別系統(tǒng)
- 手勢識別
- 移動機器人
- 對象識別
- 醫(yī)學(xué)影像分析
- 運動追蹤
- 增強現(xiàn)實
安裝
使用 pip 命令可以輕松安裝 OpenCV,如下所示
pip install opencv-python
使用 OpenCV 處理圖像
在處理圖像時,OpenCV 有許多可以對圖像執(zhí)行的操作。其中,我將討論:
- 讀取圖像
- 調(diào)整圖像大小
- 旋轉(zhuǎn)圖像
- 翻轉(zhuǎn)圖像
- 重寫圖像
- 裁剪圖像
- 在圖像上繪制各種形狀
1. 從文件中讀取圖像
- 使用函數(shù)imread()讀取圖片 (支持BMP、jpeg、tiff、png、便攜圖片格式等)
- 為了顯示我們在上一步中讀取的圖像,我們使用函數(shù)“imshow()”。這個函數(shù)的第一個參數(shù)是標(biāo)題,第二個是我們讀到的圖像。
- waitkey() 函數(shù)顯示一個窗口幾毫秒。毫秒數(shù)作為參數(shù)傳遞給函數(shù)。如果 0 作為參數(shù)傳遞,它將永遠等待,直到按下任何鍵。
- 最后,destroyAllWindows() 將圖像窗口顯示后從內(nèi)存中刪除。
例子:
python 代碼:
import cv2 img=cv2.imread('img.jpeg') cv2.imshow('Image',img) cv2.waitKey() cv2.destroyAllWindows()
輸出
2. 調(diào)整圖像大?。?/h3>
在圖像處理中,經(jīng)常需要調(diào)整圖像的大小。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. 旋轉(zhuǎn)圖像
使用 OpenCV 旋轉(zhuǎn)圖像的語法是
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. 翻轉(zhuǎn)圖像:
要翻轉(zhuǎn)圖像,我們使用函數(shù) cv2.flip() 并傳遞參數(shù),即圖像和翻轉(zhuǎn)代碼(水平或垂直)
例子:
#flip- vertical axes img=cv2.flip(img,0) #flip- horizontal axes img=cv2.flip(img,1)
5. 重寫圖像
要將圖像重寫為新文件,我們使用函數(shù) 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,我們可以使用不同的函數(shù)在圖像上快速繪制各種形狀,如圓形、矩形、多邊形等。讓我們用一個例子來理解:
例子:
#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 處理視頻,我們使用以下函數(shù):
Cv2.VideoCapture():它建立與視頻的連接。它帶有一個參數(shù),該參數(shù)指示是使用內(nèi)置攝像頭還是附加攝像頭。值“0”表示內(nèi)置攝像頭。
Cap.read():這個方法可以讓我們得到一個幀。
Cv2.cvtColor():允許你更改圖像使用的顏色模型。這包括從 BGR 轉(zhuǎn)換為 RGB 和灰度。
在處理視頻方面,在本文中,我們將學(xué)習(xí)
- 如何捕獲視頻幀的不同屬性
- 讀取視頻文件
- 寫視頻
1. 捕獲視頻幀的屬性:
讓我們看幾個捕獲視頻屬性的示例。
要捕獲幀形狀:
frame.shape (2160, 3840, 3) plt.imshow(frame) plt.show()
要更改框架的顏色,我們使用函數(shù) cv2.cvtColor(),如下所示:
#changing the color of the frame plt.show() plt.imshow(cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY))
為了捕捉視頻,我們使用函數(shù) cv2.VideoCapture()
cap=cv2.VideoCapture('/content/video.mp4') cap.read()
要獲取框架的高度,我們使用 cap.get() 函數(shù)如下:
#height cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
為了獲得框架的寬度,我們使用:
#width cap.get(cv2.CAP_PROP_FRAME_WIDTH)
要獲取幀數(shù),我們使用函數(shù) cap.get() 如下:
#number of frames
cap.get(cv2.CAP_PROP_FRAME_COUNT)
為了獲得每秒的幀數(shù),我們使用
#number of frames per sec cap.get(cv2.CAP_PROP_FPS)
2. 讀取視頻文件
- 導(dǎo)入 cv2
- 然后我們使用函數(shù) cv2.VideoCapture() 來捕捉視頻。
- 接下來,我們循環(huán)遍歷每一幀并使用函數(shù) cap.read() 讀取幀。
- 為了顯示每一幀,我們使用方法 cv2.imshow()。
- 最后,我們使用 waitKey() 函數(shù)中斷循環(huán),當(dāng)用戶按下任意鍵時,該函數(shù)會中斷循環(huán)。
- destroyAllWindows() 函數(shù)將關(guān)閉窗口。
例子:
#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. 編寫視頻文件
- 導(dǎo)入 cv2
- 使用函數(shù) cv2.VideoCapture() 捕獲視頻
- 然后我們使用函數(shù) cv2.VideoWriter 來編寫視頻。該函數(shù)將參數(shù)作為
- cv2.VideoWriter(filename, fourcc, fps, framesize)
- filename - 捕獲的輸入視頻文件
- Fourcc - 用于指定視頻編解碼器的代碼
- fps - 每秒幀數(shù)
- framesize - 視頻框的高度和寬度
- 接下來,我們循環(huán)遍歷每一幀并使用對象 video_writer 來寫入幀。
- 最后,我們使用 waitKey() 函數(shù)來打破循環(huán)
- 使用函數(shù) destroyAllWindows() 關(guān)閉窗口
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()
結(jié)論
本文幫助你創(chuàng)建了與計算機視覺相關(guān)的出色應(yīng)用程序。希望你現(xiàn)在對以下內(nèi)容有一個很好的了解:
- 什么是計算機視覺
- OpenCV 庫的應(yīng)用
- 使用 OpenCV 庫處理圖像
- 使用 OpenCV 庫處理視頻
總結(jié)
到此這篇關(guān)于如何使用Python的OpenCV庫處理圖像和視頻的文章就介紹到這了,更多相關(guān)Python OpenCV處理圖像和視頻內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python統(tǒng)計列表中每個元素出現(xiàn)次數(shù)的4種實現(xiàn)
本文主要介紹了Python統(tǒng)計列表中每個元素出現(xiàn)次數(shù)的4種實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07python_array[0][0]與array[0,0]的區(qū)別詳解
今天小編就為大家分享一篇python_array[0][0]與array[0,0]的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02python pytorch模型轉(zhuǎn)onnx模型的全過程(多輸入+動態(tài)維度)
這篇文章主要介紹了python pytorch模型轉(zhuǎn)onnx模型的全過程(多輸入+動態(tài)維度),本文給大家記錄記錄了pt文件轉(zhuǎn)onnx全過程,簡單的修改即可應(yīng)用,結(jié)合實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧2024-03-03