Рассчитать площадь объекта внутри ROI в OpenCV

Я хочу вычислить площадь обнаруженного объекта (тот синий маркер, который я использовал) внутри фактического 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 );

1

Решение

Вы можете использовать cv::countNonZero функция для подсчета ненулевых пикселей внутри ROI в imgThresholded образ. Это именно то, что вам нужно.

cv::Rect leftROI(cv::Point(20, 100), cv::Point(170, 250));
int leftArea = cv::countNonZero(imgThresholded(leftROI));
3

Другие решения

Для конкретной области интереса на двоичном изображении просмотрите значения в пикселях и сосчитайте белые (255). Если у вас больше ROI, и вы хотите избежать тех, которые не содержат белых пикселей, просто пропустите те, которые не содержат белых пикселей …

0

Технически, вы нашли «самый большой контур», основанный на некоторой цветовой фильтрации, нарисовали вокруг него прямоугольник и теперь пытаетесь получить его площадь. Чтобы получить свою площадь, 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;
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector