opencv 学习记录(2) 像素遍历

本文介绍了使用OpenCV进行程序计时的方法,包括getTickCount()和getTickFrequency()函数,以及如何通过这两种方法计算程序运行时间。此外,还详细讲解了两种像素遍历的高效方式,一种是C语言风格的遍历,另一种是利用MatIterator_进行安全遍历,特别是针对灰度和彩色图像的处理。最后提到了LUT函数在快速修改图像像素值上的应用。
摘要由CSDN通过智能技术生成

程序计时:

首先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论坛

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值