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
}
}