Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.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
Python 在opencv(C+;+;)中从caffe读取多维数组_Python_C++_Arrays_Opencv - Fatal编程技术网

Python 在opencv(C+;+;)中从caffe读取多维数组

Python 在opencv(C+;+;)中从caffe读取多维数组,python,c++,arrays,opencv,Python,C++,Arrays,Opencv,我在caffe中有一个模型,可以生成多维数组。这个数组的大小是[1x10x8x8],所以在python中我对这个大小没有问题,因为python会自动管理这个数组,并且我知道数组中元素的顺序。但是,当我用C++切换到 OpenCV时,整个数组是一个向量,我不知道如何再生像Python数组这样的东西,我使用 CV::NyMyMyTrimor < /Cuff>访问多维数组,如 const cv::Mat* arrays[]={&prob,0}; //my multi-dimensional

我在
caffe
中有一个模型,可以生成多维数组。这个数组的大小是
[1x10x8x8]
,所以在python中我对这个大小没有问题,因为python会自动管理这个数组,并且我知道数组中元素的顺序。但是,当我用C++切换到<代码> OpenCV时,整个数组是一个向量,我不知道如何再生像Python数组这样的东西,我使用<代码> CV::NyMyMyTrimor < /Cuff>访问多维数组,如

const cv::Mat* arrays[]={&prob,0};  //my multi-dimensional array is prob
cv::Mat my_planes[1];
cv::NAryMatIterator it(arrays,my_planes);
cv::Mat Multi_Array ;                               //temporary Mat 
for (int p = 0; p < it.nplanes; ++p,++it) {
    Multi_Array = it.planes[0];
}
const cv::Mat*数组[]={&prob,0}//我的多维数组是prob
cv::Mat my_平面[1];
cv::NaryMaterator it(数组、my_平面);
cv::Mat多_阵列//临时垫
对于(int p=0;p
这样做之后,我看到
Multi_数组
大小是
[640x1]
,它似乎等于python产生的
8x8x10
。是否可以逐个访问
8x8
平面


编辑:我的多维数组大小为
[1x10x8x8]

要访问三维数组,就像它是一个具有形状
[640][1]
的二维数组一样,您可以编写3个循环,使用[x,y,z]格式在元素上迭代,如:

int data[640][1] = { 0 };
int width = 8, height = 8, depth = 10;

for (int x = 0; x < width; x++)
    for (int y = 0; y < height; y++)
        for (int z = 0; z < depth; z++)
        {
            int idx = x * height * depth + y * depth + z;
            data[idx][0] = idx;
        }
int数据[640][1]={0};
内部宽度=8,高度=8,深度=10;
对于(int x=0;x
这将用0到639之间的数字填充数组


如果您希望以1D的形式访问2D数组,.

如果您的模型数据是以行主格式排序的,则可以让OpenCV将数据解释为所需大小的
Mat
。然后,可以使用
多维材料行(行号)
访问
材料的平面

要从数据创建
Mat

int data[640] = { 0 };
const int size[] = { 8, 8, 10 };

cv::Mat multidim_mat(3, size, CV_32S, data);

std::cout << multidim_mat.dims << std::endl;
for (int i = 0; i < multidim_mat.dims; i++) {
    std::cout << "Dimension " << i << " is of size " << multidim_mat.size[i] << std::endl;
}
int数据[640]={0};
常量int size[]={8,8,10};
cv::Mat多维Mat(3,尺寸,cv_32S,数据);

STD::CUT< P>第一步,我们需要得到一个指向OpenCV-Mat对象的指针,你可以通过下面的命令来完成这个操作。(我假设代表你的数据的数据主要是代码>浮点< /代码>,并考虑概率MAT是“代码> PROB</代码>,我们从CAFE得到这个垫子”

此指针将指向数据驻留在内存中的位置。例如,如果我们想访问(1,3,7,7)位置的元素,我们可以这样做:

int S= sizeof(float);    
float val = p[(
    7*p.step[3]/S +    //forth dimension
    7*p.step[2]/S +    //third dimension
    3*p.step[1]/S      //second dimension
  )]           
 //first dimension is not needed, because it is decoded in address of p
 //and if you have any higher number than 1 in first dimension you need to add it to the above command
因此,对于概率矩阵中的遍历,您可以如下所示:

auto S=sizeof(float);
for (int d2 = 0; d2 < 129; ++d2) {
    for (int d3 = 0; d3 < 129; ++d3) {
        for (int d4 = 0; d4 < 10; ++d4) {
            float val = p[(d2*prob.step[3]/S + d3*prob.step[2]/S + d4* prob.step[1]/S)];
        }
    }
}
auto S=sizeof(float);
对于(int d2=0;d2<129;++d2){
对于(int d3=0;d3<129;++d3){
对于(int d4=0;d4<10;++d4){
float val=p[(d2*概率步骤[3]/S+d3*概率步骤[2]/S+d4*概率步骤[1]/S)];
}
}
}

为什么维度数是3?谢谢在我的工作中测试了你的代码后,我意识到我的数据维度是[1x10x8x8],但是我不知道如何访问opencv中的一个元素。你能用简单的代码澄清一下吗?!!这些答案有没有帮助你解决问题?向上投票,然后点击复选框,为这个问题选择最佳答案。通过做这些事情,你正在帮助未来的游客喜欢你自己。同样的问题,新年。@karlphillip,我完全忘记了这个问题,如果我找到关于咖啡馆的文档,我会发布我对这个问题的答案:)
auto S=sizeof(float);
for (int d2 = 0; d2 < 129; ++d2) {
    for (int d3 = 0; d3 < 129; ++d3) {
        for (int d4 = 0; d4 < 10; ++d4) {
            float val = p[(d2*prob.step[3]/S + d3*prob.step[2]/S + d4* prob.step[1]/S)];
        }
    }
}