【发布时间】: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_back3 个额外的点,总共 6 个。既然你在谈论三角形,你可能只想要你 push_back 的 3 个点,而不是默认构造的点(在大多数情况下,这会将你的三角形变成四边形)。 -
@DanMašek 抱歉,这是我第一次在这里提问,非常感谢,我已经解决了
-
没问题。确保添加创建加载输入并计算
red的代码部分。这是缺少的最重要的位(除了包括,using namespace语句 - 即使我会 rather not see those 和main的开头/结尾。)