OpenCV: как я могу интерпретировать результаты inRange?

Я обрабатываю видеоизображения и хотел бы определить, содержит ли видео какие-либо пиксели определенного диапазона красного цвета. Это возможно?

Вот код, который я адаптирую из учебника:

#ifdef __cplusplus
- (void)processImage:(Mat&)image;
{
cv::Mat orig_image = image.clone();
cv::medianBlur(image, image, 3);
cv::Mat hsv_image;
cv::cvtColor(image, hsv_image, cv::COLOR_BGR2HSV);
cv::Mat lower_red_hue_range;
cv::Mat upper_red_hue_range;
cv::inRange(hsv_image, cv::Scalar(0, 100, 100), cv::Scalar(10, 255, 255), lower_red_hue_range);
cv::inRange(hsv_image, cv::Scalar(160, 100, 100), cv::Scalar(179, 255, 255), upper_red_hue_range);
// Interpret values here
}

Интерпретация ценностей

Я хотел бы определить, являются ли результаты операций inRange нулевыми или нет. Другими словами, я хочу понять, есть ли в исходном изображении совпадающие пиксели с цветом inRange из заданной нижней и верхней красной шкалы. Как я могу интерпретировать результаты?

0

Решение

Сначала вам нужно ИЛИ нижнюю и верхнюю маску:

Mat mask = lower_red_hue_range | upper_red_hue_range;

Тогда ты можешь countNonZero чтобы увидеть, есть ли ненулевые пиксели (т.е. вы что-то нашли).

int number_of_non_zero_pixels = countNonZero(mask);

Может быть лучше сначала применить морфологическую эрозию или открытие, чтобы удалить маленькие (вероятно, шумные) пятна:

Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
morphologyEx(mask, mask, MORPH_OPEN, kernel); // or MORPH_ERODE

или найти подключенные компоненты (findContours, connectedComponentsWithStats) и обрезать / искать по некоторым критериям:

vector<vector<Point>> contours
findContours(mask.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

double threshold_on_area = 100.0;
for(int i=0; i<contours.size(); ++i)
{
double area = countourArea(contours[i]);
if(area < threshold_on_area)
{
// don't consider this contour
continue;
}
else
{
// do something (e.g. drawing a bounding box around the contour)
Rect box = boundingRect(contours[i]);
rectangle(hsv_image, box, Scalar(0, 255, 255));
}
}
0

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

Других решений пока нет …

По вопросам рекламы [email protected]