2017-08-10 145 views
-2

我有一个cv::Mat mat,做一些东西,并得到一个std::vector<cv::Points> diagonalPoints进一步编码,这里变得棘手 - 在创建这些diagonalPoints后,我通过每列获得两点之间的最大距离(对于每一列,因此我比较[i].x[i+1].x-见下文)。但是(!)经过计算,我会得到每个maxDist为一列,这是比bivoger preger,而不是列最大的一列获取每次迭代的最大值

这里是我的代码的重要组成部分:

for (int i = 0; i < diagonalPoints.size(); i++) { 
    int dist = diagonalPoints[i + 1].y - diagonalPoints[i].y; 

    if (diagonalPoints[i].x == diagonalPoints[i + 1].x) { 
     if (dist > maxDist) { 
      maxDist = dist; 
      maxDistColumn = diagonalPoints[i].x; 
      firstPt = diagonalPoints[i]; 
      secondPt = diagonalPoints[i + 1]; 
     } 
    } 
    else if (diagonalPoints[i].x != diagonalPoints[i + 1].x) { 
     maxDist = 0; 
    } 
    std::cout << maxDist << " in i: " << maxDistColumn << "\n"; 
    farestPoints = std::make_pair(firstPt, secondPt); 
    std::cout << farestPoints.first << ", " << farestPoints.second << " "; 
} 

的输出(减少它,只是第一列):

[0, 26], [0, 39] - maxDist: 13 in i: 0 
[0, 26], [0, 39] - maxDist: 13 in i: 0 
[0, 26], [0, 39] - maxDist: 13 in i: 0 
[0, 42], [0, 950] - maxDist: 908 in i: 0 
[0, 42], [0, 950] - maxDist: 908 in i: 0 
[0, 42], [0, 950] - maxDist: 908 in i: 0 

但我只是想获得唯一[0, 42], [0, 950] - maxDist: 908 in i: 0因为它是最大的价值。当然,这可能只是我的代码的一个简单的改变,但我真的不明白。我应该改变什么?

谢谢!

+0

将打印移到循环外部,只捕捉循环中的最大值。 – NathanOliver

+1

@NathanOliver如果是这样,它只打印最后一次迭代。在设置'maxDist'之前设置为 – Viktoria

+0

,您可以与之前的值进行比较。只有在较高时才设置。然后在'for'循环之外打印它 – Nipun

回答

1

我认为你只需要在打印结束时移动打印。

for (int i = 0; i < diagonalPoints.size() - 1 /* need to stop before going off the end */; i++) { 
    if (diagonalPoints[i].x == diagonalPoints[i + 1].x) { 
     // same column, so calculate distance and compare 
     int dist = diagonalPoints[i + 1].y - diagonalPoints[i].y; 
     if (dist > maxDist) { 
      maxDist = dist; 
      maxDistColumn = diagonalPoints[i].x; 
      firstPt = diagonalPoints[i]; 
      secondPt = diagonalPoints[i + 1]; 
     } 
    } 
    else { 
     // new column, so print the maximum and reset 
     std::cout << maxDist << " in i: " << maxDistColumn << "\n"; 
     farestPoints = std::make_pair(firstPt, secondPt); 
     std::cout << farestPoints.first << ", " << farestPoints.second << " "; 
     maxDist = 0; 
    } 
} 

// after the loop, we still have the last column to print 
std::cout << maxDist << " in i: " << maxDistColumn << "\n"; 
farestPoints = std::make_pair(firstPt, secondPt); 
std::cout << farestPoints.first << ", " << farestPoints.second << " 
+0

谢谢,作品完美无瑕!没有真正理解它,把它放在'else'部分。 – Viktoria