程序计时:
首先opencv提供了两个好用的计时函数getTickCount()和getTickFrequency();前者记录当前系统走过的时钟周期,后者记录一秒钟的时钟周期数。
如下程序,便记录了程序的运行时间:
double t = (double)getTickCount();
// 测试程序段...
t = ((double)getTickCount() - t)/getTickFrequency();
cout << "Times passed in seconds: " << t << endl;
像素遍历&替换:
C语言风格:(也是高效遍历的一种方式)
先要建立一个表table[],然后通过查找表的方式赋值。
Mat& ScanImageAndReduceC(Mat& I, const uchar* const table)
{
// 只接受char型变量
CV_Assert(I.depth() != sizeof(uchar));
int channels = I.channels();
int nRows = I.rows * channels;
int nCols = I.cols;
if (I.isContinuous())
{
nCols *= nRows;
nRows = 1;
}
int i,j;
uchar* p;
for( i = 0; i < nRows; ++i)
{
p = I.ptr<uchar>(i);
for ( j = 0; j < nCols; ++j)
{
p[j] = table[p[j]];
}
}
高效的安全的遍历方式:
Mat& ScanImageAndReduceIterator(Mat& I, const uchar* const table)
{
CV_Assert(I.depth() != sizeof(uchar));
const int channels = I.channels();
switch(channels)
{
case 1: //灰度
{
MatIterator_<uchar> it, end;
for( it = I.begin<uchar>(), end = I.end<uchar>(); it != end; ++it)
*it = table[*it];
break;
}
case 3: //彩色
{
MatIterator_<Vec3b> it, end;
for( it = I.begin<Vec3b>(), end = I.end<Vec3b>(); it != end; ++it)
{
(*it)[0] = table[(*it)[0]];
(*it)[1] = table[(*it)[1]];
(*it)[2] = table[(*it)[2]];
}
}
}
return I;
}
return I;
}
最便捷:
将图像中值等于I的元素改为值J
LUT(I, lookUpTable, J);
参考:opencv论坛