我有四分(在图像处理后从扑克牌中取出)我想用绿色面具覆盖那张卡片的表面。所以我正在寻找一种方法来绘制一个基本上在这四个点之间有直线的形状,然后用绿色填充形状的中间。我试图使用OpenCV来完成任务,但是矩形方法只需要两个点(所以除非卡完全对齐,否则掩码覆盖周围区域或卡片不够),fillPoly方法没有效果(尽管我可以如果需要,发布代码)。有关方法的任何建议吗?
答案 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) );
答案 1 :(得分:1)
您可以使用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> 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)
由于它是一个矩形,你可以从点和倾斜角度找到长度和宽度,然后绘制一个具有特定长度和宽度的矩形并倾斜矩形。