У меня проблема, мне нужно найти рисунок на изображении, но я не могу использовать System.Drawing, так как он вступает в конфликт с mono.android.Я использую его только при применении морфологической операции и при попытке найти контуры.Как я могу избежать их использования?
Я уже пытался заменить System.Drawing Points системой System.Windows и android.graphics.point, но я не получил результатов.
Код: '' '
static void Main(string[] args)
{
Mat img = CvInvoke.Imread("C:\\Users\\franc\\Desktop\\VP\\1.jpg",
Emgu.CV.CvEnum.ImreadModes.AnyColor);
UMat uimage = new UMat();
CvInvoke.CvtColor(img, uimage, ColorConversion.Bgr2Gray);
UMat pyrDown = new UMat();
double cannyThresholdLinking = 20; //def 120.0
double cannyThreshold = 300; //def 180.0
UMat cannyEdges = new UMat();
CvInvoke.Canny(uimage, cannyEdges, cannyThreshold,
cannyThresholdLinking);
Matrix<byte> kernel2 = new Matrix<byte>(new Byte[3, 3] { { 0, 1, 0
}, { 1, 0, 1 }, { 0, 1, 0 } });
UMat opened = new UMat();
CvInvoke.MorphologyEx(cannyEdges, opened, MorphOp.Dilate, kernel2,
new Point(-1, -1), 1, BorderType.Default, new MCvScalar());
//ImageViewer.Show(opened);
UMat inverted = new UMat();
CvInvoke.BitwiseNot(opened, inverted, null);
//ImageViewer.Show(inverted);
UMat labels = new UMat();
CvInvoke.ConnectedComponents(inverted, labels,
LineType.EightConnected);
LineSegment2D[] lines = CvInvoke.HoughLinesP(inverted, 1, Math.PI /
45.0, 20, 30, 10);
List<RotatedRect> boxList = new List<RotatedRect>();
using (VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint())
{
CvInvoke.FindContours(inverted, contours, null, RetrType.List, ChainApproxMethod.ChainApproxSimple);
//CvInvoke.FindContours(cannyEdges, contours, null, RetrType.List, ChainApproxMethod.ChainApproxSimple);
int count = contours.Size;
for (int i = 0; i < count; i++)
{
using (VectorOfPoint contour = contours[i])
using (VectorOfPoint approxContour = new VectorOfPoint())
{
CvInvoke.ApproxPolyDP(contour, approxContour, CvInvoke.ArcLength(contour, true) * 0.05, true);
if (CvInvoke.ContourArea(approxContour, false) > 50) //only consider contours with area greater than 250
{
if (approxContour.Size == 4) //The contour has 4 vertices.
{
#region
bool isRectangle = true;
Point[] pts = approxContour.ToArray();
LineSegment2D[] edges = PointCollection.PolyLine(pts, true);
for (int j = 0; j < edges.Length; j++)
{
double angle = Math.Abs(
edges[(j + 1) % edges.Length].GetExteriorAngleDegree(edges[j]));
if (angle < 80 || angle > 100)
{
isRectangle = false;
break;
}
}
if (isRectangle) boxList.Add(CvInvoke.MinAreaRect(approxContour));
}
}
}
}
}
#endregion
' ''