我正在尝试按降序排序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 ++代码发生了什么
答案 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;