[英]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.