у меня есть Mat Dist
(CV_8U
) сделано distanceTransform
,
Теперь я должен проверить каждую координату Dist
является > 0
и изменить значение другого Mat M = Mat :: zeros
код
int main(){
....
for(i=0;i<Dist.rows;++i)
{
for(j=0;j<Dist.cols;++j)
{
if(Dist.at<uchar>(i,j) > 0){
M.at<uchar>(i,j)=2;
}
}
}
....
}
но у меня ошибка cv :: исключение.
Я посмотрел в документации и в других местах, я пытался перейти с uchar на vec3b. Я изменил исключение в визуальной студии 2015, но ничего.
Где я не прав?
Функция distanceTransform
не возвращает объявление CV_8U, это CV_32, как мы видим в документация:
dst — вывод изображения с рассчитанными расстояниями. Это 32-битный
одноканальное изображение с плавающей точкой того же размера, что и src.
Так что код должен читать не учар, а плавать
...
if(Dist.at<float>(i,j) > 0.f)
...
Если вы использовали метки от преобразования расстояния, в документации мы имеем следующее:
Ярлыки — Опциональный вывод 2D массива этикеток (дискретный Вороной
диаграмма). Он имеет тип CV_32SC1 и тот же размер, что и src. Увидеть
подробности ниже.
Таким образом, в этом случае вы должны получить к нему доступ
...
if(Dist.at<int>(i,j) > 0)
...
Я надеюсь, это поможет вам.
Кстати, возможно, значение эпсилона вместо 0 будет лучше ….
Других решений пока нет …