Exemplo n.º 1
0
 /// <summary>
 /// 触发相机拍照
 /// </summary>
 /// <param name="camName">相机名</param>
 /// <param name="outBitmap">输出图片</param>
 /// <returns></returns>
 public static bool TriggerCamera(string camName, out Bitmap outBitmap)
 {
     if (!MyRun.havInit)
     {
         StrErrorMsg = "视觉模块未初始化";
         outBitmap   = null;
         return(false);
     }
     lock (obj)
     {
         try
         {
             MyRun.TriggerCamera(camName, out outBitmap);
             if (outBitmap != null)
             {
                 return(true);
             }
             else
             {
                 StrErrorMsg = MyRun.StrErrorMsg;
                 return(false);
             }
         }
         catch (Exception ex)
         {
             StrErrorMsg = "图片获取失败" + ex.Message;
             outBitmap   = null;
             return(false);
         }
     }
 }
Exemplo n.º 2
0
 /// <summary>
 /// 触发所有相机拍照
 /// </summary>
 /// <param name="imageType">存储与传输图片的格式</param>
 /// <returns></returns>
 public static bool TriggerAllCamera(ImageType imageType = ImageType.HObject)
 {
     if (!MyRun.havInit)
     {
         StrErrorMsg = "视觉模块未初始化";
         return(false);
     }
     lock (obj)
     {
         if (UseCamsName.Count == 0)
         {
             StrErrorMsg = "未选择模板";
             return(false);
         }
         foreach (var camName in UseCamsName.ToArray())
         {
             if (imageType == ImageType.HObject)
             {
                 MyRun.TriggerCamera(camName, out HObject outImage);
                 if (outImage != null)
                 {
                     SoftwareOnceEvent?.Invoke(null, new OutImage(camName, outImage));
                     outImage.Dispose();
                 }
                 else
                 {
                     StrErrorMsg = MyRun.StrErrorMsg;
                     return(false);
                 }
             }
             if (imageType == ImageType.Bitmap)
             {
                 MyRun.TriggerCamera(camName, out Bitmap outImage);
                 if (outImage != null)
                 {
                     SoftwareOnceEvent?.Invoke(null, new OutImage(camName, outImage));
                     outImage.Dispose();
                 }
                 else
                 {
                     StrErrorMsg = MyRun.StrErrorMsg;
                     return(false);
                 }
             }
         }
         return(true);
     }
 }
Exemplo n.º 3
0
        /// <summary>
        /// 触发检测,更具当前切换的型号模板进行拍照识别
        /// 阻塞线程直到拍照识别结束,返回TriggerDetection的结果
        /// 同一时刻只能有一个TriggerDetection在运行
        /// </summary>
        /// <param name="outResult"></param>
        /// <returns></returns>
        public static bool TriggerDetection(out List <OutResult> outResults)
        {
            outResults = null;
            if (!MyRun.havInit)
            {
                StrErrorMsg = "视觉模块未初始化";
                return(false);
            }
            if (DetectionThread != null && DetectionThread.IsAlive)
            {
                StrErrorMsg = "上一次拍照识别并未结束";
                return(false);
            }

            OutResults.Clear();

            ConcurrentDictionary <string, HObject> camImages = new ConcurrentDictionary <string, HObject>();
            bool hav = true;

            while (true)
            {
                Parallel.ForEach(UseCamsName.ToArray(), camName =>
                {
                    if (MyRun.TriggerCamera(camName, out HObject camImage))
                    {
                        if (camImage != null)
                        {
                            //待升级:这里添加对图片质量的判断,如果图片模糊,撕裂则将图片丢弃

                            camImages.AddOrUpdate(camName, camImage, (k, v) => v = camImage);
                        }
                    }
                    else
                    {
                        StrErrorMsg = MyRun.StrErrorMsg;
                    }
                });

                //待升级:这里添加对产品是否到位的判断,通过特征检测的方式实现,不符合要求的则将图片丢弃

                //待升级:这里添加模板匹配矫正图片的功能,检测项检测时使用的是矫正后的图片,
                //要将矫正的变换参数保存,界面显示的需要是把ROI区域等检测效果进行矫正的图片


                Parallel.ForEach(UseTestItems.ToArray(), testItem =>
                {
                    if (camImages.TryGetValue(testItem.camName, out HObject camImage))
                    {
                        testItem.Find(camImage);
                        testItem.Show(camImage, out HObject resultImage);
                        testItem.hav        = true;
                        OutResult outResult = new OutResult()
                        {
                            TestItemName  = testItem.name,
                            CamName       = testItem.camName,
                            IsOK          = testItem.isOK,
                            ResultMessage = testItem.outMessage,
                            OriginalImage = new OutImage(testItem.camName, camImage),
                            EffectImage   = new OutImage(testItem.camName, resultImage)
                        };
                        DetectionOnceEvent?.Invoke(null, outResult);
                        OutResults.Add(outResult);
                    }
                });

                foreach (var camImage in camImages.Values)
                {
                    camImage.Dispose();
                }
                hav = true;
                foreach (var testItem in UseTestItems.ToArray())
                {
                    hav &= testItem.hav;
                }
                if (hav)
                {
                    foreach (var testItem in UseTestItems.ToArray())
                    {
                        testItem.hav = false;
                    }
                    break;
                }
                if (stopDetectionSignal.WaitOne(20))
                {
                    break;
                }
                Thread.Sleep(20);
            }

            outResults = OutResults;
            return(true);
        }
Exemplo n.º 4
0
        /// <summary>
        /// 触发检测,更具当前切换的型号模板进行拍照识别
        /// 该方法会开辟新线程
        /// 该方法不会返回识别结果,识别结果需要在调用WaitDetectionResult获取
        /// 同一时刻只能有一个TriggerDetection在运行
        /// </summary>
        /// <returns></returns>
        public static bool TriggerDetection()
        {
            if (!MyRun.havInit)
            {
                StrErrorMsg = "视觉模块未初始化";
                return(false);
            }
            if (DetectionThread != null && DetectionThread.IsAlive)
            {
                StrErrorMsg = "上一次拍照识别并未结束";
                return(false);
            }
            DetectionThread = new Thread(() =>
            {
                //防止之前暂停的信号影响到这次检测
                stopDetectionSignal.Reset();
                OutResults.Clear();

                ConcurrentDictionary <string, HObject> camImages    = new ConcurrentDictionary <string, HObject>();
                ConcurrentDictionary <string, HObject> matchImages  = new ConcurrentDictionary <string, HObject>();
                ConcurrentDictionary <string, HTuple> matchHomMat2D = new ConcurrentDictionary <string, HTuple>();

                bool hav = true;
                while (true)
                {
                    Parallel.ForEach(UseCamsName.ToArray(), camName =>
                    {
                        if (MyRun.TriggerCamera(camName, out HObject camImage))
                        {
                            if (camImage != null)
                            {
                                //待升级:这里添加对图片质量的判断,如果图片模糊,撕裂则将图片丢弃

                                camImages.AddOrUpdate(camName, camImage, (k, v) => v = camImage);
                            }
                        }
                        else
                        {
                            StrErrorMsg = MyRun.StrErrorMsg;
                        }
                    });

                    //待升级:这里添加对产品是否到位的判断,通过特征检测的方式实现,不符合要求的则将图片丢弃

                    //待升级:这里添加模板匹配矫正图片的功能,检测项检测时使用的是矫正后的图片
                    //要将矫正的变换参数保存,界面显示的需要是把ROI区域等检测效果进行矫正的图片

                    Parallel.ForEach(UseMatchingFun.ToArray(), matchingFun =>
                    {
                        if (!matchingFun.matching.Name.Equals("无模板定位") && camImages.TryGetValue(matchingFun.matching.CamName, out HObject camImage))
                        {
                            int nRet = matchingFun.Find(camImage, out HObject matchImage);

                            if (nRet == 0)
                            {
                                matchImages.AddOrUpdate(matchingFun.matching.Name, matchImage, (k, v) => v             = matchImage);
                                matchHomMat2D.AddOrUpdate(matchingFun.matching.Name, matchingFun.homMat2D, (k, v) => v = matchingFun.homMat2D);
                            }

                            SoftwareOnceEvent?.Invoke(null, new OutImage(matchingFun.matching.CamName, camImage));
                        }
                    });


                    Parallel.ForEach(UseTestItems.ToArray(), testItem =>
                    {
                        if (testItem.hav)
                        {
                            return;
                        }
                        HObject inImage = null;
                        if (testItem.matchName.Equals("无模板定位"))
                        {
                            if (camImages.TryGetValue(testItem.camName, out inImage))
                            {
                                testItem.Find(inImage);
                                testItem.Show(inImage, out HObject resultImage);
                                testItem.hav        = true;
                                OutResult outResult = new OutResult()
                                {
                                    TestItemName  = testItem.name,
                                    CamName       = testItem.camName,
                                    IsOK          = testItem.isOK,
                                    ResultMessage = testItem.outMessage,
                                    OriginalImage = new OutImage(testItem.camName, inImage),
                                    EffectImage   = new OutImage(testItem.camName, resultImage)
                                };
                                DetectionOnceEvent?.Invoke(null, outResult);
                                OutResults.Add(outResult);
                            }
                        }
                        else
                        {
                            if (matchImages.TryGetValue(testItem.matchName, out inImage))
                            {
                                testItem.Find(inImage);
                                camImages.TryGetValue(testItem.camName, out inImage);
                                testItem.Show(inImage, matchHomMat2D[testItem.matchName], out HObject resultImage);
                                testItem.hav        = true;
                                OutResult outResult = new OutResult()
                                {
                                    TestItemName  = testItem.name,
                                    CamName       = testItem.camName,
                                    IsOK          = testItem.isOK,
                                    ResultMessage = testItem.outMessage,
                                    OriginalImage = new OutImage(testItem.camName, inImage),
                                    EffectImage   = new OutImage(testItem.camName, resultImage)
                                };
                                DetectionOnceEvent?.Invoke(null, outResult);
                                OutResults.Add(outResult);
                            }
                        }
                    });

                    foreach (var camImage in camImages.Values)
                    {
                        camImage.Dispose();
                    }
                    hav = true;
                    foreach (var testItem in UseTestItems.ToArray())
                    {
                        hav &= testItem.hav;
                    }
                    if (hav)
                    {
                        foreach (var testItem in UseTestItems.ToArray())
                        {
                            testItem.hav = false;
                        }
                        break;
                    }
                    if (stopDetectionSignal.WaitOne(20))
                    {
                        break;
                    }
                    Thread.Sleep(20);
                }
            })
            {
                IsBackground = true
            };
            DetectionThread.Start();

            return(true);
        }