opencv三角面罩

时间:2018-10-02 14:03:41

标签: c++ opencv opencv3.0

我有这张图片

orginal image

我想创建一个转折蒙版以仅获得该区域

zone

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

result

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);

1 个答案:

答案 0 :(得分:0)

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

您的三角形是错误的

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

vector<Point> ptmask3;

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

您的图像是灰色的

您需要像这样正确初始化hide3

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