基於輪廓填充連通區內部空洞

2021-07-02 22:32:36 字數 2812 閱讀 9320

使用cvfindcontours函式與cvfillpoly填充連通區內部空洞

最近在做火焰識別專案時使用了一種火焰顏色模型分割疑似火焰區域,由於火焰內部溫度高、焰色偏白而被該模型捨棄,造成火焰連通區域內部有空洞,影響進一步的火焰判斷。通過查詢資料學習,我使用cvfindcontours()函式與cvfillpoly()函式填充連通區內部空洞,取得了良好的效果,特寫此片博文總結、分享我的經驗。

在二值影象中尋找輪廓

【引數介紹】

image 

輸入的 8-位元、單通道影象. 非零元素被當成 1, 0 象素值保留為 0 - 從而影象被看成二值的。為了從灰度影象中得到這樣的二值影象,可以使用 cvthreshold,cvadaptivethreshold 或 cvcanny。本函式改變輸入影象內容。

storage 

得到的輪廓的儲存容器 

first_contour 

輸出引數:包含第乙個輸出輪廓的指標 

header_size 

如果 method=cv_chain_code,則序列頭的大小 >=sizeof(cvchain),否則》=sizeof(cvcontour) 。

mode 

提取模式. 

cv_retr_external - 只提取最外層的輪廓 

cv_retr_list - 提取所有輪廓,並且放置在 list 中 

cv_retr_ccomp - 提取所有輪廓,並且將其組織為兩層的 hierarchy: 頂層為連通域的外圍邊界,次層為洞的內層邊界。 

cv_retr_tree - 提取所有輪廓,並且重構巢狀輪廓的全部 hierarchy 

method 

offset 

每乙個輪廓點的偏移量. 當輪廓是從影象 roi 中提取出來的時候,使用偏移量有用,因為可以從整個影象上下文來對輪廓做分析。 

函式cvfindcontours從二值影象中提取輪廓,並且返回提取輪廓的數目。指標 first_contour 的內容由函式填寫。它包含第乙個最外層輪廓的指標,如果指標為null,則沒有檢測到輪廓(比如影象是全黑的)。其它輪廓可以從 first_contour 利用 h_next 和 v_next 鏈結訪問到。使用cvdrawcontours 可以畫出輪廓,輪廓也可以用來做形狀分析和物件識別。

填充多邊形內部 

void cvfillpoly( cvarr* img, cvpoint** pts, int* npts, int contours,

cvscalar color, int line_type=8, intshift=0 );

【引數介紹】

img 

影象。 

pts 

指向多邊形的陣列指標。 

npts 

多邊形的頂點個數的陣列。 

contours 

組成填充區域的線段的數量。 

color 

多邊形的顏色。 

line_type 

組成多邊形的線條的型別。 

shift 

頂點座標的小數點位數。 

函式cvfillpoly用於乙個單獨被多邊形輪廓所限定的區域內進行填充。函式可以填充複雜的區域,例如,有漏洞的區域和有交叉點的區域等等。

//根據分割結果確定輪廓並填充

void fillseg(iplimage *src,iplimage *tempdst)

// cvscalar color = cv_rgb( 255, 255, 255 );

cvpoint *point = new cvpoint[contour->total];

cvpoint *point;

//printf("影象分割contour->total\t%d\n",contour->total);

for (int i = 0;itotal;i++)

int pts[1] = ;

cvfillpoly(tempdst,&point,pts,1,cv_rgb(255,255,255));//填充多邊形內部

} cvreleasememstorage(&storage);

}

#include#include#include #define min(x,y) (xheight;

int cols = src->width;

for(int i = 0;i < rows;i++)

else if(datas[step+2] <= datas[step+1] || datas[step+1] <= datas[step] )

else if(s <= (float)(s_threshhold*(255 - datas [step+2]))/r_threshhold)

else

} }}//根據分割結果確定輪廓並填充

void fillseg(iplimage *src,iplimage *tempdst)

// cvscalar color = cv_rgb( 255, 255, 255 );

cvpoint *point = new cvpoint[contour->total];

cvpoint *point;

//printf("影象分割contour->total\t%d\n",contour->total);

for (int i = 0;itotal;i++)

int pts[1] = ;

cvfillpoly(tempdst,&point,pts,1,cv_rgb(255,255,255));//填充多邊形內部

} cvreleasememstorage(&storage);

}int main()

八連通填充演算法

最近做了個圈地的遊戲,根據玩家行走路徑和自己的領地區域圈出自己的新領地。自己在演算法這方面比較薄弱,這次也趁機修煉了一波,寫下自己的心得和感悟在這裡。可能寫的不好,希望看到的僅供參考,不足之處和錯誤之處多謝指正。八連通演算法其實就是給定乙個種子點,通過迴圈查詢以自己為中心的3 3其他八個點,滿足要求...

目標跟蹤方法 基於輪廓跟蹤

一 理論 該方法的基本思想是使用一組封閉的輪廓曲線來表徵目標,將曲線作為模板,在相鄰幀的邊緣影象中匹配並跟蹤該模板。該方法與基於區域的跟蹤方法相類似,都存在目標模板匹配和目標模板更新兩個環節,但是該方法是在二值化影象中匹配目標的輪廓模板,大大減小了計算量,提高了匹配的速度。主動輪廓模型方法是近些年來...

基於Python OpenCV的單目標輪廓匹配

python opencv 實現單目標餐盤輪廓識別 import cv2 import numpy as np def template template temp cv2.imread template,0 temp gray cv2.cvtcolor temp,cv2.color bgr2gra...