Xamarin EmguCv v4.2
Сап, пишу диплом на тему мобилок на Xamarin VisualStudio2019, никогда раньше с мобильной разработкой не сталкивался, C# также совсем недавно начал учить, столкнулся со следующей проблемой: в Windows.Form спокойно подключаю пакет EmguCV и определяю контура фигур на рисунке, но мне по условию нужно сделать мобилку для определения бланка с тестами, так что для начала решил перенести с вин-формы на Xamarin.Form, но тут столкнулся со множеством сложностей, т.к.: для использования преобразования из Image в Image в десктопе использовал .Bitmap на версии Emgu 4.1, на версии 4.2 такое преобразование уже не работает, но в Xamarin просто не устанавливается пакет Emgu ниже 4.2, т.е. просто никак не могу сначала преобразовать с помощью .Bitmap полученное с камеры изображение, а затем снова его преобразовать обратно и вывести на экран.
У меня есть по отдельности десктопная апча для распознания фигур и мобильная апча для вывода фото на экран (оба кода не мои, нашёл на просторах интернета), но объединить их Я никак не могу
Windows.Form:
using System;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
namespace ShapeRecognision
{
public partial class Form1 : Form
{
private Image<Bgr, byte> inputImage = null;
public Form1()
{
InitializeComponent();
}
private void открытьToolStripMenuItem_Click(object sender, EventArgs e)
{
DialogResult res = openFileDialog1.ShowDialog();
if (res == DialogResult.OK)
{
inputImage = new Image<Bgr, byte>(openFileDialog1.FileName);
pictureBox1.Image = inputImage.Bitmap;
}
else
MessageBox.Show("hey");
}
private void найтиФигурыToolStripMenuItem_Click(object sender, EventArgs e)
{
Image<Gray, byte> grayImage = inputImage.SmoothGaussian(5).Convert<Gray, byte>().ThresholdBinaryInv(new Gray(230), new Gray(255));
VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
Mat hierarchy = new Mat();
CvInvoke.FindContours(grayImage, contours, hierarchy, Emgu.CV.CvEnum.RetrType.External, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);
for (int i = 0; i < contours.Size; i++)
{
double perimeter = CvInvoke.ArcLength(contours[i], true);
VectorOfPoint approximation = new VectorOfPoint();
CvInvoke.ApproxPolyDP(contours[i], approximation, 0.04 * perimeter, true);
CvInvoke.DrawContours(inputImage, contours, i, new MCvScalar(0, 0, 255), 2);
pictureBox2.Image = inputImage.Bitmap;
}
}
}
}
Xamarin.Forms:
using Plugin.Media;
using Plugin.Media.Abstractions;
using System;
using Xamarin.Forms;
namespace CameraApp
{
public partial class MainPage : ContentPage
{
public MainPage()
{
//InitializeComponent();
Button takePhotoBtn = new Button { Text = "Сделать фото" };
Button getPhotoBtn = new Button { Text = "Выбрать фото" };
Image img = new Image();
// выбор фото
getPhotoBtn.Clicked += async (o, e) =>
{
if (CrossMedia.Current.IsPickPhotoSupported)
{
MediaFile photo = await CrossMedia.Current.PickPhotoAsync();
img.Source = ImageSource.FromFile(photo.Path);
}
};
// съемка фото
takePhotoBtn.Clicked += async (o, e) =>
{
if (CrossMedia.Current.IsCameraAvailable && CrossMedia.Current.IsTakePhotoSupported)
{
MediaFile file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
{
SaveToAlbum = true,
Directory = "Sample",
Name = $"{DateTime.Now.ToString("dd.MM.yyyy_hh.mm.ss")}.jpg"
});
if (file == null)
return;
img.Source = ImageSource.FromFile(file.Path);
}
};
Content = new StackLayout
{
HorizontalOptions = LayoutOptions.Center,
Children = {
new StackLayout
{
Children = {takePhotoBtn, getPhotoBtn},
Orientation =StackOrientation.Horizontal,
HorizontalOptions = LayoutOptions.CenterAndExpand
},
img
}
};
}
}
}
хелпаниет плез, а то уже с ума начинаю сходить от того, что просто нигде не могу найти подходящую инфу. Может, мне и не стоит для этого вовсе юзать Emgu, а какой-нить другой способ, про который Я не в курсе