Management.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. using Cognex.VisionPro;
  2. using Cognex.VisionPro.QuickBuild;
  3. using LampInspectionMachine.Cameralibs;
  4. using LampInspectionMachine.Model;
  5. using MvCamCtrl.NET;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Collections.ObjectModel;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using Prism.Mvvm;
  13. using LampInspectionMachine.Log4xml;
  14. using Cognex.VisionPro.ImageFile;
  15. using System.Drawing;
  16. using System.Windows.Forms;
  17. using System.Web;
  18. using System.ComponentModel;
  19. using System.Windows.Media.Media3D;
  20. using LampInspectionMachine.ViewModels;
  21. using System.Collections.Concurrent;
  22. using System.Threading;
  23. using System.Windows.Controls;
  24. using LampInspectionMachine.Views;
  25. using System.Windows.Media.Imaging;
  26. using System.Windows.Media;
  27. using System.Windows;
  28. using System.Runtime.InteropServices;
  29. using SqlSugar.DistributedSystem.Snowflake;
  30. using System.Windows.Threading;
  31. using System.Windows.Ink;
  32. using System.Data.SqlClient;
  33. using System.Xml.Linq;
  34. using System.Drawing.Imaging;
  35. using System.IO.Packaging;
  36. using Cognex.VisionPro.ToolBlock;
  37. using System.Windows.Markup;
  38. using System.Diagnostics;
  39. using LampInspectionMachine.Cameralibs.HKCamera;
  40. using Newtonsoft.Json.Linq;
  41. using OpenCvSharp.Dnn;
  42. using LampInspectionMachine.Interfaces;
  43. namespace LampInspectionMachine.Core
  44. {
  45. public class Management : BindableBase
  46. {
  47. private CameraView cameraView;
  48. private ICogImage image = new CogImage8Grey();
  49. private WriteableBitmap writeable;
  50. public WriteableBitmap Writeable { get => writeable; set { SetProperty(ref writeable, value); } }
  51. public ICogImage Image
  52. {
  53. get => image;
  54. set
  55. {
  56. SetProperty(ref image, value);
  57. }
  58. }
  59. // 使用泛型委托
  60. public event EventHandler<ICogImage> PropertyChanged;
  61. // 或者自定义委托
  62. public delegate void ChangeEventHandler(ICogImage e);
  63. public event ChangeEventHandler OnChange;
  64. public CameraService CameraService { get; set; }
  65. /// <summary>
  66. /// 相机列表
  67. /// </summary>
  68. public ObservableCollection<string> CameraList { get => _CameraList; set { SetProperty(ref _CameraList, value); } }
  69. /// <summary>
  70. /// 当前相机配置
  71. /// </summary>
  72. public CameraInfo CurrCamConfig { get => _CurrCamConfig; set { SetProperty(ref _CurrCamConfig, value); } }
  73. /// <summary>
  74. /// 相机配置列表
  75. /// </summary>
  76. public ObservableCollection<CameraInfo> CamConfigs { get => _CamConfigs; set { SetProperty(ref _CamConfigs, value); } }
  77. // public bool IsTriggerModel { get => _isTriggerModel; set { SetProperty(ref _isTriggerModel, value); } }
  78. public ICamera CurrCamera { get => myCamera; set { SetProperty(ref myCamera, value); } }
  79. /// <summary>
  80. /// 相机对应模板工具
  81. /// </summary>
  82. // public List<CogToolBlock> CamTemplateS { get => _CamTemplateS; set => _CamTemplateS = value; }
  83. public event Action<int> ToolBlockSwitched;
  84. /// <summary>
  85. /// 当前选中相机的SN
  86. /// </summary>
  87. public string CurrCameraSn { get => _CurrCameraSn;
  88. set { SetProperty(ref _CurrCameraSn, value); } }
  89. public List<VisionProManager> VisionProManagers { get => _visionProManagers; set { SetProperty(ref _visionProManagers, value); } }
  90. public VisionProManager Currvision { get => _Currvision; set => _Currvision = value ; }
  91. private ObservableCollection<CameraInfo> _CamConfigs = new ObservableCollection<CameraInfo>();
  92. private List<VisionProManager> _visionProManagers=new List<VisionProManager>();
  93. // private List<CogToolBlock> _CamTemplateS = new List<CogToolBlock>();
  94. private CogToolBlock cogToolBlock1;
  95. private VisionProManager _Currvision;
  96. private CameraInfo _CurrCamConfig = null;
  97. private ICamera myCamera;
  98. //private bool _isTriggerModel = false;
  99. private ObservableCollection<string> _CameraList = new ObservableCollection<string>();
  100. private string _CurrCameraSn = "";
  101. public Stopwatch stopwatch = new Stopwatch();
  102. public Management()
  103. {
  104. }
  105. /// <summary>
  106. /// 获取相机列表
  107. /// </summary>
  108. public void LoadCameraDevice()
  109. {
  110. CameraService = new CameraService();
  111. CameraList = FindLoadCamera();
  112. if (CamConfigs.Count == 0)
  113. {
  114. CamConfigs.Add(new CameraInfo() { CameraName="相机1", Id=new Guid(), SerialNumber="", VppIndex=0, VppFileName = "Cam1.vpp" });
  115. CamConfigs.Add(new CameraInfo() { CameraName = "相机2", Id = new Guid(), SerialNumber = "", VppIndex = 1, VppFileName = "Cam2.vpp" });
  116. CamConfigs.Add(new CameraInfo() { CameraName = "相机3", Id = new Guid(), SerialNumber = "", VppIndex = 2, VppFileName = "Cam3.vpp" });
  117. CamConfigs.Add(new CameraInfo() { CameraName = "相机4", Id = new Guid(), SerialNumber = "", VppIndex = 3, VppFileName = "Cam4.vpp" });
  118. CamConfigs.Add(new CameraInfo() { CameraName = "相机5", Id = new Guid(), SerialNumber = "", VppIndex = 4, VppFileName = "Cam5.vpp" });
  119. CamConfigs.Add(new CameraInfo() { CameraName = "相机6", Id = new Guid(), SerialNumber = "", VppIndex = 5, VppFileName = "Cam6.vpp" });
  120. CamConfigs.Add(new CameraInfo() { CameraName = "相机7", Id = new Guid(), SerialNumber = "", VppIndex = 6, VppFileName = "Cam7.vpp" });
  121. CamConfigs.Add(new CameraInfo() { CameraName = "相机8", Id = new Guid(), SerialNumber = "", VppIndex = 7, VppFileName = "Cam8.vpp" });
  122. }
  123. }
  124. public void SaveCameraDevice()
  125. {
  126. }
  127. /// <summary>
  128. /// 初始化相机管理
  129. /// </summary>
  130. public void InitTemplates(TipService tipService,Management management)
  131. {
  132. tipService.ShowMsg("相机模板加载2%");
  133. for ( int i = 0; i < 1; i++ )
  134. {
  135. CogToolBlock cogToolBlock = (CogToolBlock)CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + $"\\Vpp\\{CamConfigs[i].VppFileName}");
  136. VisionProManager vision=new VisionProManager();
  137. ICamera myCamera;
  138. myCamera = CreateCamera(CamConfigs[i]);
  139. if ( myCamera.IsConnected)
  140. {
  141. myCamera.ImageCallbackEvent += vision.CamCallBack;
  142. myCamera.GrabImageCallbackEvent += vision.ImageCallback;
  143. }
  144. vision.Camera= myCamera;
  145. vision.CogToolBlock = cogToolBlock;
  146. vision.CameraInfo = CamConfigs[ i ];
  147. vision.Management=management;
  148. VisionProManagers.Add(vision);
  149. tipService.ShowMsg($"相机模板加载{(i+1)*10+2}%");
  150. }
  151. tipService.Tcolse();
  152. }
  153. /// <summary>
  154. /// 单张采集
  155. /// </summary>
  156. public void SoftTrigger()
  157. {
  158. if ( CurrCamera.IsConnected )
  159. {
  160. CurrCamera.StopGrabbing();
  161. LogHelper.Info($"软触发配置写入");
  162. CurrCamera.SetTriggerMode(false,7) ;
  163. CurrCamConfig.TriggerMode = false;
  164. LogHelper.Info($"软触发取图");
  165. CurrCamera.Grab();
  166. }
  167. }
  168. /// <summary>
  169. /// 连续采集写入
  170. /// </summary>
  171. public void SoftTrigger__Continue()
  172. { CurrCamera.StopGrabbing();
  173. //MyCamera.SetTriggerModeOff();
  174. //CurrCamConfig.TriggerMode = false;
  175. //MyCamera.SetTriggerSoftware();
  176. //if (MyCamera.CheckImageCallbackEvent(CamCallBack))
  177. // MyCamera.ImageCallbackEvent += CamCallBack;
  178. //if (!MyCamera.CheckImageCallbackEvent(CamVisionProCallBack))
  179. // MyCamera.ImageCallbackEvent -= CamVisionProCallBack;
  180. LogHelper.Info($"连续采集启动");
  181. CurrCamera.StartGrabbing();
  182. }
  183. public void SetHardTrigger_CallBack()
  184. {
  185. LogHelper.Info($"硬触发模式 启动");
  186. //MyCamera.SetTriggerModeOn();
  187. //CurrCamConfig.TriggerMode = true;
  188. //MyCamera.SetTriggerSoftware(0);
  189. //if (!MyCamera.CheckImageCallbackEvent(CamCallBack))
  190. // MyCamera.ImageCallbackEvent -= CamCallBack;
  191. //if (MyCamera.CheckImageCallbackEvent(CamVisionProCallBack))
  192. // MyCamera.ImageCallbackEvent += CamVisionProCallBack;
  193. CurrCamera.StartGrabbing();
  194. }
  195. /// <summary>
  196. /// 查找相机
  197. /// </summary>
  198. public ObservableCollection<string> FindLoadCamera()
  199. {
  200. var listsn = MvCamera.GetDevices();
  201. if (listsn.Length > 0)
  202. {
  203. ObservableCollection<string> strings = new ObservableCollection<string>();
  204. strings.Add("");
  205. for (int i = 0; i < listsn.Length; i++)
  206. {
  207. strings.Add(listsn[i].SerialNumber);
  208. }
  209. return strings;
  210. }
  211. else
  212. {
  213. System.Windows.Forms.MessageBox.Show("未查询到设备!", "提示", MessageBoxButtons.OK);
  214. return null;
  215. }
  216. }
  217. public bool InitCamera()
  218. {
  219. ICamera myCamera;
  220. if ( CurrCamera!=null&& CurrCamera.IsConnected )
  221. {
  222. CurrCamera.CloseDevice();
  223. myCamera = CameraService.GetCamera(CurrCamera.ID);
  224. bool res = myCamera.OpenDevice();
  225. if ( !res )
  226. {
  227. myCamera.CloseDevice();
  228. myCamera = null;
  229. return false;
  230. }
  231. else
  232. {
  233. CurrCamera = myCamera;
  234. CurrCamConfig.SerialNumber = myCamera.SerialNumber;
  235. if ( myCamera.IsConnected )
  236. {
  237. myCamera.ImageCallbackEvent -= Currvision.CamCallBack;
  238. myCamera.GrabImageCallbackEvent -= Currvision.ImageCallback;
  239. myCamera.ImageCallbackEvent += Currvision.CamCallBack;
  240. myCamera.GrabImageCallbackEvent += Currvision.ImageCallback;
  241. }
  242. return true;
  243. }
  244. }
  245. else
  246. {
  247. CurrCamera = null;
  248. myCamera=CreateCamera(new CameraInfo() { SerialNumber=CurrCameraSn });
  249. CurrCamera = myCamera;
  250. CurrCamConfig.SerialNumber = myCamera.SerialNumber;
  251. if ( myCamera.IsConnected )
  252. {
  253. myCamera.ImageCallbackEvent -= Currvision.CamCallBack;
  254. myCamera.GrabImageCallbackEvent -= Currvision.ImageCallback;
  255. myCamera.ImageCallbackEvent += Currvision.CamCallBack;
  256. myCamera.GrabImageCallbackEvent += Currvision.ImageCallback;
  257. }
  258. return true;
  259. }
  260. }
  261. public ICamera CreateCamera(CameraInfo cameraInfo)
  262. {
  263. Guid guid = Guid.NewGuid();
  264. CameraService.CreateCamera(guid, cameraInfo);
  265. ICamera myCamera = CameraService.GetCamera(guid);
  266. if ( myCamera != null )
  267. {
  268. try
  269. {
  270. bool res = myCamera.OpenDevice();
  271. if ( !res )
  272. {
  273. myCamera.CloseDevice();
  274. myCamera = null;
  275. return null;
  276. }
  277. else
  278. {
  279. return myCamera;
  280. }
  281. }
  282. catch
  283. {
  284. }
  285. }
  286. return myCamera;
  287. }
  288. public void CloseCamera()
  289. {
  290. CurrCamera?.StopGrabbing();
  291. CurrCamera?.CloseDevice();
  292. CurrCamera = null;
  293. }
  294. // // 将海康相机帧数据转换为CogImage8Grey灰度图像
  295. // public static ICogImage ConvertToCogImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo)
  296. // {
  297. // // 验证像素格式(支持MONO8/RGB8转灰度)
  298. // if (pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8 &&
  299. // pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed)
  300. // {
  301. // throw new ArgumentException("Unsupported pixel format");
  302. // }
  303. // // 创建CogImage8Grey对象
  304. // CogImage8Grey cogImage = new CogImage8Grey();
  305. // int width = (int)pFrameInfo.nWidth;
  306. // int height = (int)pFrameInfo.nHeight;
  307. // // 分配内存并复制数据
  308. // cogImage.Allocate(width, height);
  309. // // 获取8位灰度图像像素内存区域
  310. // ICogImage8PixelMemory pixelMemory = (cogImage).Get8GreyPixelMemory(
  311. //CogImageDataModeConstants.ReadWrite,
  312. //0, 0,
  313. //cogImage.Width, cogImage.Height);
  314. // IntPtr destPtr = pixelMemory.Scan0; // 获取像素数据指针
  315. // // IntPtr destPtr = cogImage.GetPixelData(CogImageDataModeConstants.ReadWrite);
  316. // if (pFrameInfo.enPixelType == MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8)
  317. // {
  318. // // 直接拷贝MONO8数据
  319. // SafeMemoryCopy(destPtr, pData, width * height);
  320. // }
  321. // else // RGB转灰度
  322. // {
  323. // byte[] rgbBuffer = new byte[width * height * 3];
  324. // Marshal.Copy(pData, rgbBuffer, 0, rgbBuffer.Length);
  325. // unsafe
  326. // {
  327. // byte* pDest = (byte*)destPtr.ToPointer();
  328. // for (int i = 0; i < rgbBuffer.Length; i += 3)
  329. // {
  330. // // RGB转灰度公式:0.299*R + 0.587*G + 0.114*B
  331. // *pDest++ = (byte)(0.299 * rgbBuffer[i] +
  332. // 0.587 * rgbBuffer[i + 1] +
  333. // 0.114 * rgbBuffer[i + 2]);
  334. // }
  335. // }
  336. // }
  337. // return cogImage;
  338. // }
  339. // // 将海康相机帧数据转换为CogImage24PlanarColor彩色图像
  340. // public static ICogImage ConvertToColorCogImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo)
  341. // {
  342. // if (pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed)
  343. // {
  344. // throw new ArgumentException("Only RGB8 format supported for color conversion");
  345. // }
  346. // CogImage24PlanarColor cogColorImage = new CogImage24PlanarColor();
  347. // int width = (int)pFrameInfo.nWidth;
  348. // int height = (int)pFrameInfo.nHeight;
  349. // // 分配内存
  350. // cogColorImage.Allocate(width, height);
  351. // // 获取三个颜色平面指针
  352. // CogImage8Grey red = cogColorImage.GetPlane(CogImagePlaneConstants.Red);
  353. // CogImage8Grey green = cogColorImage.GetPlane(CogImagePlaneConstants.Green);
  354. // CogImage8Grey blue = cogColorImage.GetPlane(CogImagePlaneConstants.Blue);
  355. // IntPtr redPtr = cogColorImage.GetPlane(CogImagePlaneConstants.Red).Get8GreyPixelMemory(
  356. //CogImageDataModeConstants.ReadWrite,
  357. //0, 0,
  358. //red.Width, red.Height).Scan0; // 获取像素数据指针
  359. // IntPtr greenPtr = cogColorImage.GetPlane(CogImagePlaneConstants.Green).Get8GreyPixelMemory(
  360. //CogImageDataModeConstants.ReadWrite,
  361. //0, 0,
  362. //red.Width, red.Height).Scan0; ;
  363. // IntPtr bluePtr = cogColorImage.GetPlane(CogImagePlaneConstants.Blue).Get8GreyPixelMemory(
  364. //CogImageDataModeConstants.ReadWrite,
  365. //0, 0,
  366. //red.Width, red.Height).Scan0; ;
  367. // // 转换RGB数据到平面格式
  368. // byte[] rgbBuffer = new byte[width * height * 3];
  369. // Marshal.Copy(pData, rgbBuffer, 0, rgbBuffer.Length);
  370. // unsafe
  371. // {
  372. // byte* pRed = (byte*)redPtr.ToPointer();
  373. // byte* pGreen = (byte*)greenPtr.ToPointer();
  374. // byte* pBlue = (byte*)bluePtr.ToPointer();
  375. // for (int i = 0; i < rgbBuffer.Length; i += 3)
  376. // {
  377. // *pRed++ = rgbBuffer[i]; // R
  378. // *pGreen++ = rgbBuffer[i + 1]; // G
  379. // *pBlue++ = rgbBuffer[i + 2]; // B
  380. // }
  381. // }
  382. // return cogColorImage;
  383. // }
  384. public void OnSwitchToolBlock(int index)
  385. {
  386. cogToolBlock1 = VisionProManagers[index].CogToolBlock;
  387. CurrCamera= VisionProManagers[ index ].Camera;
  388. CurrCamConfig = VisionProManagers[ index ].CameraInfo;
  389. ToolBlockSwitched?.Invoke(index); // 触发事件,传递索引参数。
  390. }
  391. /// <summary>
  392. /// 相机连接或者断开时
  393. /// </summary>
  394. /// <param name="id"></param>
  395. /// <param name="state"></param>
  396. private void Management_CameraConnectChangedEvent(Guid id, bool state)
  397. {
  398. // var sta = Status.FirstOrDefault(s => s.ID == id);
  399. // var camera = DeviceConfig.Cameras.FirstOrDefault(c => c.Id == id);
  400. //if ( sta != null && camera != null )
  401. //{
  402. // if ( state )
  403. // {
  404. // App.Current.Dispatcher.Invoke(new Action(() =>
  405. // {
  406. // sta.Message = $"{camera.CameraName}{connected}";
  407. // sta.Background = new SolidColorBrush(Colors.Green);
  408. // }));
  409. // }
  410. // else
  411. // {
  412. // App.Current.Dispatcher.Invoke(new Action(() =>
  413. // {
  414. // sta.Message = $"{camera.CameraName}{disconnected1}";
  415. // sta.Background = new SolidColorBrush(Colors.Red);
  416. // }));
  417. // }
  418. //}
  419. }
  420. }
  421. }