sortIdx不适用于C ++

时间:2015-07-03 03:52:31

标签: python sorting opencv

我正在尝试按降序排序1D openCV Mat的元素。我的python代码似乎使用openCV的sortIdx函数正常工作。但是代码在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 ++代码发生了什么

2 个答案:

答案 0 :(得分:0)

对于C ++版本,根据documentation

  

函数sortIdx按升序或降序对每个矩阵行或每个矩阵列进行排序。因此,您应该传递两个操作标志以获得所需的行为。

所以正确的方法是

Public Function CopyToDisk(ByVal DestinationPath As String, ByVal Sourcepath As String) As String


    If Not System.IO.File.Exists(Sourcepath) Then
        Return "Source missing" & Sourcepath
    End If


    Try
        File.Copy(Sourcepath, DestinationPath)

    Catch ex As Exception
        Return ex.Message
    End Try

    Return "ok"

End Function

答案 1 :(得分:0)

它现在正在工作

通常,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)<<"\t\t"<<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;