原文:

//通道
for(k = 0; k < c; ++k){
    //高
    for(j = 0; j < h; ++j){
        //宽
        for(i = 0; i < w; ++i){
            int dst_index = i + w*j + w*h*k;
            int src_index = k + c*i + c*w*j;
            im.data[dst_index] = (float)data[src_index]/255.;
        }
    }
}

图解:

如果用更多的语言描述上面转换的功能,发现比较繁琐,最终决定直接举例上图。
为了简化问题,假设如下:

  • c = 3, w = 6, h = 5;
  • 为了更直观观察结果,本次转换只是简单的迁移,期间没有经过数据的处理(im.data[dst_index] = data[src_index]);
//原始数据存放顺序:
int data[3][5][6]=
{
    {
        {110,111,112,113,114,115},
        {120,121,122,123,124,125},
        {130,131,132,133,134,135},
        {140,141,142,143,144,145},
        {150,151,152,153,154,155}
    },
    {
        {210,211,212,213,214,215},
        {220,221,222,223,224,225},
        {230,231,232,233,234,235},
        {240,241,242,243,244,245},
        {250,251,252,253,254,255}
    },
    {
        {310,311,312,313,314,315},
        {320,321,322,323,324,325},
        {330,331,332,333,334,335},
        {340,341,342,343,344,345},
        {350,351,352,353,354,355}
    }
};

根据上面的功能进行转换之后目标数据 im.data 的效果为:


通过对比你会发现,源数据是按照不同通道的同一宽高像素数据放在了一块,而目标数据是按同一通道的不同宽高像素数据存放。