OpenCV中使用Mat类作为对于有类型的图像buffer数据的封装
对于图像最基本的操作就是访问其各个像素的RGB值
- 扫描访问,追求效率,一般采用mat.ptr(row)获取指针进行访问:
int channels = I.channels();
int nRows = I.rows;
int nCols = I.cols * channels;
int i,j;
uint8_t *p;
for( i = 0; i < nRows; ++i)
{
p = I.ptr<uint8_t>(i);
for ( j = 0; j < nCols; ++j)
{
//还可以做循环展开
p[j] = 0;
}
}
如果图像是连续存储的( mat.isContinue() )也可以直接
uchar* p = I.data;
for( unsigned int i =0; i < ncol*nrows; ++i)
*p++ = 0;
- 随机访问 方便但速度慢
//单通道
for( int i = 0; i < I.rows; ++i)
for( int j = 0; j < I.cols; ++j )
I.at<uint8_t>(i,j) = 0;
//多通道
for( int i = 0; i < I.rows; ++i)
for( int j = 0; j < I.cols; ++j )
{
I(i,j)[0] = 0;
I(i,j)[1] = 0;
I(i,j)[2] = 0;
}