訂閱
糾錯(cuò)
加入自媒體

解析Computer Vision和OpenCV庫(kù)的工作原理

在這篇文章中,將嘗試解釋Computer Vision和OpenCV庫(kù)的工作原理。

在整篇文章中,將介紹:什么是計(jì)算機(jī)視覺(jué)?計(jì)算機(jī)視覺(jué)如何工作?計(jì)算機(jī)視覺(jué)的應(yīng)用、什么是OpenCV?OpenCV的簡(jiǎn)史、OpenCV快速入門(mén)

讓我們逐步開(kāi)始。

什么是計(jì)算機(jī)視覺(jué)?

Computer Vision是一個(gè)工作場(chǎng)所,可讓我們以數(shù)字方式檢測(cè)圖像并對(duì)這些圖像執(zhí)行操作。Computer Vision是一個(gè)人工智能工作區(qū),在這里我們可以通過(guò)訪問(wèn)數(shù)字媒體中的圖像特征來(lái)收集信息并提取特征。在其他來(lái)源中,其定義如下:

維基百科:

計(jì)算機(jī)視覺(jué)是一門(mén)跨學(xué)科的科學(xué)領(lǐng)域,涉及計(jì)算機(jī)如何從數(shù)字圖像或視頻中獲得高級(jí)了解。從工程學(xué)的角度來(lái)看,它試圖理解和自動(dòng)化人類(lèi)視覺(jué)系統(tǒng)可以完成的任務(wù)。

IBM:

計(jì)算機(jī)視覺(jué)是人工智能(AI)的領(lǐng)域,它使計(jì)算機(jī)和系統(tǒng)能夠從數(shù)字圖像,視頻和其他視覺(jué)輸入中獲取有意義的信息,并根據(jù)該信息采取行動(dòng)或提出建議。如果AI使計(jì)算機(jī)能夠思考,則計(jì)算機(jī)視覺(jué)使他們能夠看到,觀察和理解。計(jì)算機(jī)視覺(jué)的主要目的是理解圖像并解釋它們以供我們使用。作為人類(lèi),我們可以用眼睛輕松感知任何街道上的移動(dòng)物體。計(jì)算機(jī)使用許多不同的算法來(lái)理解這一點(diǎn)。但是,使用這些算法,計(jì)算機(jī)可能仍無(wú)法給出非常高精度的結(jié)果。

計(jì)算機(jī)視覺(jué)如何工作?

計(jì)算機(jī)使用某些算法來(lái)檢測(cè)數(shù)字媒體中的圖像。數(shù)字媒體中的圖像由像素組成。任何圖像中的像素都具有顏色和坐標(biāo)。想象一下,每個(gè)像素都有自己的標(biāo)識(shí)。在其ID上,它寫(xiě)入坐標(biāo)和顏色信息。這是計(jì)算機(jī)可以檢測(cè)和識(shí)別圖像的方式。像素的坐標(biāo)和顏色信息用數(shù)字表示。數(shù)字是根據(jù)RGB格式定義的。由于圖像身份中的此信息是用數(shù)字表示的,因此計(jì)算機(jī)可以理解這一點(diǎn)。每個(gè)圖像可以包含數(shù)千個(gè)像素。這些像素也作為矩陣保留在圖像上。因此,如果我們要在視覺(jué)上進(jìn)行操作,則需要通過(guò)矩陣進(jìn)行操作。

計(jì)算機(jī)視覺(jué)分為三個(gè)基本步驟:

1.獲取圖像

可以通過(guò)視頻,照片或3D技術(shù)實(shí)時(shí)獲取甚至大集合的圖像進(jìn)行分析。

2.處理圖像

深度學(xué)習(xí)模型會(huì)自動(dòng)執(zhí)行此過(guò)程的大部分過(guò)程,但是通常會(huì)先向模型提供數(shù)千張標(biāo)記或預(yù)先識(shí)別的圖像,然后對(duì)模型進(jìn)行訓(xùn)練。

3.了解圖像

最后一步是解釋性步驟,在此步驟中對(duì)對(duì)象進(jìn)行識(shí)別或分類(lèi)。

計(jì)算機(jī)視覺(jué)的應(yīng)用

最受歡迎的計(jì)算機(jī)視覺(jué)應(yīng)用程序的示例:

癌癥檢測(cè)

COVID-19診斷

口罩檢測(cè)

車(chē)輛分類(lèi)

交通流量分析

停車(chē)占用檢測(cè)

自動(dòng)車(chē)牌識(shí)別

客戶追蹤

人數(shù)盤(pán)點(diǎn)

社會(huì)距離

球追蹤球

門(mén)線技術(shù)

什么是OpenCV?

OpenCV,即開(kāi)源計(jì)算機(jī)視覺(jué)庫(kù)?梢岳斫,它是一個(gè)開(kāi)放源代碼的計(jì)算機(jī)視覺(jué)庫(kù)。如今,它在圖像處理領(lǐng)域非常流行。你可以使用Java,C ++或Python語(yǔ)言在OpenCV上工作。通過(guò)使用OpenCV,人們可以處理圖像和視頻以識(shí)別對(duì)象,面部,甚至是人的筆跡。當(dāng)它與各種庫(kù)(例如Numpy)集成時(shí),python能夠處理OpenCV數(shù)組結(jié)構(gòu)以進(jìn)行分析。為了識(shí)別圖像模式及其各種特征,我們使用向量空間并對(duì)這些特征執(zhí)行數(shù)學(xué)運(yùn)算。

OpenCV的簡(jiǎn)史

OpenCV由加里·布拉德斯基(Gary Bradsky)于1999年在英特爾創(chuàng)立,第一版于2000年問(wèn)世。瓦迪姆·皮薩列夫斯基(Vadim Pisarevsky)與加里·布拉德斯基(Gary Bradsky)一起管理英特爾的俄羅斯軟件OpenCV團(tuán)隊(duì)。2005年,OpenCV用于Stanley,該車(chē)贏得了2005年DARPA大挑戰(zhàn)賽的冠軍。后來(lái),在Willow Garage的支持下,它的發(fā)展得以繼續(xù),Gary Bradsky和Vadim Pisarevsky領(lǐng)導(dǎo)了該項(xiàng)目。OpenCV現(xiàn)在支持與計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)有關(guān)的多種算法,并且正在日益擴(kuò)展。OpenCV支持多種編程語(yǔ)言,例如C ++,Python,Java等,并且可在包括Windows,Linux,OS X,Android和iOS在內(nèi)的不同平臺(tái)上使用;贑UDA和OpenCL的高速GPU操作的接口也正在積極開(kāi)發(fā)中。OpenCV-Python是用于OpenCV的Python API,結(jié)合了OpenCV C ++ API的最佳質(zhì)量和Python語(yǔ)言。

OpenCV快速入門(mén)

在討論了計(jì)算機(jī)視覺(jué)和OpenCV之后,我想向你展示我們可以使用一些簡(jiǎn)單的應(yīng)用程序來(lái)做些什么。這樣,你既可以練習(xí)得更好,又可以進(jìn)入學(xué)習(xí)過(guò)程。讀取圖像首先,我們將使用OpenCV進(jìn)行讀取圖像并將其顯示在屏幕上的過(guò)程。如果在使用Python的IDE中未安裝OpenCV,則必須先安裝它。pip install opencv-python

安裝之后,首先,你必須導(dǎo)入庫(kù)。你可以將OpenCV庫(kù)稱為cv2。你需要將要讀取的圖像保存到對(duì)象中。你可以使用cv2.imread( )函數(shù)讀取圖像。此函數(shù)將獲取圖像的文件的路徑作為參數(shù)。由于我的python工作文件與圖片位于同一文件夾中,因此我直接輸入圖片的名稱。這里要注意的一點(diǎn)是編寫(xiě)視覺(jué)效果的擴(kuò)展。別忘了這個(gè)。當(dāng)我們運(yùn)行代碼時(shí),我們給該窗口命名,因?yàn)樗鼘⒃诳梢暣翱谥写蜷_(kāi)。我們使用cv2.namedWindow( ).函數(shù)執(zhí)行此操作。該函數(shù)將窗口的名稱作為其第一個(gè)參數(shù)。實(shí)際上,這就足夠了。

但是由于我希望能夠更改打開(kāi)的窗口的大小,因此我添加了參數(shù)cv2.WINDOW_NORMAL.代碼運(yùn)行時(shí),函數(shù)cv2.imshow( )用于在屏幕上顯示當(dāng)前圖像。它有兩個(gè)參數(shù)。第一個(gè)是我們將要顯示的視覺(jué)效果的名稱,第二個(gè)是它在其中注冊(cè)的對(duì)象。在這里,我將圖像保存為img。因此,我將img用作第二個(gè)參數(shù)。

最后,我編寫(xiě)該函數(shù)cv2.waitKey(0)是因?yàn)橄M诖蜷_(kāi)的可視屏幕上隨時(shí)關(guān)閉它。此函數(shù)以毫秒為單位獲取數(shù)字值。當(dāng)我們?cè)诖颂帉?xiě)入0時(shí),表示我們可以隨時(shí)關(guān)閉窗口。另外,養(yǎng)成添加函數(shù)cv2.destroyAllWindows().的習(xí)慣。當(dāng)我們執(zhí)行高級(jí)項(xiàng)目時(shí),我們會(huì)忘記關(guān)閉許多在屏幕上打開(kāi)的窗口。此函數(shù)可避免這種情況。你可以在下面找到所有代碼。import cv2                                                        
img = cv2.imread("klon.jpg")
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

從網(wǎng)絡(luò)攝像頭讀取視頻現(xiàn)在,讓我們檢查一下如何從計(jì)算機(jī)攝像機(jī)讀取視頻。首先,我們導(dǎo)入OpenCV庫(kù)。然后,我們將從計(jì)算機(jī)攝像機(jī)拍攝的圖像寫(xiě)在一個(gè)物體上。我將此對(duì)象設(shè)置為捕獲。我們使用cv2.VideoCapture(0)函數(shù)從計(jì)算機(jī)攝像頭捕獲視頻。此處的值0用于訪問(wèn)連接到計(jì)算機(jī)的相機(jī)。如果你有攝像機(jī),則可以將其設(shè)為0。如果你有更多攝像機(jī),則可以嘗試1,2 ..訪問(wèn)相應(yīng)的攝像機(jī)。如你所知,視頻由幀組成。為了查看我們?cè)谝曨l中捕獲的圖像,我們必須將它們循環(huán)打印在屏幕上。

因此,我們進(jìn)行了定義,將讀取捕獲的圖像,然后將該圖像返回給我們。ret, frame = capture.read()

然后我們進(jìn)行調(diào)整。要在鏡中看到自己看到的捕獲圖像,我們需要將它們反轉(zhuǎn)為y軸。這就是為什么我們?cè)趂rame = cv2.flip(frame, 1).此處編寫(xiě)代碼的原因,當(dāng)我們?cè)趲筝斎雲(yún)?shù)為1時(shí),它給出了y軸圖像的倒數(shù)。然后,我們編寫(xiě)代碼cv2.imshow("Webcam", frame)以顯示從相機(jī)拍攝的幀。然后,我們確定捕獲的圖像將在屏幕上保留幾毫秒。除此之外,當(dāng)我們按下鍵盤(pán)上的q鍵時(shí),我們將編寫(xiě)以下代碼以停止接收?qǐng)D像。cv2.imshow("Webcam", frame)
if cv2.waitKey(30) & 0xFF == ord("q"):
   break

在此,0xFF == ord("q")是指按鍵盤(pán)上的q鍵。最后,在處理完視頻之后,完成后,我們需要編寫(xiě)一些代碼來(lái)發(fā)布圖像。如下。capture.release()
你可以在下面找到所有代碼。import cv2
 
capture = cv2.VideoCapture(0)                                        
while True:
    ret, frame = capture.read()
    frame = cv2.flip(frame, 1)
    cv2.imshow("Webcam", frame)
    if cv2.waitKey(30) & 0xFF == ord("q"):
        break
capture.release()
cv2.destroyAllWindows()

長(zhǎng)寬比應(yīng)用現(xiàn)在,我將向你展示一個(gè)長(zhǎng)寬比應(yīng)用程序。在某些情況下,我們可能不知道圖像的尺寸。在這種情況下,可以通過(guò)避免手動(dòng)計(jì)算來(lái)使用此類(lèi)應(yīng)用程序來(lái)實(shí)現(xiàn)此目的的自動(dòng)化。我們定義了一個(gè)名為resizewithAspectRatio的函數(shù)。我們?yōu)榇撕瘮?shù)設(shè)置了4個(gè)參數(shù)。這些是:為其保留圖像的變量的名稱寬度高度并具有避免在調(diào)整大小時(shí)插值的功能讓我們繼續(xù)執(zhí)行要應(yīng)用的步驟。首先,我們定義一個(gè)維變量,其預(yù)定義為空。然后,將原始尺寸中圖像的前兩個(gè)尺寸分別作為高度和寬度的h和w保存到一個(gè)元組中。如果未指定寬度和高度,則我們希望圖像返回其原始狀態(tài)。如果未指定寬度,我們希望執(zhí)行以下操作。r = height / float(h)
dimension = (int(w*r),height)

讓我告訴你這是什么意思。我們計(jì)算原始圖像中給定的高度與尺寸的比率。然后,我們將該比例乘以原始寬度,然后得出新尺寸。因此,在視覺(jué)上沒(méi)有尺寸的變形。否則,如果沒(méi)有給出高度,我們將再次應(yīng)用類(lèi)似的程序。結(jié)果,我們希望根據(jù)使用以下代碼編寫(xiě)的函數(shù)輸出調(diào)整大小后的視覺(jué)效果。return cv2.resize(img, dimension, interpolation= inter)
然后,根據(jù)編寫(xiě)的函數(shù)讀取原始圖像和調(diào)整大小后的圖像。img = cv2.imread("klon.jpg")
img1 = resizewithAspectRatio(img,
                            width = None,
                            height = 600,
                            inter = cv2.INTER_AREA)

最后,我們通過(guò)編寫(xiě)一些我們知道的代碼來(lái)完成應(yīng)用程序。cv2.imshow("Original",img)
cv2.imshow("Resized",img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
你可以在下面找到所有代碼。import cv2
def resizewithAspectRatio(  img
                         , width = None
                         , height = None
                         , inter = cv2.INTER_AREA):              
   dimension: None
   (h,w) =  img.shape[:2]
   if width is None and height is None:
       return img
   if width is None:
       r = height / float(h)
       dimension = (int(w*r),height)
   else:
       r = width / float(w)
       dimension = (width, int(h*r))
   return cv2.resize(img, dimension, interpolation= inter)
img = cv2.imread("klon.jpg")
img1 = resizewithAspectRatio(  img
                            , width = None
                            , height = 600
                            , inter = cv2.INTER_AREA)
cv2.imshow("Original",img)
cv2.imshow("Resized",img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

聲明: 本文由入駐維科號(hào)的作者撰寫(xiě),觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

    人工智能 獵頭職位 更多
    掃碼關(guān)注公眾號(hào)
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯(cuò)
    x
    *文字標(biāo)題:
    *糾錯(cuò)內(nèi)容:
    聯(lián)系郵箱:
    *驗(yàn) 證 碼:

    粵公網(wǎng)安備 44030502002758號(hào)