入力: 下の図に示すように、xy 平面に 50000 個のポイントがあります。
ここで、三角形の ROI 内のすべての可能なポイントを取得する必要があります。入手方法。opencv または Matlab を使用できます。
以下は、三角形の領域の可能なポイントを取得する必要があるサンプルです。
MATLAB にはinpolygon
コマンドinpolygonがあります。
たとえば、このコード
xv = [0.1 0.4 0.15 0.1]; yv = [0 0.4 0.8 0];
x = rand(250,1); y = rand(250,1);
in = inpolygon(x,y,xv,yv);
plot(xv,yv,x(in),y(in),'r+',x(~in),y(~in),'bo')
次のような画像を生成します。
このようなもの、C ++で?
Mat plane = imread("plane.png"); // this is the 50 000 pixel plane image
// I assume your triangles are here. E.e. findContours function would save them here, but I don't know your situation.
vector<vector<Point> > triangles;
// this size is something like 1000, so here are only points that should be checkedd if they are inside some triangle
vector<Point> points;
// lets loop all rois and check if point is inside one of them
for (int j = 0; j < triangles.size(); j++) {
for (int i = 0; i < points.size(); i++) {
double test = pointPolygonTest(trigangles[j], points[i] false);
if (test < 0) {
cout << " point " << points[i] << " is outside of triangle " << j << endl;
} else if (test > 0) {
cout << " point " << points[i] << " is inside of triangle " << j << endl;
} else if (test == 0) {
cout << " point " << points[i] << " is on edge of triangle " << j << endl;
}
}
}
ここに OpenCV の例があります: http://docs.opencv.org/trunk/doc/tutorials/imgproc/shapeescriptors/point_polygon_test/point_polygon_test.html
OpenCVでは、各三角形の最小外接長方形にないポイントをすばやく除外できます。この長方形は、以前は手動またはcv :: boundingRect()を使用して計算できます。ヒットテストはRect::contains()で行われます。これは高速な操作であり(少なくともcv :: pointPolygonTestよりもはるかに高速です)、これにより、明らかに三角形に含まれていないポイントが除外されます。その後、cv :: pointPolygonTest()を使用してフィルターを通過するポイントをテストします。
あれは:
std::vector<cv::Point> pointList;
std::vector<cv::Rect> rectList;
std::vector<std::vector<Point>> triangleList;
for (int pointIndex = 0; pointIndex < pointList.size(); pointIndex++)
{
for (int rectIndex = 0; rectIndex < rectList.size(); rectIndex++)
{
if (!rectList[rectIndex].contains(pointList[pointIndex]))
continue;
if (cv::pointPolygonTest(triangleList[rectIndex], pointList[pointIndex], false) < 0)
continue;
/* TODO Mark the point for future use */
}
}