Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不同类型指针之间的赋值是有效的,我不知道为什么_C++_Pointers_Opencv - Fatal编程技术网

C++ 不同类型指针之间的赋值是有效的,我不知道为什么

C++ 不同类型指针之间的赋值是有效的,我不知道为什么,c++,pointers,opencv,C++,Pointers,Opencv,我是一名计算机视觉工程师,经常使用OpenCV库。我经常处理类型为无符号short的原始数据,并且必须将其分配给OpenCV的cv::Mat对象 此cv::Mat对象有一个名为data的字段,该字段的类型为unsigned char*,而不管数据的类型如何 因此,我将unsigned short*数据分配给unsigned char*Mat.data,如下所示: // Obtain raw data from the hardware const unsigned short* rawData

我是一名计算机视觉工程师,经常使用OpenCV库。我经常处理类型为
无符号short
的原始数据,并且必须将其分配给OpenCV的
cv::Mat
对象

cv::Mat
对象有一个名为data的字段,该字段的类型为
unsigned char*
,而不管数据的类型如何

因此,我将
unsigned short*
数据分配给
unsigned char*
Mat.data,如下所示:

// Obtain raw data from the hardware
const unsigned short* rawData = engine->getRawData();

// Create Mat with right dimensions and of type 16 Bit unsigned and 1 channel (unsigned short)
cv::Mat Test = cv::Mat::zeros(480, 640, CV_16UC1);

// Assign data by casting rawData to unsigned char* type
Test.data = (unsigned char*) rawData;

// Convert Test to 8Bit unsigned so I can visualize it
Test.convertTo(irIm, CV_8UC1);
我在很多情况下都使用这种方法,而且效果很好,但我从未真正理解它为什么有效。我有一个unsigned short类型的数据块,然后我将它强制转换为
unsigned char*
,程序不会崩溃,也不会丢失任何数据

有人能帮我理解这一点吗

编辑:

关于我得到的答案。 我知道这些数据仍然有效,但解释方式不同,但在我的头脑中仍然没有意义

假设我有以下短代码:001000010000。现在,我用一个计算器认识到这个短字符代表8456的十进制数。如果我把它解释为无符号字符,我将把它读为两个字节,然后我有00100001字节,然后是000011000字节,这绝不代表前面的短值


所以我的问题仍然存在。在我看来,唯一有意义的事情是OpenCV在某种程度上期待这些类型转换,并将在内部转换数据,以使其不会失去意义

人们通常将原始字节缓冲区定义为
无符号字符*
,因为
无符号字符
在语义上是一个字节。更好的可能是使用标准化的整数类型,例如
uint8\u t
,但两者都可以看到

从一种指针类型转换到另一种指针类型只会改变它指向的数据的解释。它不接触数据本身


类似的情况还有
void*
有时人们使用这种类型来传递未指定内容的缓冲区。但是,对于
void*
,您不能使用指针算术的标准语法,在内部,此类指针通常被转换为适当的类型(或被视为单独的字节)。

数据字段是指向矩阵数据的指针

(unsigned char*)
中应为该字符。您可以将不同类型的指针强制转换为
(unsigned char*)
。它们仍然指向存储
rawData
的相同内存地址

但重要的是,在创建矩阵时,指定数据类型为
CV_16UC1
。(一个元素为16位且无符号。请参阅)

因此,如果在您的计算机中
short
为2字节,则
(unsigned short*)
可以强制转换为
(unsigned char*)
,并且矩阵仍然有效。

C++的内存模型将计算机内存视为字节可寻址:

<>一个C++程序可用的内存由一个或多个相邻字节序列组成。每个字节都有一个唯一的地址

-C++标准,<强>内存> <强> /1

由于历史原因,C++没有使用<代码>字节>代码>类型来访问字节字节的内存字节,使用字符类型<代码> char < /> >代码>未签名CHAR< <代码>和<代码>符号char <代码>:

类型为
T
的对象的对象表示是由 类型为
T
的对象,其中
N
等于
sizeof(T)

--同上,[basic.types]/4


这意味着,如果您的系统有2字节
short
、1字节
unsigned char
,并且您有一个
short
数组,则通过将数据指针强制转换为
unsigned char*

来访问程序内存始终是合法的,将其强制转换为
unsigned char*
,将允许您分别访问短裤的每个字节。没有别的了。也就是说,你的
char
s比
shorts
多了两个,如果数据格式符合要求,会出什么问题呢?我从640*480个未签名的shorts数组开始。这个阵列显然需要640*480*sizeof(短)的内存空间。然后我将其转换为(unsigned char*)。此时,我有一个大小为640*480*sizeof(无符号字符)的数组。这个新阵列需要的内存空间减少了两倍,而且数据根本没有损坏?为什么?不不不;-)您投射了一个指针——数据不会被触摸或更改。“CV_16UC1”arg to
zeros()
似乎从opencv的角度指示了16位数据,这符合
getRawData()
返回的内容,如果系统上的一个短字符有16位。
此时我有一个大小为640*480*sizeof(无符号字符)
的数组,具有通常的变量大小:不,您将有两倍的字符,