1圖像矩
成都創(chuàng)新互聯(lián)公司提供網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計,成都品牌網(wǎng)站建設(shè),廣告投放等致力于企業(yè)網(wǎng)站建設(shè)與公司網(wǎng)站制作,10年的網(wǎng)站開發(fā)和建站經(jīng)驗,助力企業(yè)信息化建設(shè),成功案例突破上千余家,是您實現(xiàn)網(wǎng)站建設(shè)的好選擇.
幫你計算一些屬性,比如重心,面積等。
函數(shù)cv2.moments()會給你一個字典,包含所有矩值
你可以從這個里面得到有用的數(shù)據(jù)比如面積,重心等。重心可以用下面的式子得到:
2.輪廓面積
輪廓面積由函數(shù)cv2.contourArea()得到或者從矩里得到M['m00']
3.輪廓周長
可以用cv2.arcLength()函數(shù)得到。第二個參數(shù)指定形狀是否是閉合的輪廓(如果傳True)?;蛘咧皇且粋€曲線。
4.輪廓近似
這會把輪廓形狀近似成別的邊數(shù)少的形狀,邊數(shù)由我們指定的精確度決定。這是Douglas-Peucker算法的實現(xiàn)。
要理解這個,假設(shè)你試圖找一個圖像里的方塊,但是由于圖像里的一些問題,你得不到一個完美的方塊,只能得到一個“壞方塊”?,F(xiàn)在你可以使用這個函數(shù)來近似,第二個參數(shù)叫epsilon,是從輪廓到近似輪廓的最大距離。是一個準確率參數(shù),好的epsilon的選擇可以得到正確的輸出。
在下面第二個圖像里,綠線顯示了epsilon = 10% of arc length 的近似曲線。第三個圖像顯示了epsilon = 1% of the arc length。第三個參數(shù)指定曲線是否閉合。
5.凸形外殼
凸形外殼和輪廓近似類似,但是還不一樣(某些情況下兩個甚至提供了同樣的結(jié)果)。這兒,cv2.convexHull()函數(shù)檢查凸面曲線缺陷并修復(fù)它。一般來說,凸面曲線總是外凸的,至少是平的,如果它內(nèi)凹了,這就叫凸面缺陷。比如下面這張圖,紅線顯示了手的凸形外殼。雙向箭頭顯示了凸面缺陷,是輪廓外殼的最大偏差。
參數(shù)詳情:
·points 是我們傳入的輪廓
·hull 是輸出,一般我們不用傳
·clockwise: 方向標示,如果是True,輸出凸形外殼是順時針方向的。否則,是逆時針的。
·returnPoints:默認是True。然后會返回外殼的點的坐標。如果為False,它會返回輪廓對應(yīng)外殼點的索引。
所以要獲得凸形外殼,下面
但是如果你想找到凸面缺陷,你需要傳入returnPoints = False。我們拿上面的矩形圖形來說,首先我找到他的輪廓cnt,現(xiàn)在用returnPoints = True來找他的凸形外殼,我得到下面的值:[[[234 202]], [[51 202]], [51 79]], [[234 79]]] ?是四個角的點。如果你用returnPoints = False,我會得到下面的結(jié)果:[[129], [67], [0], [142]]. ?這是輪廓里對應(yīng)點的索引,比如cnt[129] = [234, 202]],這和前面結(jié)果一樣。
6.檢查凸面
有一個函數(shù)用來檢查是否曲線是凸面, cv2.isContourConvex().它返回True或False。
7.邊界矩形
有兩種邊界矩形
7.a.正邊界矩形
這個矩形不考慮對象的旋轉(zhuǎn),所以邊界矩形的面積不是最小的,函數(shù)是cv2.boundingRect()。
假設(shè)矩形左上角的坐標是(x,y), (w, h)是它的寬和高
7.b.渲染矩形
這個邊界矩形是用最小面積畫出來的,所以要考慮旋轉(zhuǎn)。函數(shù)是cv2.minAreaRect()。它返回一個Box2D結(jié)構(gòu),包含了(左上角(x,y),(width, height),旋轉(zhuǎn)角度)。但是要畫這個矩形我們需要4個角。這四個角用函數(shù)cv2.boxPoints()得到
8.最小閉包圓
我們找一個目標的外接圓可以用函數(shù)cv2.minEnclosingCircle().這個圓用最小面積完全包圍目標。
9.橢圓
用一個橢圓來匹配目標。它返回一個旋轉(zhuǎn)了的矩形的內(nèi)接橢圓
10. 直線
類似的我們可以匹配一根直線,下面的圖像包含一系列的白色點,我們可以給它一條近似的直線。
END
在本教程中,我們將學(xué)習(xí)如何基于 Opencv 和 Python 實現(xiàn)對象跟蹤。
首先必須明確目標檢測和目標跟蹤有什么區(qū)別:
我們將首先討論對象檢測,然后討論如何將對象跟蹤應(yīng)用于檢測。
可能有不同的應(yīng)用,例如,計算某個區(qū)域有多少人,檢查傳送帶上有多少物體通過,或者計算高速公路上的車輛。
當然,看過本教程后,您會很容易地想到數(shù)以千計的想法應(yīng)用于現(xiàn)實生活或可能應(yīng)用于工業(yè)。
在本教程中,我們將使用 3 個文件:
首先我們需要調(diào)用highway.mp4文件并創(chuàng)建一個mask:
正如您在示例代碼中看到的,我們還使用了 createBackgroundSubtractorMOG2 函數(shù),該函數(shù)返回背景比率(background ratio),然后創(chuàng)建mask。
mask可視化結(jié)果:
但是,如您所見,圖像中有很多噪點。因此,讓我們通過刪除所有較小的元素來改進提取,并將我們的注意力集中在大于某個面積的對象上。
使用 OpenCV 的cv2.drawContours函數(shù)繪制輪廓,我們得到了這個結(jié)果。
就本教程而言,分析整個窗口并不重要。我們只對計算在某個點通過的所有車輛感興趣,因此,我們必須定義一個感興趣的區(qū)域 ROI 并僅在該區(qū)域應(yīng)用mask。
結(jié)果可視化如下:
函數(shù) cv2.createBackgroundSubtractorMOG2 是在開始時添加的,沒有定義參數(shù),現(xiàn)在讓我們看看如何進一步改進我們的結(jié)果。history是第一個參數(shù),在這種情況下,它設(shè)置為 100,因為相機是固定的。varThreshold改為 40,因為該值越低,誤報的可能性就越大。在這種情況下,我們只對較大的對象感興趣。
在繼續(xù)處理矩形之前,我們對圖像進行了進一步的清理。為此,閾值函數(shù)就派上用場了。從我們的mask開始,我們告訴它我們只想顯示白色或黑色值,因此通過編寫254, 255,只會考慮 254 和 255 之間的值。
然后我們將找到的對象的坐標插入到 if 條件中并繪制矩形
這是最終結(jié)果:
我們現(xiàn)在只需導(dǎo)入和集成跟蹤功能。
一旦創(chuàng)建了對象,我們必須獲取邊界框的每個位置并將它們插入到單個數(shù)組中。
通過在屏幕上顯示結(jié)果,您可以看到所有通過 ROI 的通道是如何被識別的,以及它們的位置是如何插入到特定的數(shù)組中的。顯然,識別的摩托車越多,我們的數(shù)組就越大。
現(xiàn)在讓我們將帶有位置的數(shù)組傳遞給tracker.update()。我們將再次獲得一個包含位置的數(shù)組,但此外,將為每個對象分配一個唯一的 ID。
從代碼中可以看出,我們可以使用 for 循環(huán)分析所有內(nèi)容。此時我們只需要繪制矩形并顯示車輛 ID。
在圖像中,您可以看到結(jié)果
main.py
從視頻中也可以看到,我們已經(jīng)獲得了我們在本教程開始時設(shè)置的結(jié)果。
但是,您必須將其視為練習(xí)或起點,因為關(guān)于這個主題有很多話要說,而本教程的目的只是讓您了解對象跟蹤的原理。
如果你想將 Object Tracking 集成到你的項目中,你應(yīng)該使用更可靠和先進的對象檢測方法,以及跟蹤方法。
完整代碼地址:私信“333”直接獲取或者「鏈接」
圖像的灰度處理:
CV_LOAD_IMAGE_GRAYSCALE,這是最簡單之間的辦法,在加載圖像時直接處理
IplImage*
Igray=
cvLoadImage
("test.jpg",CV_LOAD_IMAGE_GRAYSCALE);
得到的圖像就是單通道的,也能夠用這個函數(shù):CVAPI(void)
cvCvtColor
(
const
CvArr*
src,
CvArr*
dst,
int
code
);
code=CV_BGR2GRAY;
opencv還提供了非常多方式,我這邊就不一一舉例了。