2009-12-04 4 views

ответ

44

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

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(), чтобы получить доступ к элементам.

+0

Как установить определенное значение для некоторого определенного индекса М? – damned

+4

@sumit Метод at <>() возвращает ссылку на элемент.Вы можете использовать: M.at (0, 0) = значение; –

+1

Я почти уверен, что этот пример ошибочен. Я полагаю, что это делает небезопасный листинг внутри, поэтому использование с помощью double на матрице uint приведет к нежелательным/искаженным результатам. Предлагаем коррекцию. – Catskul

1

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

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

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

9

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

//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 
    } 
} 

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

+1

Стоимость доступа к указателю точно такая же, как Mat.at <> (при компиляции в версии). Единственное отличие - утверждает, что они активны, если код не скомпилирован в режиме отладки. –

1

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

Произвольный доступ

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

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

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

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

одолжить картину из блоге в Dynamic Two-dimensioned Arrays in C

enter image description here

Смежные вопросы