图像处理中,经常需要对检测物体的坐标、面积、周长、角度等进行排序,通过获取目标模板的数据,可进行相应的升序或降序排序,其中,快速排序法是最常用的一种。
template <class T>
void cvQuickAscendSort(vector<float> &labels, vector<T> &points, int left, int right)
{
if(labels.size()<=1 || points.size()!=labels.size() || left>=right)
return;
int i=left, j=right;
float k=labels[i];
T g=points[i];
while(i<j)
{
while(i<j && labels[j]>k)
j--;
if(i<j)
{
labels[i]=labels[j];
points[i]=points[j];
i++;
}
while(i<j && labels[i]<k)
i++;
if(i<j)
{
labels[j]=labels[i];
points[j]=points[i];
j--;
}
}
labels[i]=k;
points[i]=g;
cvQuickAscendSort(labels, points, left, i-1);
cvQuickAscendSort(labels, points, i+1, right);
}
template <class T>
void cvQuickDescendSort(vector<float> &labels, vector<T> &points, int left, int right)
{
if(labels.size()<=1 || points.size()!=labels.size() || left>=right)
return;
int i=left, j=right;
float k=labels[i];
T g=points[i];
while(i<j)
{
while(i<j && labels[j]<k)
j--;
if(i<j)
{
labels[i]=labels[j];
points[i]=points[j];
i++;
}
while(i<j && labels[i]>k)
i++;
if(i<j)
{
labels[j]=labels[i];
points[j]=points[i];
j--;
}
}
labels[i]=k;
points[i]=g;
cvQuickDescendSort(labels, points, left, i-1);
cvQuickDescendSort(labels, points, i+1, right);
}