推理
每次调用处理一张图(一帧),结果输出 JSON。相机 / 视频连续帧请循环调用本函数;第一次 open 才有打开成本,不要每帧重新打开。
阻塞调用,耗时随 Provider / 硬件而定。不承诺硬实时——PLC 侧按架构在扫描周期外进程 / 线程调用。Windows 无 RKNN:rknn 载荷在打开会话时已被拒绝,不会进到本函数。
功能概览
| 类别 | 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|---|
| 推理 | darra_session_infer_image | int32_t | 过程 | 每次一张图(循环帧),结果 JSON |
| 输入 | darra_image_desc | struct | 入参 | 图像描述;调用方填 size |
darra_image_format | enum | 入参 | AUTO/ENCODED 或裸缓冲通道序 |
推理
darra_session_infer_image()
int32_t darra_session_infer_image(darra_session* session,
const uint8_t* image_bytes,
size_t len,
const darra_image_desc* desc,
char** out_results_json);
对一张图跑推理,结果输出 JSON。同一会话可并发调用(底层运行时会话线程安全;解密明文窗口由 SDK 内部串行管理);吞吐扩展推荐每线程一个会话。
参数:
session(darra_session*) — 已打开的会话image_bytes(const uint8_t*) — AUTO/ENCODED = 编码文件字节流(JPG/PNG/BMP);裸缓冲 = 像素内存len(size_t) — 字节数。裸缓冲必须 ≥stride * height(stride 为 0 时按 format 紧凑宽度计:RGB888/BGR888 = width×3,GRAY8 = width,RGBA8888 = width×4)desc(const darra_image_desc*) — 图像描述;desc->size必填。结构见 类型out_results_json(char**) — 结果 JSON,SDK 分配,用完darra_string_free
返回值:
int32_t—DARRA_OK成功;非 0 = 错误码
典型错误:DARRA_IO_DENIED(裸缓冲指针不可读)/ DARRA_INTERNAL(裸缓冲缺宽高、len 不足、desc->size 未填)。
示例:
darra_image_desc desc{};
desc.size = sizeof(desc);
desc.format = DARRA_IMAGE_AUTO;
char* results = nullptr;
int32_t rc = darra_session_infer_image(session, jpg.data(), jpg.size(),
&desc, &results);
if (rc == DARRA_OK) {
std::printf("%s\n", results);
darra_string_free(results);
}
工业相机裸缓冲(BGR 紧凑),循环帧:
darra_image_desc desc{};
desc.size = sizeof(desc);
desc.format = DARRA_IMAGE_BGR888;
desc.width = 1920;
desc.height = 1080;
desc.stride = 0;
for (;;) {
const uint8_t* frame = /* 相机当前帧,BGR 紧凑 */;
char* results = nullptr;
int32_t rc = darra_session_infer_image(
session, frame, static_cast<size_t>(1920) * 1080 * 3, &desc, &results);
if (rc != DARRA_OK) break;
std::printf("%s\n", results);
darra_string_free(results);
}
裸缓冲禁止 DARRA_IMAGE_AUTO(嗅探不出通道序)。缺宽高 / len 不足 = DARRA_INTERNAL。
完整示例
#include "darra_ai.h"
#include <cstdio>
#include <fstream>
#include <vector>
static int fail(const char* where, int32_t rc) {
darra_error_t err{};
err.size = sizeof(err);
darra_last_error(&err);
std::fprintf(stderr, "%s 失败 [%d] %s\n建议: %s\n",
where, err.code, err.message, err.hint);
return static_cast<int>(rc);
}
int main() {
darra_session* session = nullptr;
int32_t rc = darra_session_open("model.darmodel", "model.darmkey",
nullptr, nullptr, &session);
if (rc != DARRA_OK) return fail("darra_session_open", rc);
std::ifstream in("photo.jpg", std::ios::binary);
std::vector<uint8_t> jpg((std::istreambuf_iterator<char>(in)),
std::istreambuf_iterator<char>());
darra_image_desc desc{};
desc.size = sizeof(desc);
desc.format = DARRA_IMAGE_AUTO;
char* results = nullptr;
rc = darra_session_infer_image(session, jpg.data(), jpg.size(),
&desc, &results);
if (rc != DARRA_OK) {
darra_session_close(session);
return fail("darra_session_infer_image", rc);
}
std::printf("[results] %s\n", results);
darra_string_free(results);
darra_session_close(session);
return 0;
}