Я хочу вычислить площадь обнаруженного объекта (тот синий маркер, который я использовал) внутри фактического ROI. Я имею в виду один из тех двух прямоугольников, которые являются моим изображением областей интереса в пороге (черно-белое изображение).
Как рассчитать площадь объекта (Думаю — сумма «распознанных» кластеров пикселей белого цвета) внутри ROI?
Я просто хочу рассмотреть только те пиксели, которые находятся внутри конкретного ROI (в приведенном ниже примере — левый). Таким образом, все пиксели за пределами левой области интереса не будут приниматься во внимание.
РИ создаются следующим образом:
rectangle( imgOriginal, Point( 20, 100 ), Point( 170, 250), Scalar( 0, 0, 255 ), +5, 4 );
rectangle( imgThresholded, Point( 20, 100 ), Point( 170, 250), Scalar( 255, 255, 255 ), +5, 4 );
rectangle( imgOriginal, Point( 450, 100 ), Point( 600, 250), Scalar( 0, 0, 255 ), +5, 4 );
rectangle( imgThresholded, Point( 450, 100 ), Point( 600, 250), Scalar( 255, 255, 255 ), +5, 4 );
Вы можете использовать cv::countNonZero
функция для подсчета ненулевых пикселей внутри ROI в imgThresholded
образ. Это именно то, что вам нужно.
cv::Rect leftROI(cv::Point(20, 100), cv::Point(170, 250));
int leftArea = cv::countNonZero(imgThresholded(leftROI));
Для конкретной области интереса на двоичном изображении просмотрите значения в пикселях и сосчитайте белые (255). Если у вас больше ROI, и вы хотите избежать тех, которые не содержат белых пикселей, просто пропустите те, которые не содержат белых пикселей …
Технически, вы нашли «самый большой контур», основанный на некоторой цветовой фильтрации, нарисовали вокруг него прямоугольник и теперь пытаетесь получить его площадь. Чтобы получить свою площадь, OpenCv предоставил вам функцию (как он обнаружил, что она самая большая?), Так что вот функция: double cv::contourArea(InputArray contour)
Вот является главной страницей, потому что я думаю, что вы можете отправить контур как есть, но я не уверен, но проверьте этот базовый пример и:
vector<Point> contour;
contour.push_back(Point2f(0, 0)); // push whatever points you want
contour.push_back(Point2f(10, 0));
contour.push_back(Point2f(10, 10));
contour.push_back(Point2f(5, 4));
double area0 = contourArea(contour); // retrieve the area
vector<Point> approx;
approxPolyDP(contour, approx, 5, true);
double area1 = contourArea(approx);
cout << "area0 =" << area0 << endl <<
"area1 =" << area1 << endl <<
"approx poly vertices" << approx.size() << endl;