答案 0 :(得分:3)
你可以这样做:
找到黄色多边形
不幸的是,您使用消除锯齿来绘制黄线,因此黄色不是纯黄色,而是由于插值而具有更宽的范围。这也影响最终结果,因为一些非黄色像素将包含在结果图像中。您可以通过不使用抗锯齿来轻松纠正此问题。
因此,最好的选择是转换HSV空间中的图像(它可以更容易地分割单个颜色),并且只保留纯黄色范围内的值。
如果您不使用抗锯齿,您甚至不需要转换为HSV,只需保留其值为纯黄色的点。
填充多边形内部
您可以使用floodFill
填充多边形。你需要一个起点。由于我们不知道一个点是否在多边形内部(并且由于多边形不是凸面而使得中心可能不安全),我们可以安全地假设点(0,0),即左上角图像的一角在多边形之外。然后我们可以填充多边形的外部,然后反转结果。
仅将多边形内部复制到黑色初始化图像
获得蒙版后,只需使用带有该蒙版的copyTo
即可在黑色图像上复制蒙版中非零像素下的内容。
这里是完整的代码:
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
Mat3b img = imread("path_to_image");
// Convert to HSV color space
Mat3b hsv;
cvtColor(img, hsv, COLOR_BGR2HSV);
// Get yellow pixels
Mat1b polyMask;
inRange(hsv, Scalar(29, 220, 220), Scalar(31, 255, 255), polyMask);
// Fill outside of polygon
floodFill(polyMask, Point(0, 0), Scalar(255));
// Invert (inside of polygon filled)
polyMask = ~polyMask;
// Create a black image
Mat3b res(img.size(), Vec3b(0,0,0));
// Copy only masked part
img.copyTo(res, polyMask);
imshow("Result", res);
waitKey();
return 0;
}
结果:
备注强>
请注意,结果图像中几乎有黄色像素。这是由于抗锯齿,如上所述。