Тип указателя приведения - PullRequest
0 голосов
/ 28 апреля 2019

Я вижу кусок кода OpenCV:

float *huedata = (float *)hue.data;

где hue создается Mat hue(Size(640,480),CV_32FC1)

hue.data возвращает указатель uchar*, но я не вижу, почему вместо (float) ставится *1011* перед hue.data, а также почему нужно приводить к float, а не использовать uchar ?. Кто-нибудь может помочь объяснить это?

1 Ответ

1 голос
/ 28 апреля 2019

Указатель на число с плавающей точкой - это значение совершенно другого типа , чем само число с плавающей точкой.Это может быть трудно понять, если вы не привыкли к указателям, поэтому позвольте мне объяснить.

hue.data (в качестве указателя) содержит число, которое является индексом места в памяти.Скажем, например, что hue.data содержит число 187 .Это означает, что он представляет 187-й байт памяти .Теперь предположим, что значением, хранящимся в этой ячейке памяти, является значение 3,14 .Что вы на самом деле волнуете это значение 3,14 .

Вот что вы предложили:

float huedata = (float)hue.data;

После этой строки у вас будетпеременная huedata, которая хранит число 187 , так как это то, что было скопировано из hue.data.Значение 3.14 полностью игнорируется.

Вот что изначально было написано:

float *huedata = (float *)hue.data;

После этой строки у вас будет переменная huedata, в которой хранится число 187 , но является указателем, что означает, что он указывает на область памяти, где вы можете найти значение 3.14 .Таким образом, у вас все еще есть доступ к значению 3.14 , которое вас действительно волнует.

Что касается приведения из (uchar *) к (float *).Поскольку указатели - это просто числа, представляющие ячейки памяти, приведение от одного типа указателя к другому просто означает, что значение по этому адресу в памяти является плавающим, а не uchar.Вероятно, это сделано потому, что hue.data может представлять различные типы значений в разных обстоятельствах, поэтому они напечатали его как uchar, ожидая, что пользователь будет перепечатывать его в зависимости от обстоятельств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...