带有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<cv::Point> 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的三角形蒙版的主要内容,如果未能解决你的问题,请参考以下文章