Beispiel #1
0
        //////////////////////////////////////////////////////////////////////////////
        //  IPRun() - The thread function IPRun performs the image processing.
        //            It waits for the grabbing thread to indicate a new image in the
        //            image list. After calling the operator FindDataCode2D, the
        //            result values are stored in the ResultContainer instance
        //            resultData, which can be entered only after the previous result
        //            values were displayed (containerIsFree-event).
        //////////////////////////////////////////////////////////////////////////////
        public void IPRun()
        {
            // -------------------  INIT ----------------

            HDataCode2D reader = new HDataCode2D("Data Matrix ECC 200",
                                                 new HTuple(), new HTuple());

            reader.SetDataCode2dParam("default_parameters", "enhanced_recognition");

            // -----------  WAIT FOR EVENTS  ---------------

            while (newImgEvent.WaitOne())
            {
                newImgMutex.WaitOne();             // CriticalSect
                HImage image = (HImage)imgList[0]; // CriticalSect
                imgList.Remove(image);             // CriticalSect
                newImgMutex.ReleaseMutex();        // CriticalSect

                HTuple t1 = HSystem.CountSeconds();

                HTuple decodedDataStrings, resultHandle;

                HXLD symbolXLDs = reader.FindDataCode2d(image, new  HTuple(),
                                                        new HTuple(), out resultHandle, out decodedDataStrings);

                HTuple t2 = HSystem.CountSeconds();

                containerIsFreeEvent.WaitOne();
                resultDataMutex.WaitOne();                    // CriticalSect
                resultData.timeNeeded   = (1000 * (t2 - t1)); // CriticalSect
                resultData.decodedData  = decodedDataStrings; // CriticalSect
                resultData.resultImg    = image;              // CriticalSect
                resultData.resultHandle = resultHandle;       // CriticalSect
                resultData.symbolData   = symbolXLDs;         // CriticalSect
                containerIsFreeEvent.Reset();                 // CriticalSect
                resultDataMutex.ReleaseMutex();               // CriticalSect
                newResultEvent.Set();

                mainForm.Invoke(delegateDisplay);

                if (delegatedStopEvent.WaitOne(0, true))
                {
                    break;
                }
            }
            // --------  RESET/CLOSE ALL HANDLES  ---------

            mainForm.threadAcq.Join();
            mainForm.Invoke(delegateControlReset);

            reader.Dispose();

            newResultEvent.Reset();

            return;
        }
        public override VisionResult Detected(VisionImage image, Dictionary <string, VisionResult> Result = null, VisionFlow parent = null, Shape newRoi = null)
        {
            VisionResult rtn = new VisionResult();

            rtn.State = VisionResultState.WaitCal;
            if (ROI == null || image == null)
            {
                rtn.State = VisionResultState.NG;
                return(rtn);
            }

            try
            {
                using (VisionImage temp = new VisionImage())
                {
                    var roi = this.ROI;
                    if (newRoi != null)
                    {
                        roi = newRoi;
                    }

                    using (HImage hImage = VisionHelper.Image(image))
                    {
                        RectangleContour rect = roi as RectangleContour;
                        using (HImage reduceImage = hImage.ReduceDomain(
                                   new HRegion(rect.Top, rect.Left,
                                               rect.Top + rect.Height,
                                               rect.Left + rect.Width)))
                        {
                            string code = string.Empty;
                            switch (CodeType)
                            {
                            case CodeType.Code_2D_Mat:
                                code = "Data Matrix ECC 200";
                                break;

                            case CodeType.Code_QR:
                                code = "QR Code";
                                break;
                            }

                            using (HDataCode2D code2D = new HDataCode2D(code, "default_parameters", "maximum_recognition"))
                            {
                                HTuple result       = new HTuple();
                                HTuple resultString = new HTuple();
                                code2D.FindDataCode2d(reduceImage, "stop_after_result_num", 1, out result, out resultString);
                                if (resultString.Length > 0)
                                {
                                    rtn.BarCode = resultString.SArr[0];
                                    this.AddVisionResc(rtn, $"条码寻找成功:{rtn.BarCode}");
                                    rtn.State = VisionResultState.OK;
                                    image.Overlays.Default.AddText(rtn.BarCode, new PointContour(rect.Left, rect.Top), Rgb32Value.BlueColor, new OverlayTextOptions("Consolas", 128));
                                }
                                else
                                {
                                    rtn.State = VisionResultState.NG;
                                    this.AddVisionResc(rtn, $"没有找到条码");
                                }
                            }
                        }
                    }
                }
            }
            catch (HalconException ex)
            {
                this.AddVisionResc(rtn, $"没有找到条码 {ex.GetErrorMessage()}");
            }
            return(rtn);
        }