C++ 有效地在L1规范化OpenCV描述符上执行有符号平方根
我有一个矩阵,其中每一行是64维的SURF描述符。对于每一行,我需要:C++ 有效地在L1规范化OpenCV描述符上执行有符号平方根,c++,opencv,vector,C++,Opencv,Vector,我有一个矩阵,其中每一行是64维的SURF描述符。对于每一行,我需要: L1使其正常化 对于每个元素,计算其有符号平方根 我得出结论的唯一方法是: template <typename T> int sgn(T val) { return (T(0) < val) - (val < T(0)); } void SURFOpenCV::ComputeDescriptors(cv::Mat &img, cv::Mat1f &descriptors){
template <typename T> int sgn(T val) {
return (T(0) < val) - (val < T(0));
}
void SURFOpenCV::ComputeDescriptors(cv::Mat &img, cv::Mat1f &descriptors){
descriptors.release();
std::vector<cv::KeyPoint> pts;
surf->detectAndCompute(img, cv::Mat(), pts, descriptors);
//if there is at least one keypoint
if(pts.size()){
// For each row
for (int i = 0; i < descriptors.rows; ++i) {
// Perform L1 normalization on the whole descriptor
cv::normalize(descriptors.row(i), descriptors.row(i), 1.0, 0.0, cv::NORM_L1);
for (int j = 0; j<descriptors.cols; j++) {
float val = descriptors.at<float>(i,j);
descriptors.at<float>(i,j) = sgn(val) * std::sqrt(val);
}
}
}
}
template int sgn(T val){
返回值(T(0)detectAndCompute(img,cv::Mat(),pts,描述符);
//如果至少有一个关键点
if(pts.size()){
//每行
对于(int i=0;i 对于(int j=0;jprofiler指出您的算法的哪一部分消耗的时间最多?我没有分析它,但最好避免对单个元素进行操作,而更喜欢对整个向量/数组/数据结构进行操作的特定函数,您不这样认为吗?您是否错过了abs
?std::sqrt(std::abs(val))
?@Miki oh gosh I did:D然而,操作元素对我来说效率太低了。我昨天做了两次测试。两次测试的速度都比你的方法快2倍,但只有10000行左右的速度才有意义。我认为你的描述符少得多,所以在实践中没有区别。你还感兴趣吗在这些方面?你的分析器指出你的算法的哪一部分消耗了最多的时间?我没有分析它,但最好避免对单个元素进行操作,而更喜欢对整个向量/数组/数据结构进行操作的特定函数,你不认为吗?你是否错过了一个abs
?std::sqrt(std::abs(val))
?@Miki oh gosh I did:D然而,操作元素对我来说效率太低了。我昨天做了两次测试。两次测试的速度都比你的方法快2倍,但只有10000行左右的速度才有意义。我认为你的描述符少得多,所以在实践中没有区别。你还感兴趣吗在那些里面?