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__ 表示当前的函数