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();
Mat img = null;
img = Emgu.CV.CvInvoke.Imread("test1.jpg",Emgu.CV.CvEnum.LoadImageType.AnyColor);
Mat gray = new Mat();
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();
int dx= 1;
int dy = 0;
int ksize = -1;
Emgu.CV.CvInvoke.Sobel(gray, gradX, Emgu.CV.CvEnum.DepthType.Cv32F,dx,dy, ksize);
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);
Emgu.CV.CvInvoke.Imshow("gradY.jpg", gradY);
Emgu.CV.CvInvoke.Subtract(gradX,gradY, gradXSubGradY);
Emgu.CV.CvInvoke.Imshow("gradXSubGradY.jpg", gradXSubGradY);
Emgu.CV.CvInvoke.ConvertScaleAbs( gradXSubGradY, ScaledAbsGradient,1,0);
Emgu.CV.CvInvoke.Imshow("ScaledAbsGradient.jpg", ScaledAbsGradient);
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();