跳到主要内容

推理

每次调用处理一张图(一帧),结果输出 JSON。相机 / 视频连续帧请循环调用本函数;第一次 open 才有打开成本,不要每帧重新打开。

阻塞调用,耗时随 Provider / 硬件而定。不承诺硬实时——PLC 侧按架构在扫描周期外进程 / 线程调用。Windows 无 RKNN:rknn 载荷在打开会话时已被拒绝,不会进到本函数。

提示
  • 先打开会话见 打开
  • darra_image_format / darra_image_desc 定义见 类型
  • 结果 envelope 见 类型

功能概览

类别属性类型访问说明
推理darra_session_infer_imageint32_t过程每次一张图(循环帧),结果 JSON
输入darra_image_descstruct入参图像描述;调用方填 size
darra_image_formatenum入参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_tDARRA_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;
}