Management.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  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. using System.IO;
  44. using LampInspectionMachine.KHLplc;
  45. using LampInspectionMachine.Cameralibs.OPTCamera;
  46. namespace LampInspectionMachine.Core
  47. {
  48. public class Management : BindableBase
  49. {
  50. private CameraView cameraView;
  51. private ShowRender render = new ShowRender();
  52. public ShowRender Render
  53. {
  54. get => render;
  55. set
  56. {
  57. SetProperty(ref render, value);
  58. }
  59. }
  60. private KHLCommunicate _kHLCommunicate;
  61. public KHLCommunicate KHLCommunicate { get => _kHLCommunicate; set => _kHLCommunicate = value; }
  62. public CameraService CameraService { get; set; }
  63. /// <summary>
  64. /// 相机列表
  65. /// </summary>
  66. public ObservableCollection<string> CameraList { get => _CameraList; set { SetProperty(ref _CameraList, value); } }
  67. /// <summary>
  68. /// 当前相机配置
  69. /// </summary>
  70. public CameraInfo CurrCamConfig { get => _CurrCamConfig;
  71. set { SetProperty(ref _CurrCamConfig, value); } }
  72. /// <summary>
  73. /// 相机配置列表
  74. /// </summary>
  75. public List<CameraInfo> CamConfigs { get => _CamConfigs; set { SetProperty(ref _CamConfigs, value); } }
  76. // public bool IsTriggerModel { get => _isTriggerModel; set { SetProperty(ref _isTriggerModel, value); } }
  77. public ICamera CurrCamera { get => myCamera; set { SetProperty(ref myCamera, value); } }
  78. /// <summary>
  79. /// 相机对应模板工具
  80. /// </summary>
  81. // public List<CogToolBlock> CamTemplateS { get => _CamTemplateS; set => _CamTemplateS = value; }
  82. public event Action<int> ToolBlockSwitched;
  83. public event Action<int> ToolBlockCatched;
  84. private int _CurrIndex=0;
  85. /// <summary>
  86. /// 当前选中的视觉方案id
  87. /// </summary>
  88. public int CurrIndex { get => _CurrIndex; set => _CurrIndex = value; }
  89. /// <summary>
  90. /// 当前选中相机的SN
  91. /// </summary>
  92. public string CurrCameraSn { get => _CurrCameraSn;
  93. set { SetProperty(ref _CurrCameraSn, value); } }
  94. public ObservableCollection<VisionProManager> VisionProManagers { get => _visionProManagers; set { SetProperty(ref _visionProManagers, value); } }
  95. public VisionProManager Currvision { get => _Currvision; set => _Currvision = value ; }
  96. private List<CameraInfo> _CamConfigs = new List<CameraInfo>();
  97. private ObservableCollection<VisionProManager> _visionProManagers=new ObservableCollection<VisionProManager>();
  98. // private List<CogToolBlock> _CamTemplateS = new List<CogToolBlock>();
  99. private CogToolBlock cogToolBlock1;
  100. private VisionProManager _Currvision;
  101. private CameraInfo _CurrCamConfig = null;
  102. private ICamera myCamera;
  103. //private bool _isTriggerModel = false;
  104. private ObservableCollection<string> _CameraList = new ObservableCollection<string>();
  105. private string _CurrCameraSn = "";
  106. public Stopwatch stopwatch = new Stopwatch();
  107. public Management()
  108. {
  109. }
  110. Thread PlcConnChangThread ;
  111. public async void ConnectPlc()
  112. {
  113. KHLCommunicate = new KHLCommunicate();
  114. await KHLCommunicate.ConnPlc();
  115. if (KHLCommunicate.IsConnected)
  116. {
  117. PlcConnChangThread = new Thread(RefPlcConnect);
  118. PlcConnChangThread.IsBackground = true;
  119. PlcConnChangThread.Start();
  120. }
  121. }
  122. public async void RefPlcConnect()
  123. {
  124. while (true)
  125. {
  126. if(!KHLCommunicate.IsConnected)
  127. await KHLCommunicate.ConnPlc();
  128. Thread.Sleep(1000);
  129. }
  130. }
  131. /// <summary>
  132. /// 获取相机列表
  133. /// </summary>
  134. public void LoadCameraDevice()
  135. {
  136. CameraService = new CameraService();
  137. CamConfigs = FileHelper.ReadApplicationConfiguration();
  138. CameraList = FindLoadCamera();
  139. if ( CamConfigs.Count == 0 )
  140. {
  141. CamConfigs.Add(new CameraInfo() { CameraName = "相机1", Id = new Guid(), SerialNumber = "", VppIndex = 0, VppFileName = "Cam1.vpp" });
  142. CamConfigs.Add(new CameraInfo() { CameraName = "相机2", Id = new Guid(), SerialNumber = "", VppIndex = 1, VppFileName = "Cam2.vpp" });
  143. CamConfigs.Add(new CameraInfo() { CameraName = "相机3", Id = new Guid(), SerialNumber = "", VppIndex = 2, VppFileName = "Cam3.vpp" });
  144. CamConfigs.Add(new CameraInfo() { CameraName = "相机4", Id = new Guid(), SerialNumber = "", VppIndex = 3, VppFileName = "Cam4.vpp" });
  145. CamConfigs.Add(new CameraInfo() { CameraName = "相机5", Id = new Guid(), SerialNumber = "", VppIndex = 4, VppFileName = "Cam5.vpp" });
  146. CamConfigs.Add(new CameraInfo() { CameraName = "相机6", Id = new Guid(), SerialNumber = "", VppIndex = 5, VppFileName = "Cam6.vpp" });
  147. CamConfigs.Add(new CameraInfo() { CameraName = "相机7", Id = new Guid(), SerialNumber = "", VppIndex = 6, VppFileName = "Cam7.vpp" });
  148. CamConfigs.Add(new CameraInfo() { CameraName = "相机8", Id = new Guid(), SerialNumber = "", VppIndex = 7, VppFileName = "Cam8.vpp" });
  149. }
  150. LogHelper.Info(Resources.Language.Resources.加载配置文件完成);
  151. }
  152. public void SaveCameraDevice()
  153. {
  154. FileHelper.SaveApplicationConfiguration(CamConfigs);
  155. LogHelper.Info(Resources.Language.Resources.保存配置完成);
  156. }
  157. /// <summary>
  158. /// 初始化相机管理
  159. /// </summary>
  160. public void InitTemplates(TipService tipService, Management management)
  161. {
  162. tipService.ShowMsg($"{Resources.Language.Resources.相机模板加载}2 %");
  163. for ( int i = 0; i < CamConfigs.Count; i++ )
  164. {
  165. CogToolBlock cogToolBlock = (CogToolBlock)CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + $"\\Vpp\\{CamConfigs[i].VppFileName}");
  166. VisionProManager vision=new VisionProManager();
  167. ICamera myCamera;
  168. myCamera = CreateCamera(CamConfigs[ i ]);
  169. if ( myCamera != null && myCamera.IsConnected )
  170. {
  171. if ( myCamera.CheckImageCallbackEventIsHas(vision.CamCallBack) )
  172. myCamera.ImageCallbackEvent -= vision.CamCallBack;
  173. if ( !myCamera.CheckGrabImageCallbackEventIsHas(vision.ImageCallback) )
  174. myCamera.GrabImageCallbackEvent += vision.ImageCallback;
  175. myCamera.CameraConnectChangedEvent += vision.CameraConnectChangedEvent;
  176. vision.IsConnected = true;
  177. myCamera.SetTriggerMode(true, 0);
  178. myCamera.StartTriggerGrabbing();
  179. }
  180. vision.Camera = myCamera;
  181. vision.PlcData.PlcToPcCodeIndex = ( uint ) ( 100 + i );
  182. vision.PlcData.PcToPlcCompleted = ( uint ) ( 200 + i );
  183. vision.PlcData.PcToPlcResult = ( uint ) ( 300 + i );
  184. vision.PlcData.PcToPlcCodeIndex = ( uint ) ( 400 + i );
  185. vision.CogToolBlock = cogToolBlock;
  186. vision.CameraInfo = CamConfigs[ i ];
  187. vision.Management = management;
  188. VisionProManagers.Add(vision);
  189. tipService.ShowMsg($"{Resources.Language.Resources.相机模板加载}{( i + 1 ) * 10 + 2}%");
  190. }
  191. LogHelper.Info(Resources.Language.Resources.模板加载完成);
  192. tipService.Tcolse();
  193. }
  194. /// <summary>
  195. /// 单张采集
  196. /// </summary>
  197. public void SoftTrigger()
  198. {
  199. if ( CurrCamera.IsConnected )
  200. {
  201. CurrCamera.StopGrabbing();
  202. LogHelper.Info(Resources.Language.Resources.软触发配置写入);
  203. CurrCamera.SetTriggerMode(false, 7);
  204. if ( !CurrCamera.CheckImageCallbackEventIsHas(Currvision.CamCallBack) )
  205. CurrCamera.ImageCallbackEvent += Currvision.CamCallBack;
  206. CurrCamConfig.TriggerMode = false;
  207. LogHelper.Info(Resources.Language.Resources.软触发取图);
  208. CurrCamera.Grab();
  209. }
  210. else
  211. {
  212. System.Windows.Forms.MessageBox.Show(Resources.Language.Resources.相机未打开);
  213. }
  214. }
  215. /// <summary>
  216. /// 连续采集写入
  217. /// </summary>
  218. public void SoftTrigger__Continue()
  219. {
  220. if ( CurrCamera!=null&& CurrCamera.IsConnected )
  221. {
  222. CurrCamera.StopGrabbing();
  223. CurrCamera.SetTriggerMode(false, 7);
  224. CurrCamConfig.TriggerMode = false;
  225. if ( !CurrCamera.CheckImageCallbackEventIsHas(Currvision.CamCallBack) )
  226. CurrCamera.ImageCallbackEvent += Currvision.CamCallBack;
  227. if (myCamera.CheckGrabImageCallbackEventIsHas(Currvision.ImageCallback))
  228. myCamera.GrabImageCallbackEvent -= Currvision.ImageCallback;
  229. LogHelper.Info(Resources.Language.Resources.连续采集启动);
  230. CurrCamera.StartGrabbing();
  231. }
  232. else
  233. {
  234. System.Windows.Forms.MessageBox.Show(Resources.Language.Resources.相机未打开);
  235. }
  236. }
  237. /// <summary>
  238. /// 单张图片测试
  239. /// </summary>
  240. public void ImageTrigger()
  241. {
  242. OpenFileDialog openFileDialog = new OpenFileDialog();
  243. if ( openFileDialog.ShowDialog() == DialogResult.OK )
  244. {
  245. // 加载图像文件
  246. using ( var bitmap = new Bitmap(openFileDialog.FileName) )
  247. {
  248. // 转换为VisionPro图像格式
  249. ICogImage icogImage = new CogImage8Grey(bitmap);
  250. // 设置输入参数
  251. Currvision.CogToolBlock.Inputs["Image"].Value = icogImage;
  252. //执行处理
  253. Currvision.CogToolBlock.Run();
  254. //获取输出结果
  255. if (Currvision.CogToolBlock.RunStatus.Result == CogToolResultConstants.Accept)
  256. {
  257. CogToolBlockTerminalCollection outputCollection = Currvision.CogToolBlock.Outputs;
  258. ICogRecord record = null;
  259. foreach (CogToolBlockTerminal item in outputCollection)
  260. {
  261. if (item.Value is ICogRecord)
  262. record = item.Value as ICogRecord;
  263. }
  264. ICogImage cogImage = (ICogImage)Currvision.CogToolBlock.Inputs["Image"].Value;
  265. if (cogImage != null)
  266. {
  267. Render = new ShowRender()
  268. {
  269. //Graphic = outputCollection["Graphic"].Value as CogGraphicCollection,
  270. Image = icogImage,
  271. Record = record
  272. };
  273. }
  274. }
  275. else
  276. {
  277. Render = new ShowRender()
  278. {
  279. Image = icogImage
  280. };
  281. }
  282. }
  283. }
  284. }
  285. /// <summary>
  286. /// 图片轮询测试
  287. /// </summary>
  288. public async Task ImageTrigger__Continue()
  289. {
  290. try
  291. {
  292. FolderBrowserDialog openFileDialog = new FolderBrowserDialog();
  293. if ( openFileDialog.ShowDialog() == DialogResult.OK )
  294. {
  295. DirectoryInfo folder = new DirectoryInfo(openFileDialog.SelectedPath);
  296. FileInfo[] files = folder.GetFiles("*.bmp", SearchOption.AllDirectories);
  297. Task.Run(() =>
  298. {
  299. foreach ( FileInfo file in files )
  300. {
  301. // 加载图像文件
  302. using ( var bitmap = new Bitmap(file.FullName) )
  303. {
  304. // 转换为VisionPro图像格式
  305. ICogImage cogImage = new CogImage8Grey(bitmap);
  306. Currvision.ImageCallback(cogImage);
  307. }
  308. }
  309. });
  310. }
  311. }
  312. catch
  313. {
  314. }
  315. }
  316. public void SetHardTrigger_CallBack()
  317. {
  318. if ( CurrCamera != null && CurrCamera.IsConnected )
  319. {
  320. LogHelper.Info(Resources.Language.Resources.硬触发模式启动);
  321. CurrCamera.ImageCallbackEvent -= Currvision.CamCallBack;
  322. CurrCamera.SetTriggerMode(true, 0);
  323. CurrCamConfig.TriggerMode = true;
  324. CurrCamera.StartGrabbing();
  325. }
  326. else
  327. {
  328. System.Windows.Forms.MessageBox.Show(Resources.Language.Resources.相机未打开);
  329. }
  330. }
  331. /// <summary>
  332. /// 查找相机
  333. /// </summary>
  334. public ObservableCollection<string> FindLoadCamera()
  335. {
  336. ObservableCollection<string> strings = new ObservableCollection<string>();
  337. if (CamConfigs.Count!=0)
  338. {
  339. switch (CamConfigs[0].CameraBrand)
  340. {
  341. case CameraBrand.HikRobot_MVS:
  342. var listsn = MvCamera.GetDevices();
  343. if (listsn.Length > 0)
  344. {
  345. strings.Add("");
  346. for (int i = 0; i < listsn.Length; i++)
  347. {
  348. strings.Add(listsn[i].SerialNumber);
  349. }
  350. return strings;
  351. }
  352. break;
  353. case CameraBrand.Basler_Pylon:
  354. break;
  355. case CameraBrand.SciCamera_Opt:
  356. var listsn2 = MVOptCamera.GetDevices();
  357. if (listsn2.Length > 0)
  358. {
  359. strings.Add("");
  360. for (int i = 0; i < listsn2.Length; i++)
  361. {
  362. strings.Add(listsn2[i].SerialNumber);
  363. }
  364. return strings;
  365. }
  366. break;
  367. default:
  368. break;
  369. }
  370. }
  371. if (strings.Count > 0)
  372. {
  373. return strings;
  374. }
  375. else
  376. {
  377. System.Windows.Forms.MessageBox.Show(Resources.Language.Resources.未查询到设备, Resources.Language.Resources.提示, MessageBoxButtons.OK);
  378. return null;
  379. }
  380. }
  381. public bool InitCamera()
  382. {
  383. try
  384. {
  385. ICamera myCamera;
  386. if ( CurrCamera != null && CurrCamera.IsConnected )
  387. {
  388. CurrCamera.CloseDevice();
  389. myCamera = CameraService.GetCamera(CurrCamera.ID);
  390. bool res = myCamera.OpenDevice();
  391. if ( !res )
  392. {
  393. myCamera.CloseDevice();
  394. myCamera = null;
  395. return false;
  396. }
  397. else
  398. {
  399. CurrCamera = myCamera;
  400. CurrCamConfig.SerialNumber = myCamera.SerialNumber;
  401. if ( myCamera.IsConnected )
  402. {
  403. if ( !myCamera.CheckImageCallbackEventIsHas(Currvision.CamCallBack) )
  404. myCamera.ImageCallbackEvent += Currvision.CamCallBack;
  405. if ( !myCamera.CheckGrabImageCallbackEventIsHas(Currvision.ImageCallback) )
  406. myCamera.GrabImageCallbackEvent += Currvision.ImageCallback;
  407. if ( !myCamera.CheckCameraConnectChangedEventIsHas(Currvision.CameraConnectChangedEvent) )
  408. myCamera.CameraConnectChangedEvent += Currvision.CameraConnectChangedEvent;
  409. }
  410. return true;
  411. }
  412. }
  413. else
  414. {
  415. CurrCamera = null;
  416. myCamera = CreateCamera(new CameraInfo() { SerialNumber = CurrCameraSn });
  417. CurrCamera = myCamera;
  418. if(myCamera!=null)
  419. CurrCamConfig.SerialNumber = myCamera.SerialNumber;
  420. if ( myCamera != null&& myCamera.IsConnected )
  421. {
  422. if ( !myCamera.CheckImageCallbackEventIsHas(Currvision.CamCallBack) )
  423. myCamera.ImageCallbackEvent += Currvision.CamCallBack;
  424. if ( !myCamera.CheckGrabImageCallbackEventIsHas(Currvision.ImageCallback) )
  425. myCamera.GrabImageCallbackEvent += Currvision.ImageCallback;
  426. if ( !myCamera.CheckCameraConnectChangedEventIsHas(Currvision.CameraConnectChangedEvent) )
  427. myCamera.CameraConnectChangedEvent += Currvision.CameraConnectChangedEvent;
  428. Currvision.IsConnected = true;
  429. return true;
  430. }
  431. return false;
  432. }
  433. }
  434. catch
  435. {
  436. CurrCamera?.CloseDevice();
  437. CurrCamera = null;
  438. return false;
  439. }
  440. }
  441. public ICamera CreateCamera(CameraInfo cameraInfo)
  442. {
  443. Guid guid = Guid.NewGuid();
  444. CameraService.CreateCamera(guid, cameraInfo);
  445. ICamera myCamera = CameraService.GetCamera(guid);
  446. if ( myCamera != null )
  447. {
  448. try
  449. {
  450. bool res = myCamera.OpenDevice();
  451. if ( !res )
  452. {
  453. myCamera.CloseDevice();
  454. myCamera = null;
  455. return null;
  456. }
  457. else
  458. {
  459. myCamera.SetExposureTime(cameraInfo.ExpouseTime);
  460. return myCamera;
  461. }
  462. }
  463. catch
  464. {
  465. }
  466. }
  467. return myCamera;
  468. }
  469. public void CloseCamera()
  470. {
  471. CurrCamera?.StopGrabbing();
  472. CurrCamera?.CloseDevice();
  473. CurrCamera = null;
  474. }
  475. // // 将海康相机帧数据转换为CogImage8Grey灰度图像
  476. // public static ICogImage ConvertToCogImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo)
  477. // {
  478. // // 验证像素格式(支持MONO8/RGB8转灰度)
  479. // if (pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8 &&
  480. // pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed)
  481. // {
  482. // throw new ArgumentException("Unsupported pixel format");
  483. // }
  484. // // 创建CogImage8Grey对象
  485. // CogImage8Grey cogImage = new CogImage8Grey();
  486. // int width = (int)pFrameInfo.nWidth;
  487. // int height = (int)pFrameInfo.nHeight;
  488. // // 分配内存并复制数据
  489. // cogImage.Allocate(width, height);
  490. // // 获取8位灰度图像像素内存区域
  491. // ICogImage8PixelMemory pixelMemory = (cogImage).Get8GreyPixelMemory(
  492. //CogImageDataModeConstants.ReadWrite,
  493. //0, 0,
  494. //cogImage.Width, cogImage.Height);
  495. // IntPtr destPtr = pixelMemory.Scan0; // 获取像素数据指针
  496. // // IntPtr destPtr = cogImage.GetPixelData(CogImageDataModeConstants.ReadWrite);
  497. // if (pFrameInfo.enPixelType == MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8)
  498. // {
  499. // // 直接拷贝MONO8数据
  500. // SafeMemoryCopy(destPtr, pData, width * height);
  501. // }
  502. // else // RGB转灰度
  503. // {
  504. // byte[] rgbBuffer = new byte[width * height * 3];
  505. // Marshal.Copy(pData, rgbBuffer, 0, rgbBuffer.Length);
  506. // unsafe
  507. // {
  508. // byte* pDest = (byte*)destPtr.ToPointer();
  509. // for (int i = 0; i < rgbBuffer.Length; i += 3)
  510. // {
  511. // // RGB转灰度公式:0.299*R + 0.587*G + 0.114*B
  512. // *pDest++ = (byte)(0.299 * rgbBuffer[i] +
  513. // 0.587 * rgbBuffer[i + 1] +
  514. // 0.114 * rgbBuffer[i + 2]);
  515. // }
  516. // }
  517. // }
  518. // return cogImage;
  519. // }
  520. // // 将海康相机帧数据转换为CogImage24PlanarColor彩色图像
  521. // public static ICogImage ConvertToColorCogImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo)
  522. // {
  523. // if (pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed)
  524. // {
  525. // throw new ArgumentException("Only RGB8 format supported for color conversion");
  526. // }
  527. // CogImage24PlanarColor cogColorImage = new CogImage24PlanarColor();
  528. // int width = (int)pFrameInfo.nWidth;
  529. // int height = (int)pFrameInfo.nHeight;
  530. // // 分配内存
  531. // cogColorImage.Allocate(width, height);
  532. // // 获取三个颜色平面指针
  533. // CogImage8Grey red = cogColorImage.GetPlane(CogImagePlaneConstants.Red);
  534. // CogImage8Grey green = cogColorImage.GetPlane(CogImagePlaneConstants.Green);
  535. // CogImage8Grey blue = cogColorImage.GetPlane(CogImagePlaneConstants.Blue);
  536. // IntPtr redPtr = cogColorImage.GetPlane(CogImagePlaneConstants.Red).Get8GreyPixelMemory(
  537. //CogImageDataModeConstants.ReadWrite,
  538. //0, 0,
  539. //red.Width, red.Height).Scan0; // 获取像素数据指针
  540. // IntPtr greenPtr = cogColorImage.GetPlane(CogImagePlaneConstants.Green).Get8GreyPixelMemory(
  541. //CogImageDataModeConstants.ReadWrite,
  542. //0, 0,
  543. //red.Width, red.Height).Scan0; ;
  544. // IntPtr bluePtr = cogColorImage.GetPlane(CogImagePlaneConstants.Blue).Get8GreyPixelMemory(
  545. //CogImageDataModeConstants.ReadWrite,
  546. //0, 0,
  547. //red.Width, red.Height).Scan0; ;
  548. // // 转换RGB数据到平面格式
  549. // byte[] rgbBuffer = new byte[width * height * 3];
  550. // Marshal.Copy(pData, rgbBuffer, 0, rgbBuffer.Length);
  551. // unsafe
  552. // {
  553. // byte* pRed = (byte*)redPtr.ToPointer();
  554. // byte* pGreen = (byte*)greenPtr.ToPointer();
  555. // byte* pBlue = (byte*)bluePtr.ToPointer();
  556. // for (int i = 0; i < rgbBuffer.Length; i += 3)
  557. // {
  558. // *pRed++ = rgbBuffer[i]; // R
  559. // *pGreen++ = rgbBuffer[i + 1]; // G
  560. // *pBlue++ = rgbBuffer[i + 2]; // B
  561. // }
  562. // }
  563. // return cogColorImage;
  564. // }
  565. public void OnSwitchToolBlock(int index)
  566. {
  567. cogToolBlock1 = VisionProManagers[index].CogToolBlock;
  568. CurrCamera= VisionProManagers[ index ].Camera;
  569. CurrCamConfig = VisionProManagers[ index ].CameraInfo;
  570. ToolBlockSwitched?.Invoke(index); // 触发事件,传递索引参数。
  571. }
  572. public void OnSaveSwitchToolBlock(int index)
  573. {
  574. ToolBlockCatched?.Invoke(index);
  575. }
  576. }
  577. }