C++ 在OpenCV中查找多边形边界内的平均颜色 背景

C++ 在OpenCV中查找多边形边界内的平均颜色 背景,c++,opencv,image-processing,C++,Opencv,Image Processing,我正在尝试创建一个实用程序,它将使用OpenCV返回给定多边形内的平均像素颜色。多边形将通过4个点定义,但不一定是矩形/正方形。例如,预计会有以下结构: A__________B A_______B / / \ \ / / \ \ D/__________/C D\_______\C 给定OpenCV中的cv::Mat图像和由点(a、B、C、D)定义的多边形。我知道点A

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

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

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


所做的研究 StackOverflow上的另一个建议是使用函数绘制轮廓,然后使用包围轮廓的边框。显然,我必须修改平均值计算,以便它使用函数绘制的多边形

非常感谢您的建议/关注

只需将函数与遮罩一起使用,其中遮罩是填充多边形

#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;
}
#包括
#包括
使用名称空间cv;
int main()
{
//创建一个左上角有灰色矩形的黑色图像
Mat1b img(300300,uchar(0));
矩形(img,Rect(0,0,100,100),标量(100),CV_填充);
//定义多边形
点分[1][4];
分数[0][0]=分(20,20);
分数[0][1]=分(40100);
分数[0][2]=分(200,60);
分数[0][3]=分(150,30);
常数点*点[1]={pts[0]};
int npoints=4;
//使用多边形创建遮罩
Mat1b掩模(img.rows,img.cols,uchar(0));
fillPoly(掩码、点和nPoint、1、标量(255));
//使用计算出的掩码计算平均值
标量平均值=平均值(img,掩码);

std::cout还注意到,在您链接的答案中,平均值不是在边界框上计算的,而是在多边形遮罩上计算的。边界框仅用于聚焦遮罩中多边形所在的部分(这可能是一个很好的优化)。因此,如果我有多个多边形,我想使用一个遮罩(一次一个),然后我会将
pts
变量填充到numPolygons,然后迭代每个多边形并为该多边形创建遮罩。对吗?理论上是的,但是我认为您不能在
fillPoly
中指定绘制第n个多边形。因此我认为最好同时用一个多边形填充
pts
,只画一个多边形到
fillPoly
。听起来不错。谢谢!@Jonathan,很高兴它能帮上忙!这种方法效率不是很低吗?多边形着色不是一件无关紧要的任务。此外,如果网格非常大,而多边形是一个小矩形,则通过索引和计算访问矩形中的所有值并不是更有效什么意思?