修改opencv中的svm,输出top n匹配的结果。

最近想用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,如果改的和引用的不一致就悲剧了,我就碰到了,还好休息的时候马上想到了。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值