using Cognex.VisionPro; using System.ComponentModel; using Microsoft.Win32; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Media.Media3D; using TeamAAS.Camera.Attributes; using TeamAAS.Camera.Cameras; using TeamAAS.Camera.Enums; using TeamAAS.Camera.Images; using TeamAAS.Camera.Models; using Plugins.Vpp.Converters; namespace Plugins.Vpp { /// /// 康耐视 VisionPro 相机 /// [Camera("Cognex VisionPro", "康耐视 VisionPro")] public class CognexCamera : CameraBase { private ICogAcqFifo CameraAcq; [Browsable(false)] public override string CameraBrand => "康耐视 VisionPro"; public CognexCamera(Guid id, int index, string name, string serialNumber, string cameraIp, bool isFindByIp) : base(id, index, name, serialNumber, cameraIp, isFindByIp) { } #region 设备发现 public static CameraInfo[] GetDevices() { var cameras = new List(); if (!CheckSoftwareInstalled().isInstalled) return cameras.ToArray(); using (var mFrameGrabbers = new CogFrameGrabbers()) { int i = 0; foreach (ICogFrameGrabber item in mFrameGrabbers) { string[] bf1 = item.Name.Split(':'); string manufacturerName = item.Name; string model = item.Name; CameraType type = CameraType.GIGE; if (bf1.Length == 3) { manufacturerName = bf1[1].Trim(); model = bf1[2].Trim(); if (bf1[0].ToLower().Trim().Contains("gige")) type = CameraType.GIGE; else if (bf1[0].ToLower().Trim().Contains("usb")) type = CameraType.USB; else type = CameraType.Unknown; } if (type == CameraType.GIGE) { cameras.Add(new CameraInfo { CameraNo = i + 1, CameraName = item.Name, CameraBrand = "康耐视 VisionPro", CameraType = type, ManufacturerName = manufacturerName, Model = model, SerialNumber = item.SerialNumber, CameraIp = item.OwnedGigEAccess.CurrentIPAddress, IsFindByIp = true }); } else { cameras.Add(new CameraInfo { CameraNo = i + 1, CameraName = "", CameraBrand = "康耐视 VisionPro", CameraType = type, ManufacturerName = manufacturerName, Model = model, SerialNumber = item.SerialNumber, CameraIp = item.Name }); } i++; } } return cameras.ToArray(); } public static (bool isInstalled, string version) CheckSoftwareInstalled() { string softwareName = "Cognex VisionPro"; string softwareVersion = "90.0.5"; string[] registryPaths = { @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" }; foreach (var path in registryPaths) { using (RegistryKey key = Registry.LocalMachine.OpenSubKey(path)) { if (key == null) continue; foreach (string subKeyName in key.GetSubKeyNames()) { using (RegistryKey subKey = key.OpenSubKey(subKeyName)) { string displayName = subKey?.GetValue("DisplayName")?.ToString(); if (displayName != null && displayName.Contains(softwareName)) { string version = subKey.GetValue("DisplayVersion")?.ToString(); if (new Version(version) >= new Version(softwareVersion)) return (true, version); return (false, version); } } } } } return (false, ""); } #endregion #region SDK 实现 public override bool OpenDevice() { IsConnected = false; if (!_isHaveCamera || CameraAcq == null) { using (var mFrameGrabbers = new CogFrameGrabbers()) { foreach (ICogFrameGrabber item in mFrameGrabbers) { string[] bf1 = item.Name.Split(':'); CameraType type = CameraType.GIGE; if (bf1.Length == 3) { if (bf1[0].ToLower().Trim().Contains("gige")) type = CameraType.GIGE; else if (bf1[0].ToLower().Trim().Contains("usb")) type = CameraType.USB; else type = CameraType.Unknown; } bool match = false; if (type == CameraType.GIGE) { if (IsFindByIp) match = CameraIp == item.OwnedGigEAccess.CurrentIPAddress; else match = item.SerialNumber == SerialNumber; } else { match = item.SerialNumber == SerialNumber; } if (match) { var videoFormat = item.AvailableVideoFormats[0]; foreach (string format in item.AvailableVideoFormats) { if (format == "Generic GigEVision (Mono)") { videoFormat = format; break; } if (format != "Generic GigEVision (Bayer Color)") continue; videoFormat = format; break; } CameraAcq = item.CreateAcqFifo(videoFormat, CogAcqFifoPixelFormatConstants.Format8Grey, 0, true); if (bf1.Length == 3) { ManufacturerName = bf1[1].Trim(); ModelName = bf1[2].Trim(); } if (type == CameraType.GIGE) CameraIp = item.OwnedGigEAccess.CurrentIPAddress; CameraType = type; _isHaveCamera = true; break; } } } if (!_isHaveCamera) return false; } if (!IsConnected) OnConnectChanged(true); IsConnected = true; return IsConnected; } public override void CloseDevice() { IsConnected = false; } public override GenImage Grab() { var sw = Stopwatch.StartNew(); for (int i = 0; i < 5; i++) { try { if (CameraAcq == null) OpenDevice(); int trignum; var cogImg = CameraAcq.Acquire(out trignum); Image = GenImageConverter.FromCogImage(cogImg); ImageWidth = (uint)Image.Width; ImageHeight = (uint)Image.Height; TotalTime = sw.Elapsed; ErrorMessage = ""; return Image; } catch (Exception ex) { ErrorMessage = ex.Message; } } if (IsConnected) { IsConnected = false; OnConnectChanged(false); } return null; } public override bool SetExposureTime(float exposureTime) { if (CameraAcq == null) return false; CameraAcq.OwnedExposureParams.Exposure = (double)exposureTime * 0.001; return true; } public override float GetExposureTime() { if (CameraAcq == null) return 0; return (float)CameraAcq.OwnedExposureParams.Exposure * 1000; } public override bool SetGain(float gain) { if (CameraAcq == null) return false; CameraAcq.OwnedBrightnessParams.Brightness = (double)gain; return true; } public override float GetGain() { if (CameraAcq == null) return 0; return (float)CameraAcq.OwnedBrightnessParams.Brightness; } #endregion } }