C++ 如何消除“错误”;“加倍”;c+中向量的元素+;
我用C++ 如何消除“错误”;“加倍”;c+中向量的元素+;,c++,arrays,algorithm,vector,C++,Arrays,Algorithm,Vector,我用HoughLines检测帧中的线条,线条信息保存在cv::vector中,我将其作为二维数组处理,我对第二个感兴趣,它是线条的角度,我只想保留角度差大于1.5 rad的直线,因此我在这里做了以下工作: ............................. cv::vector<cv::Vec2f> lineQ; .............................. // ordring the vector based on the angle value i
HoughLines
检测帧中的线条,线条信息保存在cv::vector
中,我将其作为二维数组处理,我对第二个感兴趣,它是线条的角度,我只想保留角度差大于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;
}
}
}
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
向量lineQ;
..............................
//基于rad中的角度值对向量进行排序
对于(int i=0;i
现在我想根据角度比较向量元素之间的差异
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]);
}
}
}
cv::矢量线;
对于(int i=0;i
这适用于2条线,但当我得到3时,比如说1.3rad作为线大小的角度
不到2。我想使用
擦除
,但这会改变向量的大小 一个选项是提供一个软“等于”到std::unique\u 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::unique_copy(lineQ.begin()、lineQ.end()、std::back_inserter(line),
[](常数cv::Vec2f&a,常数cv::Vec2f&b){
返回b[1]-a[1]看看这是否有助于复制擦除的问题,因为我只想基于第二维度对其进行比较!@TomekSzpakowicz不!不清楚您想做什么。您能给出一个输入和预期输出数据的示例吗?返回b[1]-a[1]是什么意思?1是什么意思?@Engine:a
和b
对应于lineQ[i]
和lineQ[j]
(排序)。由于您编写了lineQ[i][1]
,我假设每个向量中的元素一个包含排序/匹配键。非常感谢您的帮助!对于理解函数,[]before(const…)mean?@Engine:这是一个C++11 lambda(又名匿名函数)的语法。它有点像在文件范围内声明一个函数bool Vec2f_近似_eq(const cv::Vec2f&a,const cv::Vec2f&b){return…}
,然后作为谓词传入:std::unique_copy(…,Vec2f_近似_eq)
。显然,lambda更干净,因为它可以让您将所有东西都放在一个地方。@Engine:我很乐意,但请注意,评论是用来评论问题或答案的,而不是用来联系人的。
std::sort(lineQ.begin(), lineQ.end(),
[](const cv::Vec2f & a, const cv::Vec2f & b) {
return a[1] < b[1];
})).