从四个点绘制填充形状

Posted

技术标签:

【中文标题】从四个点绘制填充形状【英文标题】:Draw Filled Shape from Four Points 【发布时间】:2015-10-07 16:07:14 【问题描述】:

我有四个点(取自一张经过图像处理的扑克牌),我想用绿色蒙版覆盖那张牌的表面。所以我正在寻找一种方法来绘制一个在这四个点之间基本上有直线的形状,然后用绿色填充形状的中间。我试图使用 OpenCV 来完成任务,但是矩形方法只需要两个点(所以除非卡片完全对齐,否则掩码覆盖周围区域或卡片不够),而 fillPoly 方法没有效果(虽然我可以如果需要,请发布代码)。对完成这项工作的方法有什么建议吗?

【问题讨论】:

有一个drawContours函数,你也可以画填充 【参考方案1】:

@Miki 答案的补充:

您也可以使用fillConvexPoly 获得相同的结果

Mat img = Mat::zeros( 200, 200, CV_8UC3 );
Point pts[4] = Point(10,20),Point(60,20),Point(180,130),Point(60,150);
fillConvexPoly( img, pts, 4, Scalar(0,255,0) );

【讨论】:

【参考方案2】:

你可以使用drawContours,但是你需要注意点的顺序。您可以计算点上的凸包。

带凸包:

没有凸包:

这里是 C++ 代码,但您可以轻松移植到 Java,因为它都是 OpenCV 函数调用:

#include <opencv2\opencv.hpp>
#include <vector>
using namespace cv;

int main(void)

    // Some image
    Mat3b img(200, 200, Vec3b(0, 0, 0));

    vector<Point> ptsPoint(10,20), Point(60,20), Point(60,150), Point(180, 130);
    vector<Point> hull;
    convexHull(pts, hull);

    vector<vector<Point>> dummy(1, pts);
    drawContours(img, dummy, 0, Scalar(0,255,0), CV_FILLED);

    imshow("Result", img);
    waitKey();

    return 0;

【讨论】:

【参考方案3】:

既然是一个矩形,你可以从倾斜的点和角度找到长度和宽度,然后用这些特定的长度和宽度绘制一个矩形并倾斜矩形。

【讨论】:

唯一的问题是我使用的是 OpenCV 工具,所以角点可能不是一个完美的矩形。没有一个工具可以在坐标之间画线并填充中间的空间吗? fillPoly 可以做到这一点,但它必须是一个多边形。 矩形不是多边形吗? ;) 在尝试用fillPoly 画之前我是这么想的! :D

以上是关于从四个点绘制填充形状的主要内容,如果未能解决你的问题,请参考以下文章

用渐变(或纯色)填充特定的可绘制矢量

星月图标制作

如何绘制不同颜色的填充路径/形状

当使用洪水填充算法填充颜色后绘制线条时,填充颜色消失

CAD参数绘制填充(网页版)

达到边界颜色时,填充无法填充整个形状?