从四点绘制填充形状

时间:2015-10-07 16:07:15

标签: java opencv image-processing

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

3 个答案:

答案 0 :(得分:5)

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

enter image description here

答案 1 :(得分:1)

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

凸壳:

enter image description here

没有凸包:

enter image description here

这里是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> pts{Point(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;
}

答案 2 :(得分:0)

由于它是一个矩形,你可以从点和倾斜角度找到长度和宽度,然后绘制一个具有特定长度和宽度的矩形并倾斜矩形。