F.moghaddampoor Ответов: 0

Как найти ограничивающий прямоугольник 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();

0 Ответов