背景

算法组在对摄像头进行算法实现是用的 Python 来进行的模拟实现,但 Python 在调用对应的库进行操作时出现了延迟过大的问题以及无法取到对应的数据导致业务逻辑无法实现,因此我这边编写了一个专门的 SDK 提供给算法组进行使用。这里主要是记录下 Python 如何调用DLL

实现

DLL 对外接口

#ifndef PY_CAPTURE_H_
#define PY_CAPTURE_H_

#define DLLEXPORT extern "C" __declspec(dllexport)

DLLEXPORT void init(int w, int h, char *name);

DLLEXPORT void start();

DLLEXPORT void stop();

DLLEXPORT unsigned char *get_frame();

DLLEXPORT void save_frame(const char *path);

#endif //PY_CAPTURE_H_

Python 对接

import ctypes, cv2, os
import numpy as np

# 示例dll路径
os.add_dll_directory(r"D:\\")
lib = ctypes.cdll.LoadLibrary(r"D:\SDK\CaptrueSdk.dll")
# init 中输入分辨率大小和设备名
lib.init(1280, 720, b"UVC Camera")
# 开始捕获视频流
lib.start()
# 定义返回类型
lib.get_frame.restype = ctypes.POINTER(ctypes.c_uint16)
pointer = lib.get_frame()

while True:
pointer = lib.get_frame()
_src = np.asarray(np.fromiter(pointer, dtype=np.uint16, count=1280 * 720))
src = _src.reshape((720, 1280))
# 保存frame
lib.save_frame()
# 灰度化
img = cv2.cvtColor(((src / src.max()) * 255).astype(np.uint8), cv2.COLOR_GRAY2BGR)
image = np.array(img)
# 预览视频
cv2.imshow("RAW", image)
cv2.waitKey(1)