用OpenCVSharp 4.5 跑一遍OpenCV官方教程
原官方教程链接:OpenCV: Point Polygon Test
核心函数:pointPolygonTest
using System;
using OpenCvSharp;
namespace ConsoleApp1
{
class tutorial28 : ITutorial
{
public void Run()
{
int r = 100;
Mat src = Mat.Zeros(new Size(4 * r, 4 * r), MatType.CV_8UC1);
Point[] vert = new Point[6];
vert[0] = new Point(3 * r / 2, (int)(1.34 * r));
vert[1] = new Point(1 * r, 2 * r);
vert[2] = new Point(3 * r / 2, (int)(2.866 * r));
vert[3] = new Point(5 * r / 2, (int)(2.866 * r));
vert[4] = new Point(3 * r, 2 * r);
vert[5] = new Point(5 * r / 2, (int)(1.34 * r));
for (int i = 0; i < 6; i++)
{
Cv2.Line(src, vert[i], vert[(i + 1) % 6], new Scalar(255), 3);
}
Point[][] contours;
HierarchyIndex[] hierarchyIndices;
Cv2.FindContours(src, out contours, out hierarchyIndices, RetrievalModes.Tree, ContourApproximationModes.ApproxSimple);
Mat raw_dist = new Mat(src.Size(), MatType.CV_32F);
for (int i = 0; i < src.Rows; i++)
{
for (int j = 0; j < src.Cols; j++)
{
raw_dist.At<float>(i, j) = (float)Cv2.PointPolygonTest(contours[0], new Point2f((float)j, (float)i), true);
}
}
double minVal, maxVal;
Point minLoc, maxDistPt; // inscribed circle center
//MinMaxLoc(InputArray src, out double minVal, out double maxVal, out Point minLoc, out Point maxLoc, InputArray? mask = null);
Cv2.MinMaxLoc(raw_dist, out minVal, out maxVal, out minLoc, out maxDistPt);
minVal = Math.Abs(minVal);
maxVal = Math.Abs(maxVal);
Mat drawing = Mat.Zeros(src.Size(), MatType.CV_8UC3);
for (int i = 0; i < src.Rows; i++)
{
for (int j = 0; j < src.Cols; j++)
{
if (raw_dist.At<float>(i, j) < 0)
{
drawing.At<Vec3b>(i, j)[0] = (byte)(255 - Math.Abs(raw_dist.At<float>(i, j)) * 255 / minVal);
}
else if (raw_dist.At<float>(i, j) > 0)
{
drawing.At<Vec3b>(i, j)[2] = (byte)(255 - raw_dist.At<float>(i, j) * 255 / maxVal);
}
else
{
drawing.At<Vec3b>(i, j)[0] = 255;
drawing.At<Vec3b>(i, j)[1] = 255;
drawing.At<Vec3b>(i, j)[2] = 255;
}
}
}
Cv2.Circle(drawing, maxDistPt, (int)maxVal, new Scalar(255, 255, 255));
Cv2.ImShow("Source", src);
Cv2.ImShow("Distance and inscribed circle", drawing);
Cv2.WaitKey();
}
}
}