Calculate mean for vector of points

后端 未结 4 2133
甜味超标
甜味超标 2021-02-09 00:16

I have a vector of a 2-dimensional points in OpenCV

std::vector points;

I would like to calculate the mean values for x and

相关标签:
4条回答
  • 2021-02-09 00:31

    InputArray does a good job here. You can simply call

    cv::Mat mean_;
    cv::reduce(points, mean_, 01, CV_REDUCE_AVG);
    // convert from Mat to Point - there may be even a simpler conversion, 
    // but I do not know about it.
    cv::Point2f mean(mean_.at<float>(0,0), mean_.at<float>(0,1)); 
    

    Details:

    In the newer OpenCV versions, the InputArray data type is introduced. This way, one can send as parameters to an OpenCV function either matrices (cv::Mat) either vectors. A vector<Vec3f> will be interpreted as a float matrix with three channels, one row, and the number of columns equal to the vector size. Because no data is copied, this transparent conversion is very fast.

    The advantage is that you can work with whatever data type fits better in your app, while you can still use OpenCV functions to ease mathematical operations on it.

    0 讨论(0)
  • 2021-02-09 00:37

    You can use stl's std::accumulate as follows:

    cv::Point2f sum = std::accumulate(
        points.begin(), points.end(), // Run from begin to end
        cv::Point2f(0.0f,0.0f),       // Initialize with a zero point
        std::plus<cv::Point2f>()      // Use addition for each point (default)
    );
    cv::Point2f mean = sum / points.size(); // Divide by count to get mean
    
    0 讨论(0)
  • 2021-02-09 00:40

    Add them all up and divide by the total number of points.

    0 讨论(0)
  • 2021-02-09 00:48

    Since OpenCV's Point_ already defines operator+, this should be fairly simple. First we sum the values:

    cv::Point2f zero(0.0f, 0.0f);
    
    cv::Point2f sum  = std::accumulate(points.begin(), points.end(), zero);
    

    Then we divide to get the average:

    Point2f mean_point(sum.x / points.size(), sum.y / points.size());
    

    ...or we could use Point_'s operator*:

    Point2f mean_point(sum * (1.0f / points.size()));
    

    Unfortunately, at least as far as I can see, Point_ doesn't define operator /, so we need to multiply by the inverse instead of dividing by the size.

    0 讨论(0)
提交回复
热议问题