#c# #algorithm #opencv #image-processing #emgucv
#c# #алгоритм #opencv #обработка изображений #emgucv
Вопрос:
Я создаю проект по определению формы с помощью emgu CV, но проблема в том, что в последней версии, которая составляет 4.5.4.4788, похоже, нет ссылки на растровое изображение. Я использовал AsBitmap и ToBitmap, но это все равно ошибка. Вот код ниже. Единственная ошибка в том, что он не преобразует его в растровое изображение. Пакеты, которые я использовал, — это Emgu.CV, растровое изображение Emgu.CV и пользовательский интерфейс Emgu.CV.
using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Diagnostics; using Emgu.CV; using Emgu.CV.Structure; using Emgu.CV.Util; namespace npr { public partial class Form1 : Form { Imagelt;Bgr, bytegt; imgInput; public Form1() { InitializeComponent(); } private void btnOpen_Click(object sender, EventArgs e) { try { OpenFileDialog dialog = new OpenFileDialog(); if (dialog.ShowDialog() == DialogResult.OK) { imgInput = new Imagelt;Bgr, bytegt;(dialog.FileName); pictureBox1.Image = imgInput.Bitmap; } } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void button2_Click(object sender, EventArgs e) { if (imgInput == null) { return; } try { var temp = imgInput.SmoothGaussian(5).Convertlt;Gray, bytegt;().ThresholdBinaryInv(new Gray(230), new Gray(255)); VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint(); Mat m = new Mat(); CvInvoke.FindContours(temp, contours, m, Emgu.CV.CvEnum.RetrType.External, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple); for (int i = 0; i lt; contours.Size; i ) { double perimeter = CvInvoke.ArcLength(contours[i], true); VectorOfPoint approx = new VectorOfPoint(); CvInvoke.ApproxPolyDP(contours[i], approx, 0.04 * perimeter, true); CvInvoke.DrawContours(imgInput, contours, i, new MCvScalar(0, 0, 255), 2); //moments center of the shape var moments = CvInvoke.Moments(contours[i]); int x = (int)(moments.M10 / moments.M00); int y = (int)(moments.M01 / moments.M00); if (approx.Size == 3) { CvInvoke.PutText(imgInput, "Triangle", new Point(x, y), Emgu.CV.CvEnum.FontFace.HersheySimplex, 0.5, new MCvScalar(0, 0, 255), 2); } if (approx.Size == 4) { Rectangle rect = CvInvoke.BoundingRectangle(contours[i]); double ar = (double)rect.Width / rect.Height; if (ar gt;= 0.95 amp;amp; arlt;=1.05) { CvInvoke.PutText(imgInput, "Square", new Point(x, y), Emgu.CV.CvEnum.FontFace.HersheySimplex, 0.5, new MCvScalar(0, 0, 255), 2); } else { CvInvoke.PutText(imgInput, "Rectangle", new Point(x, y), Emgu.CV.CvEnum.FontFace.HersheySimplex, 0.5, new MCvScalar(0, 0, 255), 2); } } if (approx.Size == 6) { CvInvoke.PutText(imgInput, "Hexagon", new Point(x, y), Emgu.CV.CvEnum.FontFace.HersheySimplex, 0.5, new MCvScalar(0, 0, 255), 2); } if (approx.Size gt; 6) { CvInvoke.PutText(imgInput, "Circle", new Point(x, y), Emgu.CV.CvEnum.FontFace.HersheySimplex, 0.5, new MCvScalar(0, 0, 255), 2); } pictureBox2.Image = imgInput.Bitmap; } } catch (Exception ex) { MessageBox.Show(ex.Message); } } } }
Комментарии:
1. Вы уверены
BitmapExtension
, что установили?AsBitmap
иToBitmap
определены в этом классе, вы можете проверить в обозревателе объектов.