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.有问题多查手册啊,手册很多东西可以用的啊。