在NutGet中安装pythonnet库并调用
using Python.Runtime;
Runtime.PythonDLL = @"C:\Users\22421\AppData\Local\Programs\Python\Python311\python311.dll";
PythonEngine.Initialize();
try
{
using (Py.GIL())
}
设置python dll路径,转到python环境
dynamic sys = Py.Import("sys");
string sdkPath = @"D:\Download\Thermal Camera_HAT\pysenxor-master"; // Eval 返回 PyObject,需要用 As
PyObject result = PythonEngine.Eval(<span data-formula=""'{sdkPath}' in sys.path", new PyDict { ["sys"] = sys });
bool contains = result.As
设置SDK路径
dynamic serialMod = Py.Import("serial"); dynamic mi48 = Py.Import("mi48"); dynamic interfaces_mod = Py.Import("interfaces");
// 1. 打开串口(举例COM3,可根据情况修改) dynamic ser = serialMod.Serial("COM6"); ser.baudrate = 115200; ser.rtscts = true; ser.dsrdtr = true; ser.timeout = 0.5; ser.write_timeout = 0.5;
// 2. 创建USB接口实例 dynamic usb_interface = interfaces_mod.USB_Interface(ser);
// 3. 创建接口列表,传入MI48构造函数 var pyList = new PyList(); pyList.Append(usb_interface); //pyList.Append(usb_interface); // 根据需求传入2个接口
// 4. 创建MI48相机对象,传入接口列表 dynamic camera = mi48.MI48(pyList); // 传入接口列表 // 不要调用 camera.open() //camera.regwrite(0xB1, 0x20); //设置 FRAME_MODE 为 NO_HEADER 模式 camera.regwrite(0xC2, 100); // 设置 SENS_FACTOR 为 100 (0x64) int frameMode = camera.regread(0xB1); int sensFactor = camera.regread(0xC2);
System.Console.WriteLine(" aria-hidden="true">"FRAME_MODE 寄存器当前值: 0x{frameMode:X2} (期望 0x20)"); System.Console.WriteLine(<span data-formula=""SENS_FACTOR 寄存器当前值: 0x{sensFactor:X2} (期望 0x64)"); 1.打开设置串口
2.创建USB接口实例
3.创建接口列表,传入MI48构造函数
4.创建MI48相机对象,传入接口列表
5.设置相机属性
int mode = camera.get_mode();
if (mode < 0) { Console.WriteLine("相机无法正常启动。"); }
else { Console.WriteLine("相机正常启动。"); }
检查相机是否启动
camera.clear_interface_buffers();
清除缓存并读取相机
if (frameResult != null && frameResult.Length() == 2)
{
dynamic data = frameResult[0]; dynamic header = frameResult[1];
// 这里 data 就是原始帧数据, header是帧相关信息
// 根据需要转换或解析 data
// 获取相机尺寸
int width = camera.cols;
int height = camera.rows;
dynamic np = Py.Import("numpy"); // 导入numpy并赋值给np变量
// 转 numpy array
dynamic arr = np.array(data, dtype: np.uint16);
if (arr.ndim == 1)
{
arr = arr.reshape(new int[] { height, width });
}
// 线性缩放转8位图像
dynamic arr_min = arr.min();
dynamic arr_ptp = arr.ptp();
dynamic arr_8bit = ((arr - arr_min) / arr_ptp * 255).astype(np.uint8);
// 转PIL图像
dynamic Image = Py.Import("PIL.Image");
dynamic img = Image.fromarray(arr_8bit, "L");
string filename = "frame_image.png";
img.save(filename);
System.Console.WriteLine(" aria-hidden="true"></span>"图像已保存到 {filename}");
}
else { Console.WriteLine("无法获取帧数据。"); }
数据转换并保存图像
关闭相机和pythonnet
本文章使用limfx的vscode插件快速发布