* sizeof(T) );
for(unsigned int i= 1; i < Height; i++)
lp_AddRow[i] = lp_AddRow[i- 1] + Width;
}
}
// 释放数据内存的函数
template
void ImageTemplate< T >::DeleteData()
{
if(lp_AddRow != NULL)
{
if( lp_AddRow[0] != NULL ) delete []lp_AddRow[0];
delete []lp_AddRow;
lp_AddRow = NULL;
}
}
// 定义不同数据的类
typedef ImageTemplate< int > IntImage;
typedef ImageTemplate< float > FloatImage;
typedef ImageTemplate< short int > SintImage;
typedef ImageTemplate< unsigned char > BYTEImage;
在程序中使用方法如下:
FloatImage fImage(640, 480);
SintImage sImage(640, 480);
修改或获取数据可以通过公共的数据指针变量 lp_AddRow,如
for(int j= 0; j< 480; j++)
for(int i= 0; i< 640 ;i++)
{
fImage.lp_AddRow[j][i] = i*j/ 100.0f;
iImage.lp_AddRow[j][i] = 20* (i + j);
}
由于图像处理有着快速的要求,因此一般将数据指针作为公共变量直接使用,如果考虑到程序的安全性和稳定性,可以将该数据指针定义为私有变量,通过重载的操作符号[]来进行数据的修改和获取。
2.支持不同数据类型的快速排序的类
在图像处理中,对于提取出来的各种特征量要进行分析和识别,快速数据排序是其中常用的一种算法。虽然可以用函数重载的方法对不同的类型编制该类型数据的排序程序,但是引入的代码较多,因此函数重载的方法是一种低效的方法。本快速排序的类的排序功能由c标准库中定义的
qsort( void *base, size_t num, size_t width,
int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
函数来
完成,其中参数含义如下:
void *base 数据指针
size_t num 数据个数
size_t width 单个数据的字节宽度
int (__cdecl *compare ) 比较函数
对应于不同类型的数据使用该函数,按一般的方法需要编制对应不同数据类型的比较函数,而且还要进行数据类型强制转换,因此比较麻烦。利用下面定义的类就可以很方便的实现数据的快速排序。
//基于模板的快速排序类
template
class LQuickSort
{
public:
// 升序排列的比较函数
static int cmpT1(const void *ap, const void *bp);
// 降序排列的比较函数
static int cmpT2(const void *ap, const void *bp);
// 排序的函数
static void rank(T* lp, // 数据的指针
int length, // 数据的个数
BOOL IsAscend = true );//升序
};
// 升序排列的比较函数
template
int LQuickSort::cmpT1(const void * ap, const void * bp)
{
T a = *(T *)ap;
T b = *(T *)bp;
if( a > b )
return 1;
if( a < b )
return -1;
return 0;
}
// 降序排列的比较函数
template
int LQuickSort::cmpT2(const void * ap, const void * bp)
{
T a = *(T *)ap;
T b = *(T *)bp;
if( a > b )
return -1;
if( a < b )
return 1;
return 0;
}
//- -----排序的函数----------------------------
// IsAscend = true
// T* lp, 数据的指针
// int length, 数据的个数
// BOOL IsAscend true 升序排列, false 降序排列
template
void LQuickSort::rank(T* lp, int length, BOOL IsAscend)
{
if( IsAscend )
qsort( (void *)lp, length, sizeof(T), cmpT1 );
else
qsort( (void *)lp, length, sizeof(T), cmpT2 );
}
由于定义的类的成员函数为静态(static)类型,因此也可以不用声明该类的对象而调用排序函数。待排序的数据格式如下:
int ix[10] = {10, -10, 2, ……};
float fx[10] = {10.0, -10.4, 2.3, ……};
具体的排序用法有下面的两种。
用法一:定义类的对象
LQuickSort iSort;
LQuickSort fSort;
iSort.rank(ix, 10,true); // 升序排列
iSort.rank(ix, 10, false); // 降序排列
fSort.rank(fx, 10,true); // 升序排列
fSort.rank(fx, 10, false); // 降序排列
用法二:不定义类的对象
LQuickSort::rank(ix, 10, true); // 升序排列
LQuickSort::rank(ix, 10, false); // 降序排列
LQuickSort::rank(f