将 Mat 转换为 Vec<u8> (Rust OpenCV)

时间:2021-06-14 12:12:37

标签: opencv types rust casting

我真的是 Rust 的新手,也是 OpenCV 的新手(是的)。

我有一个在单独的 POC 中工作的简单 OpenCV 示例。但随后将其集成到工作流管道中,我需要返回类型为 Vec<u8> 的缓冲区。

Img 是一个 Mat 对象,它具有这个 to_vec_2d 方法。但我不确定如何将其转换为 u8?

我想我可能需要遍历 Mat 类型。 u8可以映射吗?

fn edge_detect(width: u32, height: u32, bytes: Vec<u8>, _metadata: Metadata) -> (u32, u32, Vec<u8>) {
    let img = imdecode(&Vector::from_iter(bytes), imgcodecs::IMREAD_ANYCOLOR).expect("Failed to decode");
    let mut result = img.clone();
    canny(&img, &mut result, 100.0, 200.0, 3, false).expect("Failed to find edges");
    let vec_result : Vec<u8> = result.to_vec_2d().expect("Cannot convert to vector");
    (width, height, vec_result)
}

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以在迭代器上使用 flat_map 来获取它们:

fn main() {
    let vec_2d = vec![vec![0, 1], vec![2, 3]];
    let v: Vec<u8> = vec_2d.iter().flat_map(|v| v.iter()).cloned().collect();
    println!("{:?}", v);
}

Playground