Доступ к значению в строке, столбце в матрице - PullRequest
2 голосов
/ 29 июня 2011

Я пытаюсь получить доступ к определенной строке в матрице, но мне трудно это сделать.

Я хочу получить значение в строке j, столбце i, но я не думаю, что мой алгоритм правильный. Я использую Mat OpenCV для своей матрицы и получаю к ней доступ через член данных.

Вот как я пытаюсь получить доступ к значениям:

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

Где i = столбец, j = строка. Это правильно? Матрица - это 1 плоскость от матрицы YUV.

Любая помощь будет оценена! Спасибо.

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

Нет, вы не правы 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");
    }
}
0 голосов
/ 29 июня 2011

Я не думаю, что между доступом к RGB Mat и YUV Mat есть что-то другое.Различно только цветовое пространство.

Пожалуйста, обратитесь к http://opencv.willowgarage.com/wiki/faq#Howtoaccessmatrixelements.3F о том, как получить доступ к каждому пикселю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...