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

c++ matrix opencv

109175 просмотра

4 ответа

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

Автор: neptune Источник Размещён: 17.05.2019 04:02

Ответы (4)


47 плюса

Решение

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

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

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

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

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

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

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

Автор: J. Calleja Размещён: 04.12.2009 11:23

10 плюса

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

//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 <>. Надеюсь, поможет!

Автор: Muresan Mircea Paul Размещён: 17.08.2015 11:26

2 плюса

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

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

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

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

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

Если вы хотите непрерывный доступ, OpenCV обеспечивает Mat итератор, совместимый с 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, который гораздо более интуитивно понятен и понятен

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

Автор: Wei Yuang Hsu Размещён: 27.10.2017 01:46

1 плюс

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

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

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

Автор: Ben Размещён: 17.03.2015 05:39
Вопросы из категории :
32x32