用C#调用python脚本采集摄像头

环境

在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环境

调用SDK

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插件快速发布