Как редактировать / читать значения пикселей в OpenCv из переменной Mat?

Я ищу эффективный способ редактирования / чтения пикселей из переменной Mat (или Mat3b).

я использовал :-

Image.at<Vec3b>(i,j)

но это, кажется, очень медленно.

Я также использовал это:-

A.data[A.channels()*A.cols*i + j + 0]

но проблема, с которой я сталкиваюсь, заключается в том, когда я запускаю этот цикл

for(i=0; j<A.rows; i++){
   for(j=0; j<A.cols; j++){
           A.data[A.channels()*A.cols*i + j + 0] = 0;
           A.data[A.channels()*A.cols*i + j + 1] = 0;
           A.data[A.channels()*A.cols*i + j + 2] = 0;
    }
} 

почернела только часть изображения.

2 ответов


здесь вы можете увидеть некоторые из возможностей для быстрого доступа в элемент.

но если вы хотите сделать это по-своему, Вам нужно добавить скобку. В противном случае вычисление индекса неверно:

for(int i=0; i<A.rows; i++){
   for(int j=0; j<A.cols; j++){
           A.data[A.channels()*(A.cols*i + j) + 0] = 0;
           A.data[A.channels()*(A.cols*i + j) + 1] = 0;
           A.data[A.channels()*(A.cols*i + j) + 2] = 0;
    }
} 

но расположение памяти не гарантируется непрерывным из-за заполнения. Итак, согласно этой вы должны использовать формулу вида:

for(int i=0; i<A.rows; i++){
   for(int j=0; j<A.cols; j++){
           A.data[A.step[0]*i + A.step[1]* j + 0] = 0;
           A.data[A.step[0]*i + A.step[1]* j + 1] = 0;
           A.data[A.step[0]*i + A.step[1]* j + 2] = 0;
    }
} 

Это один из самых эффективных способов редактирования/чтения пикселей из cv::Mat. Создайте указатель на строку (определенного канала, если необходимо)

for(int i=0; i<A.rows;i++){
  uchar* rowi = A.ptr/*<uchar>*/(i);
  for(int j=0; j<A.cols; j++){
     doProcessOnPixel(rowi[j]);
  }
}