From 98c0775fe3b61a37d90dd5756287f385a311adf0 Mon Sep 17 00:00:00 2001
From: C3204 <zhengyabo@lanpucloud.cn>
Date: 星期三, 15 四月 2026 20:09:49 +0800
Subject: [PATCH] 验证3D相机亮度图无法获取

---
 LB_VisionProcesses/Cameras/LBCameras/LBCamera.cs |  142 ++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 132 insertions(+), 10 deletions(-)

diff --git a/LB_VisionProcesses/Cameras/LBCameras/LBCamera.cs b/LB_VisionProcesses/Cameras/LBCameras/LBCamera.cs
index 0daf50c..f82b884 100644
--- a/LB_VisionProcesses/Cameras/LBCameras/LBCamera.cs
+++ b/LB_VisionProcesses/Cameras/LBCameras/LBCamera.cs
@@ -2,6 +2,8 @@
 using LB_SmartVisionCameraSDK.PHM6000;
 using LB_SmartVisionCommon;
 using LB_VisionProcesses.Cameras;
+using OpenCvSharp;
+using OpenCvSharp.Extensions;
 using OpenVinoSharp.Extensions.model;
 using SharpCompress.Common;
 using Sunny.UI.Win32;
@@ -151,11 +153,11 @@
 
                     // 鍒濆鍖栧苟娉ㄥ唽閲囬泦鍥炶皟 (鑾峰彇鏁版嵁鐢�)
                     _acquisitionCallback = new AcquisitionCallbackZA(OnAcquisitionCallbackZA);
-                    PHM6000Profiler.SetAcquisitionCallbackZA(_cameraHandle, _acquisitionCallback, IntPtr.Zero);
+                    PHM6000Profiler.SetAcquisitionCallbackZA(_cameraHandle, _acquisitionCallback, new IntPtr());
 
                     // 鍒濆鍖栧苟娉ㄥ唽閲囬泦瀹屾垚鍥炶皟 (鐘舵�侀�氱煡鐢�)
-                    _acquisitionCompletedCallback = new AcquisitionCompletedCallback(OnAcquisitionCompleted);
-                    PHM6000Profiler.RegisterAcquisitionCompletedCallback(_cameraHandle, _acquisitionCompletedCallback, IntPtr.Zero);
+                    _acquisitionCompletedCallback += OnAcquisitionCompleted;
+                    PHM6000Profiler.RegisterAcquisitionCompletedCallback(_cameraHandle, _acquisitionCompletedCallback, new IntPtr());
 
                     // 寮哄埗搴旂敤褰撳墠閰嶇疆锛堢‘淇濊Е鍙戞ā寮忕瓑鍙傛暟姝g‘锛岄伩鍏嶇浉鏈哄浜庢湭鐭ョ姸鎬侊級
                     UpdateSensorConfig(_sensorConfig);
@@ -360,7 +362,35 @@
             config = new CameraConfig(null);
             //UpdateSensorConfig(config);
         }
-        public override bool GetImage(out Bitmap bitmap, int outtime = 3000) { bitmap = null; return false; }
+        public override bool GetImage(out Bitmap bitmap, int outtime = 14500)
+        {
+            bitmap = null;
+            try
+            {
+                // 璁剧疆瓒呮椂鏃堕棿
+                DateTime lastTime = DateTime.Now.AddMilliseconds(outtime);
+                // 鍒ゆ柇鏄惁瓒呮椂
+                while (lastTime > DateTime.Now)// 璁剧疆瓒呮椂鏃堕棿涓� 3 绉�
+                {
+                    if (CallBackImg != null)
+                    {
+                        lock (CallBackImg)
+                        {
+                            // 淇濆瓨鏃� Bitmap 骞堕噴鏀�
+                            bitmap = CallBackImg; // 鍒涘缓鍓湰
+                        }
+
+                        //// 閲婃斁鏃ц祫婧�
+                        //CallBackImg.Dispose();
+                        //CallBackImg = null;
+                        return true;
+                    }
+                }
+
+                return false;
+            }
+            catch { return bitmap == null ? false : true; }
+        }
         public override bool GetImageWithSoftTrigger(out Bitmap bitmap, int outtime = 3000)
         {
             // 绠�鍗曞疄鐜帮細杞Е鍙戠瓑寰�
@@ -558,6 +588,8 @@
                 }
             }
         }
+        private Bitmap bitmap1;
+        private int nWidth = 0, nHeight = 0;
 
         private void OnAcquisitionCompleted(IntPtr pInstance, int nOption)
         {
@@ -599,7 +631,84 @@
             }
             else if (nOption == 2)
             {
+                AsyncLogHelper.Info($"LBCamera[{SN}]: Processing End...");
+                IntPtr INTPTRImage = PHM6000Profiler.GetIntensityData(_cameraHandle, ref nWidth, ref nHeight);
+                bitmap1 = IntensityPtrToMatCloned(INTPTRImage, nWidth, nHeight);
+            }
+        }
 
+        public Bitmap ConvertIntensityToBitmap(IntPtr dataPtr, int width, int height)
+        {
+
+            if (dataPtr == IntPtr.Zero || width <= 0 || height <= 0)
+                throw new InvalidOperationException("鑾峰彇寮哄害鏁版嵁澶辫触鎴栧昂瀵告棤鏁堛��");
+
+            // 鍒涘缓 8bpp 绱㈠紩浣嶅浘
+            Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
+
+            // 璁剧疆鐏板害璋冭壊鏉匡紙蹇呴』锛屽惁鍒欐樉绀哄紓甯革級
+            ColorPalette palette = bitmap.Palette;
+            for (int i = 0; i < 256; i++)
+            {
+                palette.Entries[i] = Color.FromArgb(i, i, i);
+            }
+            bitmap.Palette = palette;
+
+            // 閿佸畾浣嶅浘鏁版嵁
+            BitmapData bmpData = bitmap.LockBits(
+                new Rectangle(0, 0, width, height),
+                ImageLockMode.WriteOnly,
+                PixelFormat.Format8bppIndexed);
+
+            try
+            {
+                int srcStride = width;                     // 婧愭暟鎹瘡琛屽瓧鑺傛暟锛堟棤濉厖锛�
+                int dstStride = bmpData.Stride;             // 浣嶅浘姣忚瀛楄妭鏁帮紙鍙兘瀵归綈锛�
+                int copyBytesPerRow = Math.Min(srcStride, dstStride);
+
+                IntPtr srcRowPtr = dataPtr;
+                IntPtr dstRowPtr = bmpData.Scan0;
+
+                // 閫愯澶嶅埗锛屽鐞嗗彲鑳界殑姝ュ箙宸紓
+                for (int y = 0; y < height; y++)
+                {
+                    // 浣跨敤 Buffer.MemoryCopy 鎴� Marshal.Copy 鎸夎澶嶅埗
+                    unsafe
+                    {
+                        Buffer.MemoryCopy(
+                            srcRowPtr.ToPointer(),
+                            dstRowPtr.ToPointer(),
+                            dstStride,          // 鐩爣缂撳啿鍖哄墿浣欏ぇ灏忥紙鑷冲皯涓�琛岋級
+                            copyBytesPerRow);    // 瀹為檯澶嶅埗瀛楄妭鏁�
+                    }
+
+                    // 绉诲姩鍒颁笅涓�琛�
+                    srcRowPtr = IntPtr.Add(srcRowPtr, srcStride);
+                    dstRowPtr = IntPtr.Add(dstRowPtr, dstStride);
+                }
+            }
+            finally
+            {
+                bitmap.UnlockBits(bmpData);
+            }
+
+            return bitmap;
+        }
+
+
+        public static Bitmap IntensityPtrToMatCloned(IntPtr dataPtr, int width, int height)
+        {
+
+            if (dataPtr == IntPtr.Zero || width <= 0 || height <= 0)
+            {
+                throw new Exception("Failed to get intensity data.");
+            }
+
+            // 鍏堝垱寤哄紩鐢ㄥ閮ㄦ暟鎹殑 Mat
+            using (Mat temp = Mat.FromPixelData(height, width, MatType.CV_8UC1, dataPtr, width))
+            {
+                // 鍏嬮殕涓�浠界嫭绔嬪唴瀛樼殑 Mat
+                return temp.ToBitmap();
             }
         }
 
@@ -649,8 +758,10 @@
                 bmp.UnlockBits(bmpData);
                 bmpData = null; // 鏍囪宸茶В閿�
 
+
+
                 _frameCount++;
-                AsyncLogHelper.Info($"LBCamera[{SN}]: 鐢熸垚绗� {_frameCount} 甯� ({width}x{height})");
+                AsyncLogHelper.Info($"LBCamera[{SN}]: 鐢熸垚绗� {_frameCount} 甯� ({nWidth}x{nHeight})");
 
                 // 3. 鑾峰彇/鍒涘缓绾跨▼瀹夊叏闃熷垪
                 var queue = CollectedImages.GetOrAdd(SN, new ConcurrentQueue<Bitmap>());
@@ -695,9 +806,9 @@
                 // 寮哄埗璧勬簮閲婃斁锛岀粷瀵规潨缁濇硠婕�
                 if (bmpData != null)
                 {
-                    try { bmp?.UnlockBits(bmpData); } catch { }
+                    try { bitmap1?.UnlockBits(bmpData); } catch { }
                 }
-                // 娉ㄦ剰锛歜mp 宸插叆闃燂紝涓嶈兘鍦ㄨ繖閲岄噴鏀撅紝鐢辫皟鐢ㄨ�呴噴鏀�
+                //娉ㄦ剰锛歜mp 宸插叆闃燂紝涓嶈兘鍦ㄨ繖閲岄噴鏀撅紝鐢辫皟鐢ㄨ�呴噴鏀�
             }
         }
 
@@ -784,12 +895,16 @@
 
                     if (Enum.TryParse(typeof(EnumNameId), p.Name, out object nameIdObj))
                     {
-                        EnumNameId nameId = (EnumNameId)nameIdObj;
+                        //EnumNameId nameId = (EnumNameId)nameIdObj;
+                        var nameId = Enum.Parse(typeof(EnumNameId), p.Name);
                         int intValue = 0;
                         double doubleValue = 0;
                         int enumValue = 0;
+                        var id = Convert.ToInt32(nameId);
+                        var rst = PHM6000Profiler.GetProfilerParameter(_cameraHandle, id, ref intValue, ref doubleValue, ref enumValue);
 
-                        if (PHM6000Profiler.GetProfilerParameter(_cameraHandle, (int)nameId, ref intValue, ref doubleValue, ref enumValue) == 0)
+
+                        if (rst == 0)
                         {
                             if (p.PropertyType == typeof(int))
                             {
@@ -805,7 +920,14 @@
                             }
                             else // Enum or other types
                             {
-                                p.SetValue(_sensorConfig, enumValue);
+                                if (p.Name.Equals("ROI"))
+                                {
+
+                                }
+                                else
+                                {
+                                    p.SetValue(_sensorConfig, enumValue);
+                                }
                             }
                         }
                     }

--
Gitblit v1.9.3