如何用OpenVINO API 2.0从cv::Mat与cv::Rect创建单ROI张量
OpenVINO API 2.0 基于cv::Mat和cv::Rect实现无内存复制的ROI推理
核心实现思路
API 2.0中可通过ov::Tensor的重载构造函数直接基于原始张量创建ROI视图,完全避免内存复制。关键是将cv::Rect的坐标映射到ov::Coordinate的begin和end数组,映射逻辑需严格匹配模型输入的张量布局(比如你之前API 1.0中使用的NHWC)。
完整代码实现
// 假设已获取cv::Mat格式图像image,以及目标ROI的cv::Rect bounding_box // 假设模型输入布局为NHWC,数据类型为U8,输入shape为{1, H, W, 3} int channels = image.channels(); int image_height = image.rows; int image_width = image.cols; // 1. 将cv::Mat转换为ov::Tensor(共享内存,无复制) ov::Tensor full_tensor(ov::element::u8, ov::Shape({1, image_height, image_width, channels}), image.data); // 2. 将cv::Rect转换为ov::Coordinate的begin和end // NHWC布局下,维度顺序是[N, H, W, C] ov::Coordinate begin = { 0, // N维度起始(单batch固定为0) bounding_box.y, // H维度起始(对应cv::Rect的y) bounding_box.x, // W维度起始(对应cv::Rect的x) 0 // C维度起始(全通道固定为0) }; ov::Coordinate end = { 1, // N维度结束(单batch固定为1) bounding_box.y + bounding_box.height, // H维度结束 bounding_box.x + bounding_box.width, // W维度结束 channels // C维度结束(全通道为通道数) }; // 3. 创建ROI Tensor(共享原始内存,无复制) ov::Tensor roi_tensor(full_tensor, begin, end); // 4. 设置到推理请求 request.set_input_tensor(input_name, roi_tensor);
关键细节说明
- 布局匹配:若模型输入为NCHW布局,
begin和end的维度顺序需调整为{N, C, H, W},对应begin为{0, 0, bounding_box.y, bounding_box.x},end为{1, channels, bounding_box.y+bounding_box.height, bounding_box.x+bounding_box.width}。 - 内存连续性:需确保
cv::Mat是连续内存(可通过image.isContinuous()检查),若不连续,可先调用image = image.clone()转为连续内存。 - 数据类型一致性:
ov::element::u8需与模型输入数据类型完全匹配,若模型输入为FP32,需先做类型转换(ROI构造仅支持同类型张量视图)。
与API 1.0的对应关系
你之前API 1.0中make_roi_desc+make_shared_blob的逻辑,在API 2.0中简化为直接基于原始Tensor创建ROI视图,无需手动构建TensorDesc,底层同样共享原始内存,实现零拷贝推理。
内容的提问来源于stack exchange,提问作者Jared
相关产品推荐
相关产品推荐

