使用OpenCV时的小技巧(待续)

1、  图像的遍历

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

 
 
void imageCopy(const Mat& image,Mat& outImage)
{   
	int nr=image.rows;    
	int nc=image.cols;    
	outImage.create(image.size(),image.type());    
	if(image.isContinuous()&&outImage.isContinuous())
	{
		nr=1;
		nc=nc*image.rows*image.channels();
	} 
	for(int i=0;i<nr;i++)
	{     
		const uchar* inData=image.ptr<uchar>(i);       
		uchar* outData=outImage.ptr<uchar>(i);      
		for(int j=0;j<nc;j++)
		{
			*outData++=*inData++;
		}
	}
}


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

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

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

Rect rect;
rect.x = 0;
rect.y = 0;
rect.height = 0;
rect.width = 0;
rect &= Rect(0,0, image.cols, image.rows);

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

printf("%s(%d)-%s:error in \n",__FILE__,__LINE__,__FUNCTION__);

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

__LINE__  表示当前行号的整数

__FUNCTION__ 表示当前的函数

 

你可能感兴趣的:(使用OpenCV时的小技巧(待续))