中文字幕 日本 在线 高清,久久精品国产99精品国,超碰人人香蕉,一区二区三区无码高清视频

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

作者:Anirudh Rao

翻譯:吳金笛

校對:李潔

本文約4000字,建議閱讀10 分鐘。

本文將通過幾個簡單的實例帶你上手OpenCV庫,新手必備!

OpenCV Python 教程

在這個OpenCV Python 的教程中, 我們將使用Python中的OpenCV庫來介紹計算機視覺的各個方面。OpenCV 長期以來一直是軟件開發(fā)的重要部分。對開發(fā)人員來說學習OpenCV是提高編程能力并幫助他們發(fā)展軟件開發(fā)職業(yè)生涯的好方法。

什么是計算機視覺?

為了簡化這個問題的答案, 讓我們來試想一個場景。

假設(shè)你和你的朋友去度假,然后你上傳了很多照片到Facebook上。但是現(xiàn)在在每張照片中找到你朋友的臉并標記它們要花費很多時間。實際上,F(xiàn)acebook已經(jīng)足夠智能,它可以幫你標記人物。

那么,你認為自動的特征標記是如何工作的呢? 簡單來說,它通過計算機視覺來實現(xiàn)。

計算機視覺是一個跨學科領(lǐng)域,它解決如何使計算機從數(shù)字圖像或視頻中獲得高層次的理解的問題。

這里的想法是將人類視覺系統(tǒng)可以完成的任務(wù)自動化。因此,計算機應(yīng)該能夠識別諸如人臉或者燈柱甚至雕像之類的物體。

計算機如何讀取圖像?

思考以下圖片:

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

我們可以認出它是紐約天際線的圖片。 但是計算機可以自己發(fā)現(xiàn)這一切嗎?答案是不!

計算機將任何圖片都讀取為一組0到255之間的值。

對于任何一張彩色圖片,有三個主通道——紅色(R),綠色(G)和藍色(B)。它的工作原理非常簡單。

對每個原色創(chuàng)建一個矩陣,然后,組合這些矩陣以提供R, G和B各個顏色的像素值。

每一個矩陣的元素提供與像素的亮度強度有關(guān)的數(shù)據(jù)。

思考下圖:

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

如圖所示,圖像的大小被計算為B x A x 3。

注意:對于黑白圖片,只有一個單一通道。

現(xiàn)在讓我們來看看OpenCV究竟是什么。

什么是OpenCV?

OpenCV是一個旨在解決計算機視覺問題的Python庫。OpenCV最初由Intel在1999年開發(fā),但是后來由Willow Garage資助。它支持很多編程語言,如C ,Python,Java等等。它也支持多種平臺,包括Windows,Linux和MacOS。

OpenCV Python只是一個與Python一起使用的原始C 庫的包裝類。通過使用它,所有OpenCV數(shù)組結(jié)構(gòu)都能被轉(zhuǎn)化為NumPy數(shù)組或從NumPy數(shù)組轉(zhuǎn)化而來。這樣就可以輕松地將其與其他使用NumPy的庫集成。例如,SciPy和Matplotlib等庫。

OpenCV的基礎(chǔ)操作?

Opencv能完成以下從加載圖像到調(diào)整大小等基本操作:

  • 使用OpenCV加載圖片
  • 查看圖片形狀/分辨率
  • 顯示圖片
  • 調(diào)整圖像大小

1. 使用OpenCV加載圖片

Import cv2 # colored Image Img = cv2.imread (\”Penguins.jpg\”,1) # Black and White (gray scale) Img_1 = cv2.imread (\”Penguins.jpg\”,0)

如以上代碼所示,第一個要求是導(dǎo)入OpenCV模塊。

之后,我們可以用imread模塊讀取圖片。參數(shù)中的1代表這是一個彩色圖片。如果這個參數(shù)的值是0,就意味著這個將被導(dǎo)入的圖片是黑白圖片。這里的圖片名稱是“Penguins”。很簡單吧?

2. 查看圖片形狀/分辨率

我們可以使用shape子函數(shù)來輸出圖片的形狀??纯匆韵麓a:

Import cv2 # Black and White (gray scale) Img = cv2.imread (\”Penguins.jpg\”,0) Print(img.shape)

對于圖片的形狀,我們指的是NumPy數(shù)組的形狀。執(zhí)行代碼之后你將會看到這個矩陣由768行和1024列組成。

3. 顯示圖片

使用OpenCV顯示圖片非常簡單和直接。思考以下圖片:

import cv2 # Black and White (gray scale) Img = cv2.imread (\”Penguins.jpg\”,0) cv2.imshow(\”Penguins\”, img) cv2.waitKey(0) # cv2.waitKey(2000) cv2.destroyAllWindows()

正如你所見,我們首先使用imread導(dǎo)入圖片。我們需要一個輸出窗口來顯示這個圖片,對吧?

然后,我們等待用戶事件。waitKey使窗口保持靜態(tài)直到用戶按下一個鍵。傳入的參數(shù)是以毫秒為單位的時間。

最后,我們根據(jù)waitForKey的參數(shù)使用destroyAllWindows關(guān)閉窗口。

4. 調(diào)整圖像大小

類似地,調(diào)整圖像大小非常簡單。 這里有另一個代碼段:

import cv2 # Black and White (gray scale) img = cv2.imread (\”Penguins.jpg\”,0) resized_image = cv2.resize(img, (650,500)) cv2.imshow(\”Penguins\”, resized_image) cv2.waitKey(0) cv2.destroyAllWindows()

這里,resize函數(shù)用于將圖像大小調(diào)整為所需的形狀。這里的參數(shù)是新調(diào)整大小后的圖像的形狀。

與之前的代碼相比,剩下的代碼非常簡單,對嗎?

我相信你們對企鵝很好奇,這是我們想要輸出的圖片!

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

這是另一個向resize函數(shù)傳遞參數(shù)的方法??纯聪旅娴谋硎痉椒ǎ?/p>

Resized_image = cv2.resize(img, int(img.shape[1]/2), int(img.shape[0]/2)))

這里,我們得到的新圖像大小是原始圖像的一半。

使用OpenCV進行人臉檢測

這看起來很復(fù)雜,但實際上很容易。 讓我?guī)懔私庹麄€過程,然后你也會有同樣的感受。

第一步:想一想我們的先決條件。我們首先需要一個圖像。然后,我們需要創(chuàng)建一個級聯(lián)分類器,它最后會給我們提供面部特征。

第二步:這一步要使用到OpenCV讀取圖像和特征文件。所以這個時候,原始數(shù)據(jù)點是NumPy數(shù)組的形式。

我們要做的就是搜索面部 NumPy n維數(shù)組的行和列的值。這是具有面部矩形坐標的數(shù)組。

第三步:最后一步是使用矩形面框顯示圖像。

看看下面的圖片,這里我以圖片的形式總結(jié)了上述的三個步驟以便于閱讀:

非常直接明了,對吧?

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

首先,如之前所述,我們創(chuàng)建CascadeClassifier對象來提取面部特征。包含面部特征的XML文件路徑是此處的參數(shù)。

下一步是讀取一個包含面部的圖片,并且使用COLOR_BGR2GREY將其轉(zhuǎn)化為黑白圖片。接下來,我們搜索圖像的坐標。這是使用detectMultiScale來實現(xiàn)的。

你問什么坐標?它是面部矩形的坐標。scaleFactor被用來減小5%的形狀值,直到找到面部。因此,總的來說,值越小,準確度越高。

最后,這張臉被顯示到窗口。

  • 給識別的人臉添加矩形面框

這個邏輯很簡單——就像使用for循環(huán)語句一樣簡單??纯聪旅娴膱D片:

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

我們通過傳遞參數(shù)(比如圖片對象,輪廓框的RGB值和矩形的寬度),使用cv2.rectangle來定義方法以創(chuàng)建一個矩形。

讓我們來看看面部檢測的完整代碼:

import cv2 # Create a CascadeClassifier Object face_cascade = cv2.CascadeClassifier(\”haarcascade_frontalface_default.xml\”) # Reading the image as it is img = cv2.imread(\”photo.jpg\”) # Reading the image as gray scale image gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # Search the co-ordintes of the image faces = face_cascade.detectMultiScale(gray_img, scaleFactor = 1.05, minNeighbors=5) for x,y,w,h in faces: img = cv2.rectangle(img, (x,y), (x w,y h),(0,255,0),3) resized = cv2.resize(img, (int(img.shape[1]/7),int(img.shape[0]/7))) cv2.imshow(\”Gray\”, resized) cv2.waitKey(0) cv2.destroyAllWindows()

使用OpenCV捕獲視頻

使用OpenCV捕獲視頻同樣非常簡單。以下的流程能夠給你一個更好的理解??纯催@個:

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

圖片被逐個讀取,因此由于幀的快速處理而產(chǎn)生視頻,這使得獨立的圖片動起來。

看一看下面這張圖:

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

首先我們像平常一樣導(dǎo)入OpenCV庫。接下來,我們有一個叫做VideoCapture的方法,用來創(chuàng)建VideoCapture對象。這個方法用于觸發(fā)用戶計算機上的攝像頭。這個函數(shù)的參數(shù)表示程序應(yīng)該使用內(nèi)置攝像頭還是附加攝像頭。“0”表示在這個例子中使用內(nèi)置攝像頭。

最后,release方法用于在幾毫秒內(nèi)釋放攝像頭。

當你繼續(xù)并嘗試執(zhí)行上述代碼時,你會注意到攝像頭指示燈會在一瞬間開啟并稍后關(guān)閉。為什么會這樣?

這是因為沒有持續(xù)時間來保持相機功能。

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

看看以上代碼,我們有新的一行time.sleep(3)。這使腳本停止3秒。請注意,傳遞的參數(shù)是以秒為單位的時間。因此,當代碼執(zhí)行時,網(wǎng)絡(luò)攝像頭將開啟3秒鐘。

  • 添加窗口

添加一個窗口來顯示視頻的輸出非常簡單,與用于圖像的相同方法差不多。 但是,還是有一點變化。 請看以下代碼:

我很確定除了一兩行外,你能很大程度地理解以上的代碼。

在這里,我們定義了一個NumPy數(shù)組,用于表示視頻捕獲的第一個圖像。它被保存在frame數(shù)組中。

我們還有check。這是一個布爾數(shù)據(jù)類型。如果Python能夠訪問和讀取VideoCapture對象則返回True。

看看下面的輸出:

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

如你所見,我們得到的輸出為True,并打印了frame數(shù)組的一部分。

但是我們需要讀取視頻的第一個幀/圖才能開始,是吧?

要做到這一點,首先我們需要創(chuàng)建一個frame對象,它將讀取VideoCapture對象的圖像。

如上所示,imshow方法用于捕獲視頻的第一幀。

在此期間,我們已經(jīng)嘗試了捕獲視頻的第一圖像/幀。

那么我們?nèi)绾卧贠penCV中捕獲視頻而不是第一張圖像呢?

  • 直接捕獲視頻

為了捕獲視頻,我們將使用while循環(huán)。while的條件是這樣的:除非“check”值為True,否則Python將顯示幀。

這是代碼段的圖片:

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

我們利用cvtColor函數(shù)將每個幀轉(zhuǎn)換為灰度圖像,如前所述。

waitKey(1)將確保在每毫秒的間隙后生成一個新幀。

重要的是要注意while循環(huán)是完全有效的,以幫助完全迭代幀并在最終顯示視頻。

這里還有一個用戶事件觸發(fā)器。一旦用戶按下“q”鍵,程序窗口就會關(guān)閉。

OpenCV很容易掌握,對吧? 我個人喜歡它的良好的可讀性以及初學者開始使用OpenCV時極快的上手速度。

使用案例:使用OpenCV的運動檢測器

1. 問題描述

你正在接觸一家研究人類行為的公司。你的任務(wù)是為他們提供可以檢測前方運動的網(wǎng)絡(luò)攝像頭。它應(yīng)該返回一個圖,并且這個圖應(yīng)該包含人/物體在攝像頭前面的時間。

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

那么現(xiàn)在我們已經(jīng)定義了我們的問題陳述,我們需要構(gòu)建一個解決方案邏輯以結(jié)構(gòu)化的方式來解決問題。

看看下面的圖表:

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

最開始,我們將圖像保存在特定的frame當中。

下一步是將圖像轉(zhuǎn)化為高斯模糊圖像。這樣做是為了保證我們能計算模糊圖像和真實圖像之間的明顯的差異。

此時,圖像仍然不是對象。我們定義一個閾值來去除瑕疵,比如圖像中的陰影和其他噪聲。

對象的邊框稍后定義。我們在對象周圍添加一個矩形框,正如我們在本教程前面所討論的那樣。

最后,我們計算對象出現(xiàn)在畫面和退出畫面的時間。

很簡單吧?

這是代碼段:

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

這里也遵循同樣的原則。我們首先導(dǎo)入包并創(chuàng)建VideoCapture對象,以確保我們使用網(wǎng)絡(luò)攝像頭捕獲視頻。

While循環(huán)遍歷視頻的各個幀。我們將彩色幀轉(zhuǎn)換為灰度圖像,然后將此灰度圖像轉(zhuǎn)化為高斯模糊圖。

我們需要存儲視頻的第一個圖像/幀,對吧?出于這個目的,我們使用if語句。

現(xiàn)在,讓我們深入了解一下代碼:

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

我們使用absdiff函數(shù)計算第一個幀和其他所有幀之間的差異。

threshold函數(shù)提供閾值,它將差異值小于30的像素轉(zhuǎn)換為黑。如果像素的差異值大于30,則轉(zhuǎn)換為白色。THRESH_BINARY就適用于此目的。

然后,我們使用findContours函數(shù)給圖像定義輪廓區(qū)域。我們也在這個階段加入邊界。

就像之前解釋過的,contourArea函數(shù)可消除陰影和噪聲。為了簡化,它將只保留白色部分,正如我們定義的,白色部分面積大于1000像素。

然后,在我們的工作幀中在對象的周圍創(chuàng)建一個矩形框。

接下來是這個簡單的代碼:

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

如前所述,幀每毫秒改變一次,并且當用戶輸入“q”時,跳出循環(huán)并關(guān)閉窗口。

在我們的用例中還有一件事就是我們要計算對象在攝像頭前的時間。

2. 計算時間

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

我們用DataFrame存儲對象出現(xiàn)在幀中被檢測到的時間和運動的時間。

接下來是我們之前解釋過的VideoCapture函數(shù)。但是在這里,我們有一個標志位,稱之為status。我們在記錄開始時設(shè)置status為0,因為對象在最初是不可見的。

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

如上圖所示,當檢測到對象時,我們將status標志更改為1。很簡單吧?

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

我們將創(chuàng)建一個status的列表存儲每一個掃描到的幀的狀態(tài),然后如果某處發(fā)生改變則使用datetime在列表中記錄日期和時間。

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

如以上的解釋圖所示,我們將時間值存儲在 DataFrame中。我們以把DataFrame寫入CSV文件中結(jié)束,如圖所示。

3. 繪制運動檢測圖

我們實例的最后一步是顯示結(jié)果。我們將要顯示的是表示兩軸上的運動的圖形??纯匆韵麓a:

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

首先,我們從motion_detector.py文件中導(dǎo)入DataFrame。

下一步是將時間轉(zhuǎn)換為可讀的并且可以解析的字符串形式。

最后,使用Bokeh plots在瀏覽器上繪制時間值的DataFrame。

輸出:

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

結(jié)論:

我希望這個OpenCV Python的教程能幫助你學習所有由Python開始使用OpenCV所需的基礎(chǔ)。

當你嘗試開發(fā)需要圖像識別和類似原理的軟件時就會非常方便了?,F(xiàn)在你還能夠在Python OpenCV的幫助下輕松地使用這些概念來開發(fā)應(yīng)用程序。

原文標題:

Computer Vision Using OpenCV

原文鏈接:

https://dzone.com/articles/opencv-python-tutorial-computer-vision-using-openc

譯者簡介

手把手教你使用OpenCV庫(附實例、Python代碼解析)(opencv庫怎么用)

吳金笛,雪城大學計算機科學碩士一年級在讀。迎難而上是我最舒服的狀態(tài),動心忍性,曾益我所不能。我的目標是做個早睡早起的Cool Girl。

— 完 —

關(guān)注清華-青島數(shù)據(jù)科學研究院官方微信公眾平臺“THU數(shù)據(jù)派”及姊妹號“數(shù)據(jù)派THU”獲取更多講座福利及優(yōu)質(zhì)內(nèi)容。

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。

(0)
上一篇 2024年5月2日 上午8:05
下一篇 2024年5月2日 上午8:17

相關(guān)推薦