AHuaCamera.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  1. using Microsoft.Win32;
  2. using System.ComponentModel;
  3. using MVSDK_Net;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Diagnostics;
  7. using System.Runtime.InteropServices;
  8. using System.Text.RegularExpressions;
  9. using System.Threading;
  10. using TeamAAS.Camera.Images;
  11. using TeamAAS.Camera.Models;
  12. using static MVSDK_Net.IMVDefine;
  13. using TeamAAS.Camera.Attributes;
  14. using TeamAAS.Camera.Enums;
  15. namespace TeamAAS.Camera.Cameras
  16. {
  17. /// <summary>
  18. /// 大华/华睿相机(MVSDK_Net SDK)
  19. /// </summary>
  20. [Camera("iRayple", "大华相机")]
  21. public class AHuaCamera : CameraBase
  22. {
  23. #region 字段
  24. MVSDK_Net.MyCamera mvCameraAcq;
  25. private bool IsHaveCamera = false;
  26. private long m_picSize = 0;
  27. IMVDefine.IMV_Frame frame = new IMVDefine.IMV_Frame();
  28. IntPtr pTemp = IntPtr.Zero;
  29. IntPtr pConvertDstBuffer = IntPtr.Zero;
  30. int nConvertBufSize = 0;
  31. private IMVDefine.IMV_PixelConvertParam stPixelConvertParam = new IMVDefine.IMV_PixelConvertParam();
  32. private IMVDefine.IMV_EPixelType type = IMVDefine.IMV_EPixelType.gvspPixelMono8;
  33. #endregion
  34. [Browsable(false)]
  35. public override string CameraBrand => "大华相机";
  36. public AHuaCamera(Guid id, int index, string name, string serialNumber, string cameraIp, bool isFindByIp)
  37. : base(id, index, name, serialNumber, cameraIp, isFindByIp)
  38. {
  39. mvCameraAcq = new MVSDK_Net.MyCamera();
  40. var list = GetDevices();
  41. foreach (var device in list)
  42. {
  43. if (device.CameraType == CameraType.GIGE)
  44. {
  45. if (IsFindByIp)
  46. {
  47. if (device.CameraIp == CameraIp)
  48. {
  49. IsHaveCamera = true;
  50. ManufacturerName = device.ManufacturerName;
  51. ModelName = device.Model;
  52. SerialNumber = device.SerialNumber;
  53. CameraType = device.CameraType;
  54. int res = mvCameraAcq.IMV_CreateHandle(IMVDefine.IMV_ECreateHandleMode.modeByCameraKey, 0, serialNumber);
  55. break;
  56. }
  57. }
  58. else
  59. {
  60. if (device.SerialNumber == serialNumber)
  61. {
  62. IsHaveCamera = true;
  63. ManufacturerName = device.ManufacturerName;
  64. ModelName = device.Model;
  65. SerialNumber = device.SerialNumber;
  66. CameraType = device.CameraType;
  67. CameraIp = device.CameraIp;
  68. int res = mvCameraAcq.IMV_CreateHandle(IMVDefine.IMV_ECreateHandleMode.modeByCameraKey, 0, serialNumber);
  69. break;
  70. }
  71. }
  72. }
  73. else
  74. {
  75. if (device.SerialNumber == serialNumber)
  76. {
  77. IsHaveCamera = true;
  78. ManufacturerName = device.ManufacturerName;
  79. ModelName = device.Model;
  80. SerialNumber = device.SerialNumber;
  81. CameraType = device.CameraType;
  82. int res = mvCameraAcq.IMV_CreateHandle(IMVDefine.IMV_ECreateHandleMode.modeByCameraKey, 0, serialNumber);
  83. break;
  84. }
  85. }
  86. }
  87. IsConnected = false;
  88. }
  89. #region 设备发现
  90. public static CameraInfo[] GetDevices()
  91. {
  92. List<CameraInfo> cameras = new List<CameraInfo>();
  93. if (!CheckSoftwareInstalled().isInstalled)
  94. {
  95. return cameras.ToArray();
  96. }
  97. IMVDefine.IMV_DeviceList deviceList = new IMVDefine.IMV_DeviceList();
  98. IMVDefine.IMV_EInterfaceType interfaceTp = IMVDefine.IMV_EInterfaceType.interfaceTypeAll;
  99. int res = MyCamera.IMV_EnumDevices(ref deviceList, (uint)interfaceTp);
  100. if (res == IMVDefine.IMV_OK && deviceList.nDevNum > 0)
  101. {
  102. for (int i = 0; i < deviceList.nDevNum; i++)
  103. {
  104. IMVDefine.IMV_DeviceInfo deviceInfo =
  105. (IMVDefine.IMV_DeviceInfo)
  106. Marshal.PtrToStructure(
  107. deviceList.pDevInfo + Marshal.SizeOf(typeof(IMVDefine.IMV_DeviceInfo)) * i,
  108. typeof(IMVDefine.IMV_DeviceInfo));
  109. if (deviceInfo.nCameraType == IMV_ECameraType.typeGigeCamera)
  110. {
  111. IMVDefine.IMV_GigEDeviceInfo gigEDeviceInfo =
  112. (IMVDefine.IMV_GigEDeviceInfo)
  113. ByteToStruct(deviceInfo.deviceSpecificInfo.gigeDeviceInfo,
  114. typeof(IMVDefine.IMV_GigEDeviceInfo));
  115. cameras.Add(new CameraInfo()
  116. {
  117. CameraNo = i + 1,
  118. CameraName = deviceInfo.cameraName,
  119. CameraBrand = "大华相机",
  120. CameraType = CameraType.GIGE,
  121. ManufacturerName = deviceInfo.manufactureInfo,
  122. Model = deviceInfo.modelName,
  123. SerialNumber = deviceInfo.serialNumber,
  124. CameraIp = gigEDeviceInfo.ipAddress,
  125. IsFindByIp = true,
  126. });
  127. }
  128. else if (deviceInfo.nCameraType == IMV_ECameraType.typeU3vCamera)
  129. {
  130. cameras.Add(new CameraInfo()
  131. {
  132. CameraNo = i + 1,
  133. CameraName = deviceInfo.cameraName,
  134. CameraBrand = "大华相机",
  135. CameraType = CameraType.USB,
  136. ManufacturerName = deviceInfo.cameraName,
  137. Model = deviceInfo.modelName,
  138. SerialNumber = deviceInfo.serialNumber,
  139. CameraIp = "",
  140. });
  141. }
  142. else if (deviceInfo.nCameraType == IMV_ECameraType.typeCLCamera)
  143. {
  144. cameras.Add(new CameraInfo()
  145. {
  146. CameraNo = i + 1,
  147. CameraName = deviceInfo.cameraName,
  148. CameraBrand = "大华相机",
  149. CameraType = CameraType.Link,
  150. ManufacturerName = deviceInfo.cameraName,
  151. Model = deviceInfo.modelName,
  152. SerialNumber = deviceInfo.serialNumber,
  153. CameraIp = "",
  154. });
  155. }
  156. else
  157. {
  158. cameras.Add(new CameraInfo()
  159. {
  160. CameraNo = i + 1,
  161. CameraName = deviceInfo.cameraName,
  162. CameraBrand = "大华相机",
  163. CameraType = CameraType.Unknown,
  164. ManufacturerName = deviceInfo.cameraName,
  165. Model = deviceInfo.modelName,
  166. SerialNumber = deviceInfo.serialNumber,
  167. CameraIp = "",
  168. });
  169. }
  170. }
  171. }
  172. return cameras.ToArray();
  173. }
  174. public static (bool isInstalled, string version) CheckSoftwareInstalled()
  175. {
  176. string softwareName = "MV Viewer";
  177. string softwareVersion = "2.5.1.1";
  178. string[] registryPaths = new[]
  179. {
  180. @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
  181. @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
  182. };
  183. foreach (var path in registryPaths)
  184. {
  185. using (RegistryKey key = Registry.LocalMachine.OpenSubKey(path))
  186. {
  187. if (key == null) continue;
  188. foreach (string subKeyName in key.GetSubKeyNames())
  189. {
  190. using (RegistryKey subKey = key.OpenSubKey(subKeyName))
  191. {
  192. string displayName = subKey?.GetValue("DisplayName")?.ToString();
  193. if (displayName != null && displayName.Contains(softwareName))
  194. {
  195. string version = subKey.GetValue("DisplayVersion")?.ToString();
  196. var match = Regex.Match(version, @"^(\d+\.\d+\.\d+\.\d+)");
  197. if (match.Success)
  198. {
  199. version = match.Groups[1].Value;
  200. }
  201. else
  202. {
  203. continue;
  204. }
  205. Version v1 = new Version(version);
  206. Version v2 = new Version(softwareVersion);
  207. if (v1 >= v2)
  208. {
  209. return (true, version);
  210. }
  211. else
  212. {
  213. return (false, version);
  214. }
  215. }
  216. }
  217. }
  218. }
  219. }
  220. return (false, "");
  221. }
  222. #endregion
  223. #region SDK 实现
  224. public override bool OpenDevice()
  225. {
  226. using (WriteLockScope())
  227. {
  228. try
  229. {
  230. var list = GetDevices();
  231. foreach (var device in list)
  232. {
  233. if (device.SerialNumber == SerialNumber)
  234. {
  235. IsHaveCamera = true;
  236. ManufacturerName = device.ManufacturerName;
  237. ModelName = device.Model;
  238. SerialNumber = device.SerialNumber;
  239. CameraType = device.CameraType;
  240. int res = mvCameraAcq.IMV_CreateHandle(IMVDefine.IMV_ECreateHandleMode.modeByCameraKey, 0, SerialNumber);
  241. break;
  242. }
  243. }
  244. if (!IsHaveCamera)
  245. {
  246. return false;
  247. }
  248. int res1 = mvCameraAcq.IMV_Open();
  249. if (res1 != IMVDefine.IMV_OK)
  250. {
  251. return IsConnected;
  252. }
  253. if (!IsConnected)
  254. {
  255. OnConnectChanged(true);
  256. }
  257. long width = 0;
  258. long height = 0;
  259. res1 = mvCameraAcq.IMV_GetIntFeatureValue("Width", ref width);
  260. res1 = mvCameraAcq.IMV_GetIntFeatureValue("Height", ref height);
  261. ImageWidth = (uint)width;
  262. ImageHeight = (uint)height;
  263. m_picSize = width * height;
  264. // 按当前触发模式下发(默认连续采集 = TriggerMode Off,与历史硬编码一致)
  265. ApplyTriggerToHardware(TriggerMode);
  266. res1 = mvCameraAcq.IMV_StartGrabbingEx(3, IMV_EGrabStrategy.grabStrartegyLatestImage);
  267. IsConnected = mvCameraAcq.IMV_IsOpen();
  268. return IsConnected;
  269. }
  270. catch (Exception ex)
  271. {
  272. ErrorMessage = ex.Message;
  273. IsConnected = false;
  274. return false;
  275. }
  276. }
  277. }
  278. public override void CloseDevice()
  279. {
  280. using (WriteLockScope())
  281. {
  282. try
  283. {
  284. if (mvCameraAcq != null)
  285. {
  286. if (mvCameraAcq.IMV_IsOpen())
  287. {
  288. mvCameraAcq.IMV_StopGrabbing();
  289. mvCameraAcq.IMV_Close();
  290. }
  291. mvCameraAcq.IMV_DestroyHandle();
  292. }
  293. }
  294. catch { }
  295. IsConnected = false;
  296. OnConnectChanged(false);
  297. }
  298. }
  299. #region 触发模式
  300. /// <summary>大华(iRayple/IMV)支持连续/软触发/硬触发(Line0)</summary>
  301. public override IReadOnlyList<CameraTriggerMode> SupportedTriggerModes => FullTriggerModes;
  302. /// <summary>历史行为:OpenDevice 硬编码 TriggerMode=Off,故默认连续采集</summary>
  303. protected override CameraTriggerMode DefaultTriggerMode => CameraTriggerMode.连续采集;
  304. protected override bool ApplyTriggerMode(CameraTriggerMode mode)
  305. {
  306. using (WriteLockScope())
  307. return ApplyTriggerToHardware(mode);
  308. }
  309. /// <summary>
  310. /// 把触发模式下发到大华 IMV SDK(GenICam 字符串接口,返回 IMV_OK = 成功)。
  311. /// 调用方需已持有写锁(OpenDevice/Grab 内部已在锁内;锁可重入)。
  312. /// </summary>
  313. private bool ApplyTriggerToHardware(CameraTriggerMode mode)
  314. {
  315. if (mvCameraAcq == null || !mvCameraAcq.IMV_IsOpen()) return false;
  316. mvCameraAcq.IMV_SetEnumFeatureSymbol("AcquisitionMode", "Continuous");
  317. switch (mode)
  318. {
  319. case CameraTriggerMode.连续采集:
  320. return mvCameraAcq.IMV_SetEnumFeatureSymbol("TriggerMode", "Off") == IMVDefine.IMV_OK;
  321. case CameraTriggerMode.软触发:
  322. mvCameraAcq.IMV_SetEnumFeatureSymbol("TriggerSource", "Software");
  323. return mvCameraAcq.IMV_SetEnumFeatureSymbol("TriggerMode", "On") == IMVDefine.IMV_OK;
  324. case CameraTriggerMode.硬触发上升沿:
  325. case CameraTriggerMode.硬触发下降沿:
  326. mvCameraAcq.IMV_SetEnumFeatureSymbol("TriggerSource", "Line0");
  327. mvCameraAcq.IMV_SetEnumFeatureSymbol("TriggerActivation",
  328. mode == CameraTriggerMode.硬触发上升沿 ? "Rising" : "Falling");
  329. return mvCameraAcq.IMV_SetEnumFeatureSymbol("TriggerMode", "On") == IMVDefine.IMV_OK;
  330. default: // 跟随相机:不下发,沿用相机自身配置
  331. return true;
  332. }
  333. }
  334. #endregion
  335. public override GenImage Grab()
  336. {
  337. using (WriteLockScope())
  338. {
  339. var sw = Stopwatch.StartNew();
  340. try
  341. {
  342. if (mvCameraAcq == null || !mvCameraAcq.IMV_IsOpen())
  343. {
  344. ErrorMessage = "相机未连接";
  345. return null;
  346. }
  347. mvCameraAcq.IMV_ClearFrameBuffer();
  348. // 仅软触发模式需主动发触发命令;连续采集自由出图,硬触发等外部信号
  349. if (IsSoftwareTrigger)
  350. mvCameraAcq.IMV_ExecuteCommandFeature("TriggerSoftware");
  351. int res = mvCameraAcq.IMV_GetFrame(ref frame, 1000);
  352. if (res == IMVDefine.IMV_OK)
  353. {
  354. try
  355. {
  356. // Mono图像处理
  357. if (IsMonoPixelFormat(frame.frameInfo.pixelFormat))
  358. {
  359. type = IMVDefine.IMV_EPixelType.gvspPixelMono8;
  360. if (frame.frameInfo.pixelFormat == IMVDefine.IMV_EPixelType.gvspPixelMono8)
  361. {
  362. pTemp = frame.pData;
  363. }
  364. else
  365. {
  366. if (pConvertDstBuffer == IntPtr.Zero || nConvertBufSize < (frame.frameInfo.width * frame.frameInfo.height))
  367. {
  368. if (pConvertDstBuffer != IntPtr.Zero)
  369. {
  370. Marshal.FreeHGlobal(pConvertDstBuffer);
  371. pConvertDstBuffer = IntPtr.Zero;
  372. }
  373. pConvertDstBuffer = Marshal.AllocHGlobal((int)(frame.frameInfo.width * frame.frameInfo.height));
  374. if (pConvertDstBuffer == IntPtr.Zero)
  375. {
  376. return null;
  377. }
  378. nConvertBufSize = (int)(frame.frameInfo.width * frame.frameInfo.height);
  379. }
  380. stPixelConvertParam.nWidth = frame.frameInfo.width;
  381. stPixelConvertParam.nHeight = frame.frameInfo.height;
  382. stPixelConvertParam.ePixelFormat = frame.frameInfo.pixelFormat;
  383. stPixelConvertParam.pSrcData = frame.pData;
  384. stPixelConvertParam.nSrcDataLen = frame.frameInfo.size;
  385. stPixelConvertParam.nPaddingX = frame.frameInfo.paddingX;
  386. stPixelConvertParam.nPaddingY = frame.frameInfo.paddingY;
  387. stPixelConvertParam.eBayerDemosaic = IMVDefine.IMV_EBayerDemosaic.demosaicNearestNeighbor;
  388. stPixelConvertParam.eDstPixelFormat = IMVDefine.IMV_EPixelType.gvspPixelMono8;
  389. stPixelConvertParam.pDstBuf = pConvertDstBuffer;
  390. stPixelConvertParam.nDstBufSize = frame.frameInfo.width * frame.frameInfo.height;
  391. res = mvCameraAcq.IMV_PixelConvert(ref stPixelConvertParam);
  392. if (res != IMVDefine.IMV_OK)
  393. {
  394. return null;
  395. }
  396. pTemp = pConvertDstBuffer;
  397. }
  398. }
  399. // 彩色图像处理
  400. else if (IsColorPixelFormat(frame.frameInfo.pixelFormat))
  401. {
  402. type = IMVDefine.IMV_EPixelType.gvspPixelRGB8;
  403. if (frame.frameInfo.pixelFormat == IMVDefine.IMV_EPixelType.gvspPixelRGB8)
  404. {
  405. pTemp = frame.pData;
  406. }
  407. else
  408. {
  409. if (pConvertDstBuffer == IntPtr.Zero || nConvertBufSize < (frame.frameInfo.width * frame.frameInfo.height * 3))
  410. {
  411. if (pConvertDstBuffer != IntPtr.Zero)
  412. {
  413. Marshal.FreeHGlobal(pConvertDstBuffer);
  414. pConvertDstBuffer = IntPtr.Zero;
  415. }
  416. pConvertDstBuffer = Marshal.AllocHGlobal((int)(frame.frameInfo.width * frame.frameInfo.height * 3));
  417. if (pConvertDstBuffer == IntPtr.Zero)
  418. {
  419. return null;
  420. }
  421. nConvertBufSize = (int)(frame.frameInfo.width * frame.frameInfo.height * 3);
  422. }
  423. stPixelConvertParam.nWidth = frame.frameInfo.width;
  424. stPixelConvertParam.nHeight = frame.frameInfo.height;
  425. stPixelConvertParam.ePixelFormat = frame.frameInfo.pixelFormat;
  426. stPixelConvertParam.pSrcData = frame.pData;
  427. stPixelConvertParam.nSrcDataLen = frame.frameInfo.size;
  428. stPixelConvertParam.nPaddingX = frame.frameInfo.paddingX;
  429. stPixelConvertParam.nPaddingY = frame.frameInfo.paddingY;
  430. stPixelConvertParam.eBayerDemosaic = IMVDefine.IMV_EBayerDemosaic.demosaicNearestNeighbor;
  431. stPixelConvertParam.eDstPixelFormat = IMVDefine.IMV_EPixelType.gvspPixelRGB8;
  432. stPixelConvertParam.pDstBuf = pConvertDstBuffer;
  433. stPixelConvertParam.nDstBufSize = frame.frameInfo.width * frame.frameInfo.height * 3;
  434. res = mvCameraAcq.IMV_PixelConvert(ref stPixelConvertParam);
  435. if (res != IMVDefine.IMV_OK)
  436. {
  437. return null;
  438. }
  439. pTemp = pConvertDstBuffer;
  440. }
  441. }
  442. else
  443. {
  444. return null;
  445. }
  446. Image = ConvertImage(frame.frameInfo.width, frame.frameInfo.height, pTemp, type);
  447. if (Image != null)
  448. {
  449. ImageWidth = (uint)Image.Width;
  450. ImageHeight = (uint)Image.Height;
  451. ApplyGammaToImage(Image);
  452. ErrorMessage = "";
  453. TotalTime = sw.Elapsed;
  454. return Image;
  455. }
  456. }
  457. catch (Exception)
  458. {
  459. }
  460. finally
  461. {
  462. mvCameraAcq.IMV_ReleaseFrame(ref frame);
  463. }
  464. }
  465. else
  466. {
  467. ErrorMessage = res.ToString();
  468. CloseDevice();
  469. OpenDevice();
  470. }
  471. }
  472. catch (Exception ex)
  473. {
  474. CloseDevice();
  475. OpenDevice();
  476. ErrorMessage = ex.Message;
  477. }
  478. return null;
  479. }
  480. }
  481. public override bool SetExposureTime(float exposureTime)
  482. {
  483. using (WriteLockScope())
  484. {
  485. try
  486. {
  487. if (mvCameraAcq != null && mvCameraAcq.IMV_IsOpen())
  488. {
  489. long val = (long)exposureTime;
  490. mvCameraAcq.IMV_SetIntFeatureValue("ExposureTime", val);
  491. }
  492. return true;
  493. }
  494. catch { return false; }
  495. }
  496. }
  497. public override float GetExposureTime()
  498. {
  499. using (ReadLockScope())
  500. {
  501. try
  502. {
  503. if (mvCameraAcq != null && mvCameraAcq.IMV_IsOpen())
  504. {
  505. long val = 0;
  506. mvCameraAcq.IMV_GetIntFeatureValue("ExposureTime", ref val);
  507. return (float)val;
  508. }
  509. }
  510. catch { }
  511. return 0;
  512. }
  513. }
  514. public override bool SetGain(float gain)
  515. {
  516. using (WriteLockScope())
  517. {
  518. try
  519. {
  520. if (mvCameraAcq != null && mvCameraAcq.IMV_IsOpen())
  521. {
  522. long val = (long)gain;
  523. mvCameraAcq.IMV_SetIntFeatureValue("Gain", val);
  524. }
  525. return true;
  526. }
  527. catch { return false; }
  528. }
  529. }
  530. public override float GetGain()
  531. {
  532. using (ReadLockScope())
  533. {
  534. try
  535. {
  536. if (mvCameraAcq != null && mvCameraAcq.IMV_IsOpen())
  537. {
  538. long val = 0;
  539. mvCameraAcq.IMV_GetIntFeatureValue("Gain", ref val);
  540. return (float)val;
  541. }
  542. }
  543. catch { }
  544. return 0;
  545. }
  546. }
  547. public override bool SetGamma(float gamma)
  548. {
  549. using (WriteLockScope())
  550. {
  551. try
  552. {
  553. if (mvCameraAcq != null && mvCameraAcq.IMV_IsOpen())
  554. {
  555. long val = (long)gamma;
  556. mvCameraAcq.IMV_SetIntFeatureValue("Gamma", val);
  557. return true;
  558. }
  559. }
  560. catch { }
  561. UpdateGammaSnapshot(gamma);
  562. return true;
  563. }
  564. }
  565. public override float GetGamma()
  566. {
  567. using (ReadLockScope())
  568. {
  569. try
  570. {
  571. if (mvCameraAcq != null && mvCameraAcq.IMV_IsOpen())
  572. {
  573. long val = 0;
  574. mvCameraAcq.IMV_GetIntFeatureValue("Gamma", ref val);
  575. return (float)val;
  576. }
  577. }
  578. catch { }
  579. return Gamma;
  580. }
  581. }
  582. #endregion
  583. #region 辅助方法
  584. private bool IsMonoPixelFormat(IMVDefine.IMV_EPixelType enType)
  585. {
  586. switch (enType)
  587. {
  588. case IMVDefine.IMV_EPixelType.gvspPixelMono8:
  589. case IMVDefine.IMV_EPixelType.gvspPixelMono10:
  590. case IMVDefine.IMV_EPixelType.gvspPixelMono10Packed:
  591. case IMVDefine.IMV_EPixelType.gvspPixelMono12:
  592. case IMVDefine.IMV_EPixelType.gvspPixelMono12Packed:
  593. return true;
  594. default:
  595. return false;
  596. }
  597. }
  598. private bool IsColorPixelFormat(IMVDefine.IMV_EPixelType enType)
  599. {
  600. switch (enType)
  601. {
  602. case IMVDefine.IMV_EPixelType.gvspPixelRGB8:
  603. case IMVDefine.IMV_EPixelType.gvspPixelBGR8:
  604. case IMVDefine.IMV_EPixelType.gvspPixelRGBA8:
  605. case IMVDefine.IMV_EPixelType.gvspPixelBGRA8:
  606. case IMVDefine.IMV_EPixelType.gvspPixelYUV422_8:
  607. case IMVDefine.IMV_EPixelType.gvspPixelYUV422_8_UYVY:
  608. case IMVDefine.IMV_EPixelType.gvspPixelBayGR8:
  609. case IMVDefine.IMV_EPixelType.gvspPixelBayRG8:
  610. case IMVDefine.IMV_EPixelType.gvspPixelBayGB8:
  611. case IMVDefine.IMV_EPixelType.gvspPixelBayBG8:
  612. case IMVDefine.IMV_EPixelType.gvspPixelBayGB10:
  613. case IMVDefine.IMV_EPixelType.gvspPixelBayGB10Packed:
  614. case IMVDefine.IMV_EPixelType.gvspPixelBayBG10:
  615. case IMVDefine.IMV_EPixelType.gvspPixelBayBG10Packed:
  616. case IMVDefine.IMV_EPixelType.gvspPixelBayRG10:
  617. case IMVDefine.IMV_EPixelType.gvspPixelBayRG10Packed:
  618. case IMVDefine.IMV_EPixelType.gvspPixelBayGR10:
  619. case IMVDefine.IMV_EPixelType.gvspPixelBayGR10Packed:
  620. case IMVDefine.IMV_EPixelType.gvspPixelBayGB12:
  621. case IMVDefine.IMV_EPixelType.gvspPixelBayGB12Packed:
  622. case IMVDefine.IMV_EPixelType.gvspPixelBayBG12:
  623. case IMVDefine.IMV_EPixelType.gvspPixelBayBG12Packed:
  624. case IMVDefine.IMV_EPixelType.gvspPixelBayRG12:
  625. case IMVDefine.IMV_EPixelType.gvspPixelBayRG12Packed:
  626. case IMVDefine.IMV_EPixelType.gvspPixelBayGR12:
  627. case IMVDefine.IMV_EPixelType.gvspPixelBayGR12Packed:
  628. return true;
  629. default:
  630. return false;
  631. }
  632. }
  633. public GenImage ConvertImage(UInt32 nWidth, UInt32 nHeight, IntPtr pImageBuf, IMVDefine.IMV_EPixelType enPixelType)
  634. {
  635. try
  636. {
  637. if (enPixelType == IMVDefine.IMV_EPixelType.gvspPixelMono8)
  638. {
  639. return GenImage.FromIntPtr((int)nWidth, (int)nHeight, PixelType.Grey8, pImageBuf, (int)nWidth);
  640. }
  641. else if (enPixelType == IMVDefine.IMV_EPixelType.gvspPixelRGB8)
  642. {
  643. return GenImage.FromIntPtr((int)nWidth, (int)nHeight, PixelType.RGB24, pImageBuf, (int)nWidth * 3);
  644. }
  645. else if (enPixelType == IMVDefine.IMV_EPixelType.gvspPixelBGR8)
  646. {
  647. return GenImage.FromIntPtr((int)nWidth, (int)nHeight, PixelType.BGR24, pImageBuf, (int)nWidth * 3);
  648. }
  649. return null;
  650. }
  651. catch (System.Exception)
  652. {
  653. return null;
  654. }
  655. }
  656. public static object ByteToStruct(Byte[] bytes, Type type)
  657. {
  658. int size = Marshal.SizeOf(type);
  659. if (size > bytes.Length)
  660. {
  661. return null;
  662. }
  663. IntPtr structPtr = Marshal.AllocHGlobal(size);
  664. Marshal.Copy(bytes, 0, structPtr, size);
  665. object obj = Marshal.PtrToStructure(structPtr, type);
  666. Marshal.FreeHGlobal(structPtr);
  667. return obj;
  668. }
  669. #endregion
  670. }
  671. }