2016-05-07 64 views
2

我有閾值的圖像:檢測閾值區域(S)

我想知道,我可以檢測到「白色區域」並繪製矩形周圍(保存數據還希望)
還是可以的我畫了平行六面體(多邊形),裏面的「說」區域是白色的?
謝謝。

回答

2

因此,爲了檢測白色區域,只需獲取圖像的輪廓。這是可以做到的:

vector<vector<Point>>contours; 
vector<Vec4i> hierarchy; 
findContours(blackWhiteImage, 
    contours, 
    hierarchy, 
    CV_RETR_TREE, 
    CV_CHAIN_APPROX_SIMPLE, 
    Point(0,0)); 

然後,您可以生成與該車型的整個輪廓,你提取近似邊框:一旦做到這一點

vector<vector<Point> > contours_poly(contours.size()); 
vector<Rect> boundRect(contours.size()); 
for(int i = 0; i < contours.size(); i++){ 
    approxPolyDP(Mat(contours[i]), 
     contours_poly[i], 
     3, 
     true); 
     //3 is epsilon tuning param for bias-variance trade off 
     //true denotes contours are closed 

    boundRect[i] = boundingRect(Mat(contours_poly[i])); 
} 

,您可以訪問boundingRect對象的boundingRect數組就像你會訪問任何其他數組。

爲EmguCV(C#)不近似

Simular代碼:

VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint(); 
Mat hierarchy; 

CvInvoke.FindContours(binMat, contours, hierarchy, RetrType.External, ChainApproxMethod.ChainApproxSimple); 

for (int i = 0; i < contours.Size; ++i) 
{ 
    if (CvInvoke.ContourArea(contours[i]) > 8) 
    { 
     Rectangle rc = CvInvoke.BoundingRectangle(contours[i]); 
     CvInvoke.Rectangle(srcMat, rc, new MCvScalar(0, 0, 255)); 
    } 
} 
+0

什麼是contours_poly? Mat(...) – ionmike

+0

Mat(...)構造一個cv :: Mat的實例,以便我們可以將正確類型的參數傳遞給boundingRect構造函數。 另外,我原本不包括contours_poly的初始化。它只是一個變量,它包含您從approxPolyDP獲得的近似多邊形,以便我們可以使用它們構造矩陣以傳遞給boundingRect構造函數 – bstadt

+0

好的。我用你的例子在C#中做了一些代碼。我想我會接受你的答案。 – ionmike