Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有效地在L1规范化OpenCV描述符上执行有符号平方根_C++_Opencv_Vector - Fatal编程技术网

C++ 有效地在L1规范化OpenCV描述符上执行有符号平方根

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){

我有一个矩阵,其中每一行是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){
        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行左右的速度才有意义。我认为你的描述符少得多,所以在实践中没有区别。你还感兴趣吗在那些里面?