访问图像像素
at方法
- 基于Mat对象的随机像素访问API实现,通过行列索引方式遍历每个像素值
void method_1(Mat & img)
{
int h = img.cols;
int w = img.rows;
for (int row = 0; row < w; row++)
{
for (int col = 0; col < h; col++)
{
Vec3b bgr = img.at(row, col);
img.at(row, col)[0] = 255 - bgr[0];
img.at(row, col)[1] = 255 - bgr[1];
img.at(row, col)[2] = 255 - bgr[2];
}
}
}
指针ptr
- 基于Mat对象的行随机访问指针方式实现对每个像素的遍历
void method_2(Mat & img)
{
int h = img.cols;
int w = img.rows;
int dims = img.channels();
for (int row = 0; row < w; row++)
{
uchar * ptr = img.ptr(row);
for (int col = 0; col < h * dims; col++)
{
int pv = ptr[col];
ptr[col] = 255 - pv;
}
}
}
data指针
- 直接获取Mat对象的像素块的数据指针
void method_4(Mat & img)
{
int h = img.cols;
int w = img.rows;
for (int row = 0; row < w; row++)
{
uchar * uc_pixel = img.data + row * img.step;
for (int col = 0; col < h; col++)
{
uc_pixel[0] = 255 - int(uc_pixel[0]);
uc_pixel[1] = 255 - int(uc_pixel[1]);
uc_pixel[2] = 255 - int(uc_pixel[2]);
uc_pixel += 3;
}
}
}
迭代器
- Mat类变量同时也是一个容器变量,因此,Mat类变量拥有迭代器,用于访问Mat类变量中的数据,通过迭代器可以实现对矩阵中每一个元素的遍历
void method_3(Mat & img)
{
MatIterator_ it = img.begin();
MatIterator_ it_end = img.end();
for (int i = 0; it != it_end; it++)
{
int itrertor = *it;
*it = 255 - itrertor;
}
imshow("iterator", img);
}
测量运行时间
cv::getTickCount():返回自某个事件以来系统CPU的滴答声cv::getTickFrequency():返回CPU在一秒内发出多少次滴答声
测量两个操作之间经过的时间:
double t = (double)getTickCount();
// do something...
t = ((double)getTickCount() - t / getTickFrequency());
cout << "Times passed in seconds: " << t << endl;