带有opencv的三角形蒙版

Posted

技术标签:

【中文标题】带有opencv的三角形蒙版【英文标题】:triangle mask with opencv 【发布时间】:2018-10-02 14:03:40 【问题描述】:

我有这张图片

我想创建一个 tranigle 蒙版来只获取这个区域

但是使用以下代码我得到了这个结果

Moments mu = moments(red,true);
Point center;
center.x = mu.m10 / mu.m00;
center.y = mu.m01 / mu.m00;
circle(red, center, 2, Scalar(0, 0, 255));
cv::Size sz = red.size();
int imageWidth = sz.width;
int imageHeight = sz.height;
Mat mask3(red.size(), CV_8UC1, Scalar::all(0));
// Create Polygon from vertices
vector<Point> ptmask3(3);
ptmask3.push_back(Point(imageHeight-1, imageWidth-1));
ptmask3.push_back(Point(center.x, center.y));
ptmask3.push_back(Point(0, red.rows - 1));

vector<Point> pt;

approxPolyDP(ptmask3, pt, 1.0, true);

// Fill polygon white
fillConvexPoly(mask3, &pt[0], pt.size(), 255, 8, 0);

// Create new image for result storage
Mat hide3(red.size(), CV_8UC3);


// Cut out ROI and store it in imageDest
red.copyTo(hide3, mask3);

imshow("mask3", hide3);

【问题讨论】:

请提供正确的minimal reproducible example(以后请记住这一点,因此我们不需要对每个问题都进行提醒)。以这种方式看待它 - 您要求某人免费帮助您,但首先您希望他们浪费时间填写所有空白(您可以轻松提供),因此他们甚至可以编译代码。此外,这通常涉及大量猜测,因此我们甚至可能不会得到与您相同的结果——基于此得到正确答案类似于在黑暗中射击。 明显错误:std::vector&lt;cv::Point&gt; ptmask3(3); 创建具有 3 个值点的向量 (0,0)。然后你push_back 3 个额外的点,总共 6 个。既然你在谈论三角形,你可能只想要你 push_back 的 3 个点,而不是默认构造的点(在大多数情况下,这会将你的三角形变成四边形)。 @DanMašek 抱歉,这是我第一次在这里提问,非常感谢,我已经解决了 没问题。确保添加创建加载输入并计算red 的代码部分。这是缺少的最重要的位(除了包括,using namespace 语句 - 即使我会 rather not see those 和 main 的开头/结尾。) 【参考方案1】:

更新版本(在 Dan Mašek 的帮助下)

你的三角形错了

这是因为您正在初始化大小为 3 的向量,然后将另外三个点放入其中,总共有 6 个点,其中三个具有默认值。试试这个:

vector<Point> ptmask3;

另外,请确保点的坐标正确。您希望在左下角有一个点,但您当前的三角形似乎没有这样的点。

你的图片是灰色的

你需要正确初始化hide3,像这样:

cv::Mat hide3(img.size(), CV_8UC3, cv::Scalar(0));

【讨论】:

OP 在单通道输入图像上调用fillConvexPoly,以255 的强度绘制——这是一个尽可能白的矩形,并且考虑到它是一个蒙版,选择对应的ROI,是正确的。 | cv::Scalar 将从整数隐式构造(OP 的代码相当于使用 cv::Scalar(255,0,0,0),这正是这里所需要的)。 部分输出图像是灰色的,因为hide3 的值没有初始化为任何特定值。对cv::Mat hide3(img.size(), CV_8UC3, cv::Scalar(0)); 的简单更改可以解决该问题。在这种情况下,对多通道图像使用单通道掩码非常合适。 根据我对该问题的第二条评论,我也很确定缺少的区域是由于添加到 ptmask3 的额外分数。 |很抱歉把你的回答撕成这样:) 请随时根据我的 cmets 更新它,因为在有合适的minimal reproducible example 可用之前,我不会写任何东西。 @DanMašek 感谢您的意见。看起来我的 OpenCV 知识比我还生疏!我现在也没有任何可访问的安装,但是正如您所提到的,无论如何都没有完整的示例来重现该问题。看来我今天学到了一三件事。 :)

以上是关于带有opencv的三角形蒙版的主要内容,如果未能解决你的问题,请参考以下文章

[OpenCV实战]31 使用OpenCV将一个三角形仿射变换到另一个三角形

在视网膜 iPad 上应用图层蒙版会隐藏所有

使用 OpenCV 进行三角形检测

如何使用 Opencv 检测三角形交通标志

从捕获的帧中裁剪三角形 - OpenCV 和 C++

OpenCV-几何形状颜色识别 #导入MD文档图片#