EmguCV

时间:2017-09-29 10:04:19

标签: c# .net opencv c#-4.0 emgucv

我目前正在扫描少量图像并将投资回报率存储在List中。现在我遍历列表并检查ROI中是否有条形码。它适用于少量图像,并在将mat转换为图像时将AccessViolationException投射到其他图像,并且它不会被捕获块捕获。

以下代码用于检查条形码是否存在。

List<Mat> subMats = new List<Mat>();

Mat mat = new Mat(image.Mat, enlargeROI(image.Mat,NEWRECTANGLE,PADDING));

subMats.Add(mat);


using (var mImage = new Image<Bgr, byte>(image.Width, image.Height))
                    {
                        var barcodeReader = new BarcodeReader();

                        foreach (var matt in subMats)
                        {
                            //TODO : check if the submat is a barcode                    
                            try
                            {

                                Image<Bgr, byte> img = matt.ToImage<Bgr, byte>(); // EXCEPTION THROWN AT THIS LINE

                                Bitmap bmp = img.ToBitmap();

                                if (barcodeReader.Decode(bmp) != null)
                                {
                                    CvInvoke.Rectangle(image, NEWRECTANGLE, new MCvScalar(0.0, 0.0, 0.0), -1);
                                }
                            }

                            catch (Exception e)
                            {
                                Console.WriteLine("**" + e.Message);
                            }
                        }
                    }

例外说

  

&#34;尝试读取或写入受保护的内存。这通常表明其他内存已损坏。&#34;

尝试使用下面的图片阅读,但它无法正确检测到条形码。

public static List<Rectangle> rois = new List<Rectangle>();
rois.Add(NEWRECTANGLE);


using (var mImage = image)
                    {

                        var barcodeReader = new BarcodeReader();

                        int count = 0;
                        foreach (var roi in rois)
                        {
                            //TODO : check if the submat is a barcode                    
                            try
                            {
                                mImage.ROI = roi;

                                Bitmap bmp = mImage.ToBitmap();

                                if (barcodeReader.Decode(bmp) != null)
                                {
                                    CvInvoke.Rectangle(image, NEWRECTANGLE, new MCvScalar(0.0, 0.0, 0.0), -1);
                                }
                            }

                            catch (Exception e)
                            {
                                Console.WriteLine("**" + e.Message);
                            }
                        }
                    }

可能出现什么问题?任何帮助,将不胜感激。

感谢。

修改

我通过查找轮廓来确定所有投资回报率。在整个轮廓中循环,我找到了矩形并将它们存储在List

 CvInvoke.FindContours(fullGrad, contours, null, Emgu.CV.CvEnum.RetrType.List, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxNone);


                for (int i = 0; i < contours.Size; i++)
                {

                    if (CvInvoke.ContourArea(contours[i]) < 2000) {

                        continue;
                    }

                    RotatedRect RECT = CvInvoke.MinAreaRect(contours[i]);

                    PointF[] VERTIXES = RECT.GetVertices();

                            int X = (int)VERTIXES[1].X;
                            int Y = (int)VERTIXES[2].Y;
                            //OBTAIN RECTANGLE THAT SURROUNDS THE DETECTED CONTOUR
                            int WIDTH = (int)(VERTIXES[3].X - VERTIXES[1].X);
                            int HEIGHT = (int)(VERTIXES[0].Y - VERTIXES[2].Y);

                            Rectangle NEWRECTANGLE = new Rectangle(X, Y, WIDTH, HEIGHT);

                    Mat mat = new Mat(image.Mat, enlargeROI(image.Mat,NEWRECTANGLE,PADDING));

                    subMats.Add(mat);

0 个答案:

没有答案