在 OpenCV 中查找多边形边界内的平均颜色

Posted

技术标签:

【中文标题】在 OpenCV 中查找多边形边界内的平均颜色【英文标题】:Finding the Average Color within a Polygon Bound in OpenCV 【发布时间】:2015-09-08 20:23:57 【问题描述】:

背景

我正在尝试创建一个实用程序,该实用程序将使用OpenCV 返回给定多边形内的平均像素颜色。多边形将通过 4 个点定义,但不一定是矩形/正方形。例如,预期会出现以下结构:

     A__________B    A_______B
    /          /     \       \
   /          /       \       \
 D/__________/C       D\_______\C

给定 OpenCV 中的cv::Mat 图像和由点(A、B、C、D)定义的多边形。我知道点 A、B、C 和 D,但我想计算多边形内的平均像素颜色。我想从 OpenCV 社区获得一些关于如何最有效地做到这一点的建议。


研究完成

*** 上的另一个 post 建议使用 drawContours 函数绘制轮廓,然后使用轮廓周围的边界矩形的 mean。我显然必须修改平均计算,以便它使用fillPoly 函数绘制的多边形。

非常感谢您提出建议/疑虑!

【问题讨论】:

另请注意,在您链接的答案中,平均值不是在边界框上计算的,而是在多边形蒙版上计算的。边界框仅用于关注多边形真正所在的蒙版部分(这可能是一个很好的优化)。 【参考方案1】:

您可以简单地将 mean 函数与蒙版一起使用,其中蒙版是您的填充多边形。

#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;

int main()

    // Create a black image with a gray rectangle on top left
    Mat1b img(300, 300, uchar(0));
    rectangle(img, Rect(0, 0, 100, 100), Scalar(100), CV_FILLED);

    // Define a polygon
    Point pts[1][4];
    pts[0][0] = Point(20, 20);
    pts[0][1] = Point(40, 100);
    pts[0][2] = Point(200, 60);
    pts[0][3] = Point(150, 30);

    const Point* points[1] = pts[0];
    int npoints = 4;

    // Create the mask with the polygon
    Mat1b mask(img.rows, img.cols, uchar(0));
    fillPoly(mask, points, &npoints, 1, Scalar(255));

    // Compute the mean with the computed mask
    Scalar average = mean(img, mask);

    std::cout << average << std::endl;

    return 0;

【讨论】:

因此,如果我有多个多边形我想使用询问一个蒙版(一次一个),那么我会将 pts 变量填充到 numPolygons,然后遍历每个多边形并为该多边形创建蒙版。对吗? 理论上是的,但是我认为您不能在fillPoly 中指定绘制第n 个多边形。所以我认为最好用一个多边形填充pts,然后只将那个多边形绘制到fillPoly中。 听起来不错。谢谢! @Jonathan 很高兴它有帮助! 这种做法不是很低效吗?为多边形着色并不是一项微不足道的任务。此外,如果 Mat 非常大并且多边形一个小矩形不是更有效地通过索引访问矩形中的所有值并计算平均值?

以上是关于在 OpenCV 中查找多边形边界内的平均颜色的主要内容,如果未能解决你的问题,请参考以下文章

多边形地图中的边框颜色显示 MatLab

OpenCV 例程200篇223. 特征提取之多边形拟合(cv.approxPolyDP)

OpenCV 例程200篇223. 特征提取之多边形拟合(cv.approxPolyDP)

OpenCV:如何混合多个不同颜色的半透明多边形?

MKPolygon 中的邮政编码

查找给定多边形 w.r.t 的两个“边界”顶点。已知(光源)点