opencvMat图像数据元素进⾏排序
原⽂:blog.csdn/qing101hua/article/details/52817373
sortIdx 函数 对元素进⾏排序, 返回对应的排序索引
[cpp]
1. Mat c1 = (Mat_<double>(3,3) << 1, 5 , 6 , 2 , 4, 2, 5, 9, 4);
2. Mat c2(c1);
3. sortIdx(c1, c2, SORT_EVERY_COLUMN + SORT_ASCENDING);
4. cout << "c1: \n" << c1 << endl;
5. cout << "c2: \n" << c2 << endl;
Mat c1 = (Mat_<double>(3,3) << 1, 5 , 6 , 2 , 4, 2, 5, 9, 4);
Mat c2(c1);
sortIdx(c1, c2, SORT_EVERY_COLUMN + SORT_ASCENDING);
cout << "c1: \n" << c1 << endl;
cout << "c2: \n" << c2 << endl;
sort 排序函数, C++中sort函数 详细介绍参见 :
[cpp]
1. // sort  Mat(3,3)
2. int* c1begin = c1.ptr<int>(0);
3. int* c1end = c1.ptr<int>(2);
4. sort(c1begin[0], c1end[2]); // 该⾏代码 编译报错
5. cout << "c1: \n " << c1 << endl;
// sort  Mat(3,3)
int* c1begin = c1.ptr<int>(0);
int* c1end = c1.ptr<int>(2);
sort(c1begin[0], c1end[2]); // 该⾏代码编译报错
cout << "c1: \n " << c1 << endl;
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\algorithm(3093): error : operand of "*" must be a pointer
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\algorithm(3093): error : operand of "*" must be a pointer
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\algorithm(3093): error : no instance of function
template "std::less<void>::operator()" matches the argument list
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\algorithm(2288): error : operand of "*" must be a pointer
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\algorithm(2288): error : operand of "*" must be a pointer
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\algorithm(2292): error : operand of "*" must be a pointer
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\algorithm(2292): error : operand of "*" must be a pointer
1>  main.cu
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations\CUDA 7.5.targets(604,9): error MSB3721: 命令“"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\" -
gencode=arch=compute_20,code=\"sm_20,compute_20\" --use-local-env --cl-version 2013 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64"  -I"C:\Program Files\NVIDIA GPU Computing
Toolkit\CUDA\v7.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\include"  -G  --keep-dir
x64\Debug -maxrregcount=0  --machine 64 --compile -cudart static  -g  -DWIN32 -DWIN64 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd " -o x64\Debug\main.cu.obj
"D:\work\test\wb\wb\main.cu"”已退出,返回代码为 2。
========== 全部重新⽣成:  成功 0 个,失败 1 个,跳过 0 个 ==========
[cpp]
1. //sort int[9];
2. int d1[] = { 2, 4, 5, 2, 1, 8, 6, 7, 9 };
3. sort(d1[0], d1[7]);  // 报错 ,编译不过去
4. //cout << "d1: \n" << d1 << endl;
//sort int[9];
int d1[] = { 2, 4, 5, 2, 1, 8, 6, 7, 9 };
sort(d1[0], d1[7]);  // 报错,编译不过去
//cout << "d1: \n" << d1 << endl;
报错:
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\algorithm(3093): error : no instance of function template "std::less<void>::operator()" matches the argument list
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\algorithm(2288): error : operand of "*" must be a pointer
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\algorithm(2288): error : operand of
"*" must be a pointer
sort命令排序1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\algorithm(2292): error : operand of "*" must be a pointer
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\algorithm(2292): error : operand of "*" must be a pointer
1>  main.cu
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations\CUDA 7.5.targets(604,9): error MSB3721: 命令“"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\" -
gencode=arch=compute_20,code=\"sm_20,compute_20\" --use-local-env --cl-version 2013 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64"  -I"C:\Program Files\NVIDIA GPU Computing
Toolkit\CUDA\v7.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\include"  -G  --keep-dir
x64\Debug -maxrregcount=0  --machine 64 --compile -cudart static  -g  -DWIN32 -DWIN64 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd " -o x64\Debug\main.cu.obj
"D:\work\test\wb\wb\main.cu"”已退出,返回代码为 2。
========== ⽣成:  成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
解决:
将sort输⼊参数 改成数据索引的指针
1、对int[9] 进⾏, 对int[9]的前6个元素进⾏排序
[cpp]
1. //sort int[9];
2. int d1[9] = { 2, 4, 5, 2, 1, 8, 6, 7, 9 };
3. cout << "d1[]: " << endl;
4. for (int i = 0; i < 9; i++)
5.  cout << d1[i] << endl;
6.
7. sort(d1, d1+5);  // 注意: 参数如果不是指针变量的话 会报错 ,编译不过去
8. cout << "d1[]: " << endl;
9. for (int i = 0; i < 6; i++)
10.  cout << d1[i] << endl;
//sort int[9];
int d1[9] = { 2, 4, 5, 2, 1, 8, 6, 7, 9 };
cout << "d1[]: " << endl;
for (int i = 0; i < 9; i++)
cout << d1[i] << endl;
sort(d1, d1+5);  // 注意:参数如果不是指针变量的话会报错,编译不过去
cout << "d1[]: " << endl;
for (int i = 0; i < 6; i++)
cout << d1[i] << endl;
2、对Mat(3,3)的元素进⾏排序:
int* c1begin = c1.ptr<int>(0);
int* c1end = c1.ptr<int>(2);
sort(c1begin, c1end+2);
cout << endl<<"sort(c1begin, c1end+2)" << endl;
cout << "c1: \n " << c1 << endl;
sort(c1begin, c1end + 3);
cout <<endl << "sort(c1begin, c1end+3)" << endl;
cout << "c1: \n " << c1 << endl;
sort(c1begin, c1end);
cout << endl << "sort(c1begin, c1end)" << endl;
cout << "c1: \n " << c1 << endl;[cpp]
1. int* c1begin = c1.ptr<int>(0);
2. int* c1end = c1.ptr<int>(2);
3. sort(c1begin, c1end+2);
4. cout << endl<<"sort(c1begin, c1end+2)" << endl;
5. cout << "c1: \n " << c1 << endl;
6.
7. sort(c1begin, c1end + 3);
8. cout <<endl << "sort(c1begin, c1end+3)" << endl;
9. cout << "c1: \n " << c1 << endl;
[cpp]
1. sort(c1begin, c1end);
2. cout << endl << "sort(c1begin, c1end)" << endl;
3. cout << "c1: \n " << c1 << endl;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。