Так, чтобы обнаружить белые зоны, просто получите контуры изображения. Это может быть сделано с:
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));
}
}
Что такое contours_poly? То же самое для Mat (...) – ionmike
Mat (...) создает экземпляр cv :: Mat, чтобы мы могли передать правильно типизированный параметр в конструктор boundingRect. Кроме того, мое плохое для того, чтобы не включать инициализацию contours_poly изначально. Это просто переменная, содержащая приблизительные полигоны, которые вы получаете от approxPolyDP, чтобы мы могли использовать их для построения матриц для перехода к конструктору boundingRect. – bstadt
Хорошо. Я сделал код в C#, используя ваши примеры. Думаю, я отвечу на ваш ответ. – ionmike