OpenCV判斷輪廓是內輪廓還是外輪廓

2021-10-04 20:12:51 字數 1462 閱讀 8225

使用opencv的findcontours函式查詢輪廓,當引數為cv_retr_list時,查詢到的輪廓不建立等級關係,也就是當前模式下不存在父輪廓或內嵌輪廓的位置關係,所以當圖中存在環形輪廓內外巢狀時(如下圖所示數字輪廓8),如果要判斷輪廓位置關係,需要自行判斷。判斷方法是可通過遍歷輪廓點,計算每個輪廓點的四鄰域點的灰度值來判斷,方法一呼叫opencv的pointpolygontest函式來判斷點是否在輪廓內部,方法二則是通過點的灰度值來判斷是否在輪廓內部,方法二相較於方法一執行速度更快。

方法一:

cv::mat src;//二值影象

std::vector> allcontours;//輪廓

std::vectorallhierarchy;//層次結構資訊

//查詢輪廓

int cnt = 0;

std::vectorcontourpts = allcontours [0];

for (int i = 0; i < contourpts.size(); i++)

} if (grayvalue2 == 0 && !isinnner)

} if (grayvalue3 == 0 && !isinnner)

}if (grayvalue4 == 0 && !isinnner)

} if (isinnner)

}if (cnt == contourpts.size())

else

方法二:

cv::mat src;//二值影象

std::vector> allcontours;//輪廓

std::vectorallhierarchy;//層次結構資訊

//查詢輪廓

cv::mat conimg = cv::mat::zeros(src.size(), cv_8uc1);

cv::drawcontours(conimg, allcontours, 0, cv::scalar(255), cv::filled);//輪廓畫到圖上,內部填充為白色

int cnt = 0;

std::vectorcontourpts = allcontours [0];

int allptsize = contourpts.size();

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

}if (grayvalue2 == 0 && !isinnner)

}if (grayvalue3 == 0 && !isinnner)

}if (grayvalue4 == 0 && !isinnner)

}if (isinnner)

}if (cnt == allptsize)

else

opencv尋找輪廓 繪製輪廓 輪廓層級原理

void findcontours inputoutputarray image,outputarrayofarrays contours,outputarray hierarchy,int mode,int method,point offset point 引數image inputarray型...

opencv 輪廓描述

上午主要學習了鏈碼的有關知識,鏈碼是一種表示方法,是用於表示有順序連線的具有指定長度了方向的直線段組成的邊界線,典型的情況下,這種表示方法基於4或8連線,經常選用更大間隔的網格對邊界進行重取樣,邊界的鏈碼取決於初始點,然而,此編碼可以通過簡單的過程實現初始點的歸一化,將鏈碼看成是方向編號的迴圈序列,...

opencv 輪廓應用

typedef struct cvseq cvseq define cv contour fields cv sequence fields cvrect rect int color int reserved 3 typedef struct cvcontour cvcontour 則 cvcon...