opencv 学习笔记-入门(34)内存使用要慎重

1. 在创建字符串指针的时候,最好都创建为动态的指针,这样可以排除后面的出错。切记切记

例如:

char *CNum = new char[offset/4];

当复用的时候,总会出现提示内存超界,程序无法运行。你的绝大多数时间将会浪费在此,最好要这样定义啊。

2.在进行一个算法的实现时,一定要有一个计时函数啊,这样可以对你程序优化起到很大的作用,

double t = (double)getTickCount();  

   ......

t = (double)getTickCount() - t; 
cout << "the time is :" << t << endl; 

3. 图像的使用时最好利用c++,下的矩阵形式,这样可以很好的将这个矩阵重复使用,不用考虑是否每次复用的时候会出现内存泄露的情况。

Mat cb(height/2, width/2, CV_8UC1, ql.name, width/2);

4.对于OPENCV Mat的使用时,可以利用将其数据转化为uchar , 或者float 的数组,这样对其进行运算会非常方便,并且对于多维的情况,我们直接就是size * channel 个数据,直接进行计算,

  for ( int i = 0; i < height; ++i )  
    {  
        for ( int j = 0; j < width; ++j )  
        {  
            pBGR = pRGB+ i*width*3+j*3;  
  
            Y = *(pY+i*width+j);  
            U = *pU;  
            V = *pV;  
  
            //B  
            tmp = MB(Y, U, V);  
            //B = (tmp > 255) ? 255 : (char)tmp;  
            //B = (B<0) ? 0 : B;  
            B = (unsigned char)tmp;  
            //G  
            tmp = MG(Y, U, V);  
            //G = (tmp > 255) ? 255 : (char)tmp;  
           // G = (G<0) ? 0 : G;  
            G = (unsigned char)tmp;  
            //R  
            tmp = MR(Y, U, V);  
            //R = (tmp > 255) ? 255 : (char)tmp;  
            //R = (R<0) ? 0 : R;  
            R = (unsigned char)tmp;  
  
  
            *pBGR     = R;              
            *(pBGR+1) = G;          
            *(pBGR+2) = B;  

        }

}


5.计算的时候,现定义出计算时需要的类型,直接利用这个类型进行计算,计算完后,在对其进行转化,这样并不麻烦,反而使程序更易懂。

    unsigned char R = 0;  
    unsigned char G = 0;  
    unsigned char B = 0;  
    char Y = 0;  
    char U = 0;  
    char V = 0; 


      //B  
            tmp = MB(Y, U, V);  
            //B = (tmp > 255) ? 255 : (char)tmp;  
            //B = (B<0) ? 0 : B;  
            B = (unsigned char)tmp;  
            //G  
            tmp = MG(Y, U, V);  
            //G = (tmp > 255) ? 255 : (char)tmp;  
           // G = (G<0) ? 0 : G;  
            G = (unsigned char)tmp;  
            //R  
            tmp = MR(Y, U, V);  
            //R = (tmp > 255) ? 255 : (char)tmp;  
            //R = (R<0) ? 0 : R;  
            R = (unsigned char)tmp;  

6.字符数组进行转换之后,要进行显示,达到可观的目的哦,这时,还是利用动态的方法比较好,不用考虑内存泄露,

Mat Dst(height, width, CV_8UC3, dst, width*3); 

手册第19页:


7.有问题多查手册啊,手册很多东西可以用的啊。


你可能感兴趣的:(opencv 学习笔记-入门(34)内存使用要慎重)