繁体   English   中英

如何消除c ++中向量的“双精度”元素

[英]how to elminate the “doubled” elements of a vector in c++

我正在使用HoughLines检测一帧中的线,线信息保存在cv::vector<cv::Vec2f> ,我将其作为二维数组处理,我对第二个数组感兴趣,它是角度在此行中,我只想保留角度差大于1.5 rad ,因为在这里我所做的是:

.............................
cv::vector<cv::Vec2f> lineQ;
..............................

  // ordring the vector based on the angle value in rad 
for ( int i = 0 ; i< lineQ.size()-1; i++){
                for(int j= i+1;j<lineQ.size();j++){
                        if(lineQ[i][1] > lineQ[j][1]){
                            tmp = lineQ[i];
                            lineQ[i] = lineQ[j];
                            lineQ[j] = tmp;
                        }           
                }
            }

现在我想根据角度比较向量元素

cv::vector<cv::Vec2f> line;
for ( int i = 0 ; i< lineQ.size()-1; i++){
                for ( int j= i+1; j<lineQ.size(); j++){
            if(fabs(lineQ[i][1] - lineQ[j][1])>1.5){
                        line.push_back(lineQ[i]);

                        }
                }
            }

这适用于2条线,但是当我得到3个白线时,假设1.3rad为一个角度,则线的大小大于2。我虽然要使用erase但这会改变矢量的大小!

一种选择是为std::unique_copy提供一个软“等于”:

std::unique_copy(lineQ.begin(), lineQ.end(), std::back_inserter(line),
                 [](const cv::Vec2f & a, const cv::Vec2f & b) {
                     return b[1] - a[1] <= 1.5;
                 });

旁注:您还可以避免编写自己的排序(泡沫排序是最差的选择。)并使用标准库。 这样的事情应该起作用:

std::sort(lineQ.begin(), lineQ.end(),
          [](const cv::Vec2f & a, const cv::Vec2f & b) {
              return a[1] < b[1];
          })).

(上面的代码假设使用C ++ 11,我们大多数人现在都使用C ++ 11。如果您使用的是较早版本,则可以编写几个函子类。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM