在行中访问值,在Matrix中访问col

时间:2011-06-29 01:23:42

标签: opencv matrix

我正在尝试访问矩阵中的特定行,但我很难这样做。

我想获得第j行第i列的值,但我不认为我的算法是正确的。我正在使用OpenCV的Mat作为我的矩阵并通过数据成员访问它。

以下是我尝试访问值的方法:

plane.data [i + j * plane.rows]

其中i =列,j =行。它是否正确?矩阵是来自YUV矩阵的1个平面。

任何帮助将不胜感激!感谢。

2 个答案:

答案 0 :(得分:2)

不,你错了 plane.data [i + j * plane.rows]不是访问像素的好方法。您的指针必须取决于矩阵的类型及其深度。 你应该使用矩阵的at()运算符。

这里简单的是一个代码示例,它访问矩阵的每个像素并打印出来。它几乎适用于每种矩阵类型和任意数量的通道:

void printMat(const Mat& M){
    switch ( (M.dataend-M.datastart) / (M.cols*M.rows*M.channels())){

    case sizeof(char):
         printMatTemplate<unsigned char>(M,true);
         break;
    case sizeof(float):
         printMatTemplate<float>(M,false);
         break;
    case sizeof(double):
         printMatTemplate<double>(M,false);
         break;
    }
}


template <typename T>  
void printMatTemplate(const Mat& M, bool isInt = true){
    if (M.empty()){
       printf("Empty Matrix\n");
       return;
    }
    if ((M.elemSize()/M.channels()) != sizeof(T)){
       printf("Wrong matrix type. Cannot print\n");
       return;
    }
    int cols = M.cols;
    int rows = M.rows;
    int chan = M.channels();

    char printf_fmt[20];
    if (isInt)
       sprintf_s(printf_fmt,"%%d,");
    else
       sprintf_s(printf_fmt,"%%0.5g,");

    if (chan > 1){
        // Print multi channel array
        for (int i = 0; i < rows; i++){
            for (int j = 0; j < cols; j++){         
                printf("(");
                const T* Pix = &M.at<T>(i,j);
                for (int c = 0; c < chan; c++){
                   printf(printf_fmt,Pix[c]);
                }
                printf(")");
            }
            printf("\n");
        }
        printf("-----------------\n");          
    }
    else {
        // Single channel
        for (int i = 0; i < rows; i++){
            const T* Mi = M.ptr<T>(i);
            for (int j = 0; j < cols; j++){
               printf(printf_fmt,Mi[j]);
            }
            printf("\n");
        }
        printf("\n");
    }
}

答案 1 :(得分:0)

我认为访问RGB Mat和YUV Mat之间没有任何不同。它只是颜色空间不同。

有关如何访问每个像素,请参阅http://opencv.willowgarage.com/wiki/faq#Howtoaccessmatrixelements.3F