2016-05-07 4 views
2

У меня есть пороговой изображения:Определение пороговой зоны (ы)

Я хочу знать, могу ли я обнаружить «белые зоны» и нарисовать прямоугольник вокруг них (за исключением данных, также хотел)
Или может Я рисую параллелепипед (многоугольник) и «скажем» внутри области белый?
Спасибо.

ответ

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#) без приближения:

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