#opencv #distance #transformation
#opencv #расстояние #преобразование
Вопрос:
Я не могу успешно рассчитать преобразование расстояния с помощью OpenCV (2.3) на ubuntu. На выходе получается либо черный, либо копия исходного изображения, но никогда, как ожидалось, изображение в оттенках серого с градиентами.
Мой код:
Mat input(Size(100,100), CV_8UC1);
circle(input, Point(50,50), 10 Scalar(255,255,255), 15, 0, 0));
Mat output(Size(100,100), CV_32FC1);
distanceTransformation(input, output, CV_DIST_L2, CV_DIST_MASK_3); //Output is completely black
//distanceTransformation(input, output, CV_DIST_L2, CV_DIST_MASK_PRECISE); //Output is a "copy" of input
imshow("in", input);
imshow("out", output);
Есть предложения?
Ответ №1:
Первый вызов правильный, но, будучи расстоянием, он не сохраняется как uchar . Когда вы хотите его отобразить, OpenCV преобразует эти значения с плавающей точкой (я думаю) в uchars. И результат кажется черным.
Найдите максимальное значение в выходных данных, а затем масштабируйте его, чтобы оно соответствовало изображению в оттенках серого
double maxVal = findMaxDistanceSomehow();
output.convertTo( displayBuffer, CV_8UC1, 255./maxVal,0);
imshow("dist", displayBuffer);
Редактировать
Первая идея была правильной, но вы на самом деле не пытались найти maxVal! Вы сказали это, посмотрев на картинку, вместо того, чтобы фактически извлечь ее. Разница между победой и неудачей.
Итак, вычислите преобразование dist, используя точный алгоритм, а затем
output.convertTo( displayBuffer, CV_8UC1, 10 ,0);
Редактировать 2
И вы должны поместить туда параметр (0).
Комментарии:
1. странно… ваше входное изображение черное с белым кругом? почему бы не установить его равным нулю перед закрашиванием круга? input.setTo(0);
2. Да, мое входное изображение черное с белым кругом (очень маленькая черная дыра в центре). setTo(0) ничего не меняет (к сожалению)…
3. Параметры, отличные от CV_DIST_MASK_PRECISE, возвращают только черные результаты. ТОЧНОЕ масштабирование работает! Спасибо!