Спасибо за ответ! Помогло. Ниже примерный код, если кому пригодится.
Библиотека действительно удобна и довольно продумана. Вот только столкнулся с одной неожиданностью - после cvFloodFill граничная рамка матрицы с маской закрашивается цветом 1. Чтобы найти края выделяемого объекта, приходится сначала закрашивать ее обратно черным 0.
// Возвращает указатель на матрицу, содержащую бинарное изображение только выделенной фигуры
CvMat* floodMask(int x, int y, CvMat* image) {
// Создаем матрицу маски. Ее размер на 2 больше, чем у исходного изображения. Закрашиваем 0.
CvMat* mask = cvCreateMat(image->height + 2, image->width + 2, CV_8UC1);
cvSet(mask, cvScalar(0));
// Флаги заливки - манипулируйте по необходимоcти
int flags = 8 | CV_FLOODFILL_MASK_ONLY | CV_FLOODFILL_FIXED_RANGE | (255 << 8);
// Выделяем фигуру в матрице с маской
cvFloodFill(image, cvPoint(x,y), cvScalarAll(1), cvScalarAll(1), cvScalarAll(1), NULL, flags, mask);
cvRectangle(mask, cvPoint(0,0), cvPoint(mask->width - 1, mask->height -1), cvScalar(0));
// Вычисляем построчно/постолбно сумму всех пикселов в строке. Если не равна 0 - значит, в строке/столбце есть выделенная фигура
CvMat* yys = cvCreateMat(mask->height, 1, CV_32SC1);
CvMat* xxs = cvCreateMat(1, mask->width, CV_32SC1);
cvReduce(mask, yys, 1, CV_REDUCE_SUM);
cvReduce(mask, xxs, 0, CV_REDUCE_SUM);
// Теперь ищем габариты выделенной фигуры
int* ptr = yys->data.i;
int y1 = 0;
for (; (*ptr) == 0; ptr++)
y1++;
int height = 0;
for (; (*ptr) != 0; ptr++)
height++;
ptr = xxs->data.i;
int x1 = 0;
for (; (*ptr) == 0; ptr++)
x1++;
int width = 0;
for (; (*ptr) != 0; ptr++)
width++;
// Сохраняем и возвращаем фигуру
CvMat* out = cvCreateMat(width, height, CV_8UC1);
cvGetSubRect(mask, out, cvRect(x1, y1, width, height));
return out;
}