我看到了一段OpenCV代码:
float *huedata = (float *)hue.data;
其中hue
由Mat hue(Size(640,480),CV_32FC1)
创建
hue.data
返回一个指针uchar*
,但我不明白为什么将(float *)
而不是(float)
放在hue.data前面,以及为什么需要强制转换到float
而不是继续使用uchar
?。有人可以帮忙解释一下吗?
答案 0 :(得分:1)
指向浮点数的指针是对浮点数本身的完全不同的值类型。如果您不习惯使用指针,可能很难把握,所以让我解释一下。
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 < / strong>。因此,您仍然可以访问真正关心的值 3.14 。
关于从(uchar *)到(float *)的转换。由于指针只是代表内存位置的数字,因此从一种指针类型转换为另一种指针类型仅意味着将该内存地址处的值视为浮点数而不是uchar。之所以可能这样做是因为hue.data在不同情况下可以表示不同种类的值,因此他们将其键入为uchar,希望用户根据情况重新键入。