使用OpenCV时的小技巧

来源:互联网 发布:妇女社会地位调查数据 编辑:程序博客网 时间:2024/05/18 01:40

1、  图像的遍历

OpenCV图像遍历最高效的方法是指针遍历方法。因为图像在OpenCV里的存储机制问题,行与行之间可能有空白单元(一般是补够4的倍数或8的倍数,有些地方也称作“位对齐”,目前我用到的FreeImage和c#中的bitmap中的存储机制也是这样的)。这些空白单元对图像来说是没有意思的,只是为了在某些架构上能够更有效率,比如intel MMX可以更有效的处理那种个数是4或8倍数的行。Mat提供了一个检测图像是否连续的函数isContinuous()。当图像连通时,我们就可以把图像完全展开,看成是一行。因此最高效的遍历方法如下: co

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. void imageCopy(const Mat& image,Mat& outImage)  
  2. {     
  3.     int nr=image.rows;      
  4.     int nc=image.cols;      
  5.     outImage.create(image.size(),image.type());      
  6.     if(image.isContinuous()&&outImage.isContinuous())  
  7.     {  
  8.         nr=1;  
  9.         nc=nc*image.rows*image.channels();  
  10.     }   
  11.     for(int i=0;i<nr;i++)  
  12.     {       
  13.         const uchar* inData=image.ptr<uchar>(i);         
  14.         uchar* outData=outImage.ptr<uchar>(i);        
  15.         for(int j=0;j<nc;j++)  
  16.         {  
  17.             *outData++=*inData++;  
  18.         }  
  19.     }  
  20. }  


参考资料http://www.cnblogs.com/ronny/p/opencv_road_2.html

2 防止图像Rect区域越界的方法

我们在对图像进行处理时,经常需要抽取图像中的某一区域进行处理,如果抽取的区域越界时,往往就会导致图像崩溃,下面是我在参考同行者代码时看到的一个小技巧

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. Rect rect;  
  2. rect.x = 0;  
  3. rect.y = 0;  
  4. rect.height = 0;  
  5. rect.width = 0;  
  6. rect &= Rect(0,0, image.cols, image.rows);  

3 记录程序出错文件、文件中的哪个函数、文件中的哪一行的方法

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. printf("%s(%d)-%s:error in \n",__FILE__,__LINE__,__FUNCTION__);  

__FILE__ 包含当前程序文件名的字符串

__LINE__  表示当前行号的整数

__FUNCTION__ 表示当前的函数


转载来自:http://blog.csdn.net/kaka_36/article/details/18553679

0 0
原创粉丝点击