【问题标题】:Armadillo wrong field indexing犰狳错误的字段索引
【发布时间】:2020-09-12 10:41:51
【问题描述】:

我需要构建一个 (R,G,B) 像素的 3d 立方体,以使 R、G 和 B 的值等于它们在立方体中的索引。

例如,在 Cube[0,0,0] 我应该找到黑色的像素 (0,0,0),而在 Cube[255,255,255] 的像素值应该是 (255,255,255) 或白色。 在实践中,立方体应该以 8 位存储所有可能的颜色。

为了实现这一点,我看到 Armadillo 库具有 field 类型。 所以我认为将每个像素存储在 Col<size_t> 中并从中构建和填充 3D 字段是合理的,如下所示:

#include <armadillo>
typedef arma::Col<size_t> Pixel;
int nc = 256;

arma::field<Pixel> my_cube(nc, nc, nc);

for (size_t i = 0; i < nc; i++)
{
    for (size_t j = 0; j < nc; j++)
    {
        for (size_t k = 0; k < nc; k++)
        {
            Pixel px = { i, j, k };
            my_cube[i, j, k] = px;
            my_cube[i, j, k].print();  // here I get the correct value for (i,j,k)
        }

    }
}

my_cube[0, 0, 0].print();  // here I get (255,255,0) instead of (0,0,0)
// If I try my_cube(0,0,0).print() or my_cube.at(0,0,0).print()
// I get the same wrong result for the (0,0,0) pixel and 
// [matrix(0x1)] for different values of the indices.

但是,当我尝试在外循环之后访问一个元素时,我得到了错误的结果(参见上面的代码)。

有人可以解释这种行为吗?在 for 循环之后检索正确值时我缺少什么?

我本可以使用 OpenCV 轻松完成任务,但我正在编写的代码是我无法使用它的项目的一部分。

我正在使用 Armadillo 9.900 和 Visual Studio 2017。

【问题讨论】:

    标签: c++ armadillo


    【解决方案1】:

    operator[] 仅适用于单个参数。所以my_cube[i, j, k]是错误的。

    您提到my_cube(0,0,0).print()my_cube.at(0,0,0).print() 也出现了同样的问题,但他们正在做正确的事情。但是,您还需要在分配期间使用它们中的任何一个。将my_cube[i, j, k] = px; 更改为my_cube(i, j, k) = px;my_cube.at(i, j, k) = px; 即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      相关资源
      最近更新 更多