我正在尝试按降序对1D openCV Mat的元素进行排序。使用openCV的sortIdx函数,我的python代码似乎工作得很好。但是代码在C++中不起作用,因为我的索引列表包含零值。
C++代码
cv::Mat temp = cv::Mat(5, 1,CV_32F);
temp.setTo(10);
temp.at<float>(2, 0) = 20;
temp.at<float>(4, 0) = 40;
cv::Mat ind;
cv::sortIdx(temp, ind, CV_SORT_DESCENDING);
Python代码
kernel = np.ones((7,1), np.int32)
kernel[5]=10
p =cv2.sortIdx(kernel, cv2.SORT_DESCENDING+cv2.SORT_EVERY_COLUMN)
我的输出索引数组在C++代码中为零,这很奇怪。。。我尝试了很多,但不知道C++代码是怎么回事
对于C++版本,根据文档,
函数sortIdx按升序或降序对每个矩阵行或每个矩阵列进行排序。因此,您应该传递两个操作标志以获得所需的行为。
所以正确的方法是
cv::sortIdx(temp, ind, CV_SORT_EVERY_COLUMN + CV_SORT_DESCENDING);
它现在正在工作
通常,sortIdx返回ushort类型的MAT。我试图创建一个类型为float的MAT并显示它,但没有成功。现在一切都很好
Mat t = cvCreateMat(3,6,CV_32F);
t.setTo(1);
t.at<float>(0,0)=10;
t.at<float>(1,1)=20;
t.at<float>(2,1)=30;
t.at<float>(1,2)=5;
t.at<float>(2,4)=16;
t.at<float>(0,5)=40;
t.at<float>(0,2)=140;
cout<<t<<"n";
Mat t1= cvCreateMat(t.rows* t.cols, 1, CV_32F);
t1 = t.reshape(1,t.rows*t.cols);
Mat ind= cvCreateMat(t.rows*t.cols,1,CV_16U);
sortIdx(t1, ind, CV_SORT_EVERY_COLUMN | CV_SORT_DESCENDING);
for(int i=0;i<ind.rows;i++)
{
cout<<ind.at<ushort>(i,0)<<"tt"<<t1.at<float>(i,0)<<"n";
}
for(int i=0;i<ind.rows;i++)
{
int row = ind.at<ushort>(i,0);
int col = ind.at<ushort>(i,0);
row = row /t.cols;
col = col% t.cols;
cout<<row<<"t"<<col<<"n";
}
getchar();
return 0;