C++ 在C+中写入4D向量时出现问题+;(没有可行的重载';=';)
我面临的问题是,通过openCV库,我正在阅读一系列图像,它们是自己的“Mat”格式:图像矩阵。 基本上,我需要将大于0的任何像素值作为“真”写入4D向量,将==0的任何像素值作为“假” 为什么是4维?C++ 在C+中写入4D向量时出现问题+;(没有可行的重载';=';),c++,vector,C++,Vector,我面临的问题是,通过openCV库,我正在阅读一系列图像,它们是自己的“Mat”格式:图像矩阵。 基本上,我需要将大于0的任何像素值作为“真”写入4D向量,将==0的任何像素值作为“假” 为什么是4维? vectorpointVector 3个矢量级别指的是X、Y、Z轴。布尔只是真/假。图像是Y乘Z的,并沿X轴以三维方式堆叠。 基本上,我们有一系列的图像来表示三维叠加的点。 (解释得不好?可能吧) 不管怎样,我的功能是读取一张照片中的点,然后将它们写入4D向量 注意:xVal是一个全局存储地址照
vectorpointVector代码>
3个矢量级别指的是X、Y、Z轴。布尔只是真/假。图像是Y乘Z的,并沿X轴以三维方式堆叠。
基本上,我们有一系列的图像来表示三维叠加的点。
(解释得不好?可能吧)
不管怎样,我的功能是读取一张照片中的点,然后将它们写入4D向量
注意:xVal是一个全局存储地址照片的ID号。它用于X维(图像层)
知道怎么回事吗?我浏览过网络,试图挖掘信息(是的,又是深层次的noob)让我头疼不已,因此任何建议都将受到欢迎。您只访问第一个向量(外部向量),而没有实际访问其中的任何向量
语法应该是pointVector[x][y][z]=true
,其中x
、y
和z
是要用于访问三个嵌套向量的值
你想要的是:
pointVector[xVal][x][y] = true
您使用的是一种访问3D阵列的方法,该阵列在内存中以1D阵列的形式排列,但在您的案例中,它不是您想要的
确保你没有越界
确保您正在访问的元素确实存在!如果显示的代码是实际代码,pointVector
在尝试使用时将没有元素
要解决这个问题,您必须调整所有向量(外部和内部)的大小。这可能会很麻烦,您可能希望使用1D方法,即分配一个大的一维bool
数组,并使用您使用的方法访问它(largeArray[xVal*image.cols*image.rows+x*image.cols+y]
)
一维方法
在以下代码中,numberOfValues
是您将访问的最大元素数
int lineTo3DVector (Mat image)
{
// Takes in matrix and converts to 4D vector.
// This will be exported and all vectors added together into a point cloud
std::vector<bool> pointVector;
pointVector.resize(numberOfValues);
for (int x=0; x < image.rows; x++)
{
for (int y = 0; y < image.cols; y++)
{
if(image.at<int>(x,y) > 0)
{
pointVector[xVal*image.cols*image.rows + x*image.cols + y] = true;
}
}
}
// Return whatever.
}
int-lineTo3DVector(Mat图像)
{
//接收矩阵并转换为4D矢量。
//这将被导出,并将所有矢量添加到一个点云中
std::向量点向量;
pointVector.resize(numberOfValues);
对于(int x=0;x0)
{
点向量[xVal*image.cols*image.rows+x*image.cols+y]=true;
}
}
}
//归还任何东西。
}
我想你要问的是为什么编译器告诉你它不能将bool
转换成向量。这是因为您试图将bool
分配给pointVector[某些索引]
,根据pointVector
的定义,它将是vector
。考虑用“<代码>向量点向量< /代码>替换定义,并对其进行索引,或者将其索引为代码> PooTovector [X] [Y] [Z] 。另外,您声明的是三维的,而不是四维的。当然,您需要调整所有向量的大小以更正它们的地址。现在有些人可能会说我是个暴躁的人,但我发现这些多向量结构绝对可怕。对于这类事情,我更愿意在任何时候使用Boost多维数组库,而不是std。谢谢Aroosi先生,我将不得不多读几遍,以确保我完全理解它。我假设它是4D,因为每个向量都是一个维度,布尔值在技术上是一个维度,不是吗?@RustyX std::vector通常专门使用每个bool 1位,至少在大多数实现中是这样的。有些吹毛求疵:“你只访问第一个向量(外部向量),而没有实际访问内部的任何向量。”事实上,pointVector[index]
确实访问了vector
,这是pointVector
的一个元素,而pointVector
是我所说的“外部的”@tobi303这可能是我这方面的一个错误选择(对不起,不是英语母语)。我所说的“访问向量X”是指“访问X以从中获取元素”。如果我知道更好的词,我会写我自己的答案:P。我有时发现将其写成pointVector->operator[](index)很有帮助
因为这样就更清楚调用了什么方法以及返回类型:pointVector->operator[]
必须返回向量。没关系,没有什么值得一票否决的;)问题,尽管。。。我认为方括号[]中的地址是我们写信的地址,包括所有级别。为什么需要3组方括号呢?我认为{X包含{Y包含{Z包含bool}}}地址都放在同一个括号中。如果这有意义的话,我最好画一张我的意思的图表。@acrimoniusmirth你有一个向量,它包含一个向量,它包含另一个向量。要访问向量的元素,可以使用语法vector[index]。因为外向量的元素是向量,所以点向量[index]是向量,所以可以将其与点向量[index][anotherIndex]一起索引。等等它不是地址,而是索引。向量是连续数组。
pointVector[xVal][x][y] = true
int lineTo3DVector (Mat image)
{
// Takes in matrix and converts to 4D vector.
// This will be exported and all vectors added together into a point cloud
std::vector<bool> pointVector;
pointVector.resize(numberOfValues);
for (int x=0; x < image.rows; x++)
{
for (int y = 0; y < image.cols; y++)
{
if(image.at<int>(x,y) > 0)
{
pointVector[xVal*image.cols*image.rows + x*image.cols + y] = true;
}
}
}
// Return whatever.
}