Click here to Skip to main content
15,890,512 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
These days Im trying to write a code which find datamatrix bounding rectangles in an image so then i can give them to some libraries for decoding. I have tried to change a python open cv code to c# from here (http://www.pyimagesearch.com/2014/11/24/detecting-barcodes-images-python-opencv/). but still have problem with data matrixes which are so close together. How do you think its possible to detect their positions in a better way:

What I have tried:

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();
Posted

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900