代码之家  ›  专栏  ›  技术社区  ›  Viktoria

获得每次迭代的最大值

c++
  •  -2
  • Viktoria  · 技术社区  · 7 年前

    我有一个 cv::Mat mat std::vector<cv::Points> diagonalPoints 对于进一步的编码,在创建这些之后,这里变得很棘手 diagonalPoints 我遍历每列以获得两点之间的最大距离(对于每列,因此我比较 [i].x [i+1].x -见下文)。但是(!)经过计算,我会得到 每个 maxDist 对于比prevoius更大的列,而不是 一列中最大的一个 .

    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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Caleth    7 年前

    我认为您只需要将打印移到找到列结尾时即可。

    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 << "