Доступ к матричному элементу в объекте "Мат" (а не в объекте CvMat) в OpenCV С++ - программирование
Подтвердить что ты не робот

Доступ к матричному элементу в объекте "Мат" (а не в объекте CvMat) в OpenCV С++

Как получить доступ к элементам по строке, col в новом классе "Mat" OpenCV 2.0? Документация связана ниже, но я не смог ее понять. http://opencv.willowgarage.com/documentation/cpp/basic_structures.html#mat

4b9b3361

Ответ 1

В документации:

http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat

В нем говорится:

(...), если вы знаете матричный элемент типа, например. он плавает, тогда вы можете использовать по методу < > ()

То есть вы можете использовать:

Mat M(100, 100, CV_64F);
cout << M.at<double>(0,0);

Может быть, проще использовать класс Mat_. Это оболочка шаблона для Mat. Mat_ имеет перегруженный operator(), чтобы получить доступ к элементам.

Ответ 2

Представленные выше идеи хороши. Для быстрого доступа (в случае, если вы хотите сделать приложение в реальном времени), вы можете попробовать следующее:

//suppose you read an image from a file that is gray scale
Mat image = imread("Your path", CV_8UC1);
//...do some processing
uint8_t *myData = image.data;
int width = image.cols;
int height = image.rows;
int _stride = image.step;//in case cols != strides
for(int i = 0; i < height; i++)
{
    for(int j = 0; j < width; j++)
    {
        uint8_t val = myData[ i * _stride + j];
        //do whatever you want with your value
    }
}

Доступ к указателям намного быстрее, чем доступ Mat.at < > . Надеюсь, это поможет!

Ответ 3

OCV делает все возможное, чтобы убедиться, что вы не можете этого сделать, не зная тип элемента, но если вы хотите легко поддающийся кодированию, но не очень эффективный способ прочитать его тип-агностически, вы можете использовать что-то вроде

double val=mean(someMat(Rect(x,y,1,1)))[channel];

Чтобы сделать это хорошо, вам нужно знать тип. Метод at < > является безопасным способом, но прямой доступ к указателю данных обычно выполняется быстрее, если вы делаете это правильно.

Ответ 4

Основываясь на том, что @J. Calleja сказал, у вас есть два варианта

Случайный доступ

Если вы хотите получить произвольный доступ к элементу Mat, просто используйте

at<data_Type>(row_num, col_num) = value;

Непрерывный доступ

Если вы хотите непрерывный доступ, OpenCV предоставляет Mat iterator, совместимый с итератором STL

MatIterator_<double> it, end;
for( it = I.begin<double>(), end = I.end<double>(); it != end; ++it)
{
    //do something here
}

или

for(int row = 0; row < mat.rows; ++row) {
    float* p = mat.ptr(row); //pointer p points to the first place of each row
    for(int col = 0; col < mat.cols; ++col) {
         *p++;  // operation here
    }
}

Я беру картинку из сообщения в блоге Динамические двухмерные массивы в C

введите описание изображения здесь