Как редактировать / читать значения пикселей в 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]);
}
}