最近想用svm来输出top n 匹配的结果。看了下opencv中的svm,predict,只能输出top 1 。
有3个predict函数可选。其中有一个用了cv::parallel_for,应该是并行优化了,查不到相应的解释文档。
最后选了
float CvSVM::predict( const float* row_sample, int row_len, bool returnDFVal ) const
如果不是one——class问题,returnDFVal是不起作用的。
其实也没得选,因为其他的几个都是基于这个。。。。
原来的代码有如下内容,这个就是输出最大值的。先排序,然后就可以输出第n个值了。
for( i = 1, k = 0; i < class_count; i++ )
{
if( vote[i] > vote[k] )
k = i;
}
result = returnDFVal && class_count == 2 ? (float)sum : (float)(class_labels->data.i[k]);
}
else
CV_Error( CV_StsBadArg, "INTERNAL ERROR: Unknown SVM type, "
"the SVM structure is probably corrupted" );
return result;
}
如果不改源代码,就要自己训练(n*n-1)/2个svm,然后returnDFVal设置为true,自己比较输出结果。
最后修改如下
/*
for( i = 1, k = 0; i < class_count; i++ )
{
if( vote[i] > vote[k] )
k = i;
}
result = returnDFVal && class_count == 2 ? (float)sum : (float)(class_labels->data.i[k]);
*/
/*修改代码,以便可以输出第n大的数,作为候选结果*/
float xx=0;
cv::Mat vote2=cv::Mat(class_count,1,CV_32FC1,vote);
cv::Mat vote3;
cv::sortIdx(vote2,vote3,CV_SORT_EVERY_COLUMN+CV_SORT_DESCENDING);
k=vote3.at<int>(n-1,0);
result = returnDFVal && class_count == 2 ? (float)sum : (float)(class_labels->data.i[k]);
结果有待验证。
改了hpp和cpp后,检查下是否引用了hpp,如果改的和引用的不一致就悲剧了,我就碰到了,还好休息的时候马上想到了。
1万+

被折叠的 条评论
为什么被折叠?



