Как найти ограничивающий прямоугольник datamatrixes на изображении
В эти дни я пытаюсь написать код, который находит datamatrix, ограничивающий прямоугольники в изображении, чтобы затем я мог передать их некоторым библиотекам для декодирования. Я попытался изменить открытый cv-код python на c# отсюда (http://www.pyimagesearch.com/2014/11/24/detecting-barcodes-images-python-opencv/). но все еще есть проблема с матрицами данных, которые находятся так близко друг к другу. Как вы думаете, можно ли лучше определить их позиции:
Что я уже пробовал:
Bitmap bit = (Bitmap)pbCapture.BackgroundImage.Clone(); bit.Save("test1.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); bit.Dispose(); GC.Collect(); // Image<Bgr, Byte> img1 = new Image<Bgr, Byte>(bit); //An empty Mat can also be created by calling Mat img = null; //Open CV will automatically allocate memory for the Mat. You can also load an image from file using the CvInvoke.Imread function img = Emgu.CV.CvInvoke.Imread("test1.jpg",Emgu.CV.CvEnum.LoadImageType.AnyColor); //An empty Mat can also be created by calling Mat gray = new Mat(); //convert it to grayscale Emgu.CV.CvInvoke.CvtColor(img,gray, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray); // Emgu.CV.CvInvoke.Imshow("gray.jpg", gray); // Mat gradX = new Mat(); Mat gradY = new Mat(); Mat gradXSubGradY = new Mat(); Mat ScaledAbsGradient = new Mat(); Mat blurredScaledAbsGradient = new Mat(); Mat ThreasholdedBlurredScaledAbsGradient = new Mat(); Mat kernel = new Mat(); Mat closed = new Mat(); Mat eroded = new Mat(); Mat dilated = new Mat(); //compute the Scharr gradient magnitude representation of the images in both the x and y direction int dx= 1; int dy = 0; int ksize = -1; Emgu.CV.CvInvoke.Sobel(gray, gradX, Emgu.CV.CvEnum.DepthType.Cv32F,dx,dy, ksize); //gradX.Bitmap.Save("gradx.jpg",ImageFormat.Jpeg); Emgu.CV.CvInvoke.Imshow("gradx.jpg", gradX); // int dx2 = 0; int dy2 = 1; int ksize2 = -1; Emgu.CV.CvInvoke.Sobel(gray, gradY, Emgu.CV.CvEnum.DepthType.Cv32F, dx2, dy2, ksize2); //gradY.Bitmap.Save("grady.jpg", ImageFormat.Jpeg); Emgu.CV.CvInvoke.Imshow("gradY.jpg", gradY); //# subtract the y-gradient from the x-gradient Emgu.CV.CvInvoke.Subtract(gradX,gradY, gradXSubGradY); // //gradXSubGradY.Bitmap.Save("gradXSubGradY.jpg", ImageFormat.Jpeg); // Emgu.CV.CvInvoke.Imshow("gradXSubGradY.jpg", gradXSubGradY); // Emgu.CV.CvInvoke.ConvertScaleAbs( gradXSubGradY, ScaledAbsGradient,1,0); // Emgu.CV.CvInvoke.Imshow("ScaledAbsGradient.jpg", ScaledAbsGradient); // // blur and threshold the image System.Drawing.Size ksize3 = new System.Drawing.Size(9,9); Emgu.CV.CvInvoke.Blur(gradXSubGradY, blurredScaledAbsGradient, ksize3,new Point(-1,-1),Emgu.CV.CvEnum.BorderType.Default); Emgu.CV.CvInvoke.Imshow("blurredScaledAbsGradient.jpg", blurredScaledAbsGradient); // Emgu.CV.CvInvoke.Threshold(blurredScaledAbsGradient,ThreasholdedBlurredScaledAbsGradient,255,255,Emgu.CV.CvEnum.ThresholdType.Binary); Emgu.CV.CvInvoke.Imshow("ThreasholdedBlurredScaledAbsGradient.jpg", ThreasholdedBlurredScaledAbsGradient); // System.Drawing.Size ksize4 = new System.Drawing.Size(40, 40); kernel = Emgu.CV.CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Rectangle, ksize4, new System.Drawing.Point(-1,-1)); Emgu.CV.CvInvoke.Imshow("StructuringElement.jpg", kernel); Emgu.CV.CvInvoke.MorphologyEx(ThreasholdedBlurredScaledAbsGradient,closed,Emgu.CV.CvEnum.MorphOp.Close, kernel,new System.Drawing.Point(-1, -1) ,1,Emgu.CV.CvEnum.BorderType.Default, new MCvScalar()); Emgu.CV.CvInvoke.Imshow("closed.jpg", closed); // Emgu.CV.CvInvoke.Erode(closed, eroded,null,new System.Drawing.Point(-1,-1), 20, Emgu.CV.CvEnum.BorderType.Default, new MCvScalar()); Emgu.CV.CvInvoke.Imshow("eroded", eroded); Emgu.CV.CvInvoke.Dilate(eroded, dilated, null, new System.Drawing.Point(-1, -1),20, Emgu.CV.CvEnum.BorderType.Default, new MCvScalar()); Emgu.CV.CvInvoke.Imshow("dilated", dilated); // VectorOfVectorOfPoint contours=new VectorOfVectorOfPoint(); VectorOfVectorOfPoint contours2 = new VectorOfVectorOfPoint(); dilated.Save("hello.jpg"); // gradX.Dispose(); GC.Collect(); gradY.Dispose(); GC.Collect(); // gradXSubGradY.Dispose(); GC.Collect();