Мне нужно выяснить, является ли какой-либо данный пиксель черным или белым на изображении в градациях серого, которое я перед этим использовал с помощью алгоритма порога. Изображение становится в основном каплями черного цвета на белом фоне.
Mat falsetest;
...
cv::cvtColor(detected_edges, falsetest, CV_BGR2GRAY);
threshold(falsetest, falsetest,128, 255,THRESH_BINARY);
...
printf("x:%d y:%d %d\n",x,y,falsetest.at<uchar>(x,y));
Я ожидал, что результаты будут либо 0, либо 255, однако это не так. Вывод для разных пикселей выглядит примерно так:
x:1259 y:175 111
x:1243 y:189 184
x:1229 y:969 203
x:293 y:619 255
x:1123 y:339 183
Я пытаюсь сделать это неправильно, или кажется, что ошибка лежит в другом месте?
Вы уверены, что falsetest
содержит пиксели uchar, а не плавает? В таком случае вам необходимо получить доступ к значениям falsetest
от:
falsetest.at<float>(x,y)
CV код выглядит хорошо. Тем не менее, вы используете% d в printf для отображения uchar.
Либо используйте% hhd, либо делайте
static_cast<int>(falsetest.at<uchar>(x,y)).
Я наконец понял, в чем проблема. Я думал, что когда я позвонил
cv::cvtColor(detected_edges, falsetest, CV_BGR2GRAY);
все данные матрицы были скопированы в falsetest. Однако, похоже, что это был не тот случай, и когда я приступил к изменению connected_edges, falsetest также стал зараженным. Клонирование матрицы решило проблему.