From b48ac75b89e94e3f70da5a2233e18734aa271682 Mon Sep 17 00:00:00 2001
From: C3204 <zhengyabo@lanpucloud.cn>
Date: 星期四, 16 四月 2026 13:45:50 +0800
Subject: [PATCH] 丐版相机外触发同一流程触发一次。
---
LB_VisionProcesses/Cameras/LBCameras/LBCamera.cs | 154 +++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 142 insertions(+), 12 deletions(-)
diff --git a/LB_VisionProcesses/Cameras/LBCameras/LBCamera.cs b/LB_VisionProcesses/Cameras/LBCameras/LBCamera.cs
index 0daf50c..f8d56f5 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,14 +153,14 @@
// 鍒濆鍖栧苟娉ㄥ唽閲囬泦鍥炶皟 (鑾峰彇鏁版嵁鐢�)
_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);
+ //UpdateSensorConfig(_sensorConfig);
AsyncLogHelper.Info($"LBCamera[{SN}]: Connected and initialized successfully (Manual Data Mode)");
@@ -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,12 +631,93 @@
}
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();
}
}
private void CreateAndFireBitmap()
{
+ if (!isProcess.Equals("0") && !_isProcess)
+ {
+ _isProcess = true;
+ }
Bitmap bmp = null;
BitmapData bmpData = null;
@@ -649,8 +762,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 +810,9 @@
// 寮哄埗璧勬簮閲婃斁锛岀粷瀵规潨缁濇硠婕�
if (bmpData != null)
{
- try { bmp?.UnlockBits(bmpData); } catch { }
+ try { bitmap1?.UnlockBits(bmpData); } catch { }
}
- // 娉ㄦ剰锛歜mp 宸插叆闃燂紝涓嶈兘鍦ㄨ繖閲岄噴鏀撅紝鐢辫皟鐢ㄨ�呴噴鏀�
+ //娉ㄦ剰锛歜mp 宸插叆闃燂紝涓嶈兘鍦ㄨ繖閲岄噴鏀撅紝鐢辫皟鐢ㄨ�呴噴鏀�
}
}
@@ -731,6 +846,10 @@
{
try
{
+ if (!isProcess.Equals("0") && _isProcess)
+ {
+ _isProcess = false;
+ }
// 鍏抽敭锛氫簨浠朵紶閫掑厠闅嗗璞★紝缁濆瀹夊叏锛屼笉浼犻�掑師璧勬簮
using (Bitmap clone = (Bitmap)bitmap.Clone())
{
@@ -742,7 +861,7 @@
// 瑙﹀彂妯″紡鍒ゆ柇
if (GetTriggerMode(out TriggerMode mode, out TriggerSource source))
{
- if (mode == TriggerMode.On && source != TriggerSource.Software)
+ if (mode == TriggerMode.On && source != TriggerSource.Software && (isProcess.Equals("0") || !_isProcess))
{
TriggerRunMessageReceived?.Invoke(SN, source.ToString());
AsyncLogHelper.Info($"LBCamera[{SN}]: 纭Е鍙戜簨浠� - {source}");
@@ -784,12 +903,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 +928,14 @@
}
else // Enum or other types
{
- p.SetValue(_sensorConfig, enumValue);
+ if (p.Name.Equals("ROI"))
+ {
+
+ }
+ else
+ {
+ p.SetValue(_sensorConfig, enumValue);
+ }
}
}
}
--
Gitblit v1.9.3