如何在rust中读取和保存arduino UNO的OV7670相机的输出?

问题描述 投票:0回答:1

我在做什么

我正在使用 OV7670 相机的 arudino uno 项目使用 此代码。效果很好。借助名为“串行端口读取器”的工具(我从文章中的链接下载),我可以从相机查看图像(仅限 Windows)。

我正在尝试重写这个工具来读取 Rust 中的图像(因为我想在 Mac 上使用它)。 我已成功连接并读取 USB 端口的输出,但无法将这些原始字节转换为合理的内容。

我的理解:

  • 它用这行代码输出原始像素
    UDR0 = (PINC & 15) | (PIND & 240);
    captureImg
    功能中。
  • 这些像素采用 yuv422 格式,因为我们使用这些设置
    const struct regval_list yuv422_ov7670
  • 字节顺序设置为
    Y V Y U
    ,因为我们在
    { REG_COM13, COM13_UVSAT }
    中设置
    yuv422_ov7670
    。我在第 18 页的此数据表中找到了此信息。

也许我做错了?

我不明白的是:

  • 为什么我的输出具有随机大小?
    • 在开始发送像素字节之前,它会发送
      *RDY*
      字符串字节,以便我可以确定何时开始解码。
    • 代码显示
      captureImg(320, 240)
      ,这意味着应该有 320x240 = 76800 像素。但是 2 个
      *RDY*
      命令之间的字节数在 79000-79500
    • 范围内
  • 如何将这个
    yuv422 YVYU
    字节转换为rgb?
    • Google 表示,2 个像素按 Y0 V Y1 U 顺序编码为 4 个字节,其中 V 和 U 均由 2 个像素使用,每个像素都有一个单独的 Y 字节。
    • 另一个谷歌答案表明1个像素被编码为2个字节,其中第一个字节是Y,第二个字节的高4位代表V,低4位代表U。
    • 我找到了这个板条箱,它可以将 yuv 转换为 rgb,但它要求我提供
      MatrixCoefficients
      ,我不知道。
      yuv422_ov7670
      里面有一些矩阵系数,但我怎样才能理解它们是什么?

代码

这个函数接受字节数组,将其中的每 4 个字节转换为 2 个 RGB 像素,并在图像箱的帮助下保存结果(这就是为什么一半图像是黑色的,我没有足够的字节来转换) .

fn decode_and_save(data: &[u8]) {
    let mut imgbuf = image::ImageBuffer::new(IMAGE_WIDTH, IMAGE_HEIGHT);
    let mut ix = IMAGE_WIDTH;
    let mut iy = IMAGE_HEIGHT;
    let converter = RGBConvert::<u8>::new(Range::Full, MatrixCoefficients::BT709).unwrap();
    for ch in data.chunks_exact(4) {
        let yuv1 = YUV {
            y: ch[0],
            v: ch[1],
            u: ch[3],
        };
        let yuv2 = YUV {
            y: ch[2],
            v: ch[1],
            u: ch[3],
        };

        let rgb1 = converter.to_rgb(yuv1);
        let rgb2 = converter.to_rgb(yuv2);

        imgbuf.put_pixel(ix - 1, iy - 1, Rgb([rgb1.r, rgb1.g, rgb1.b]));
        imgbuf.put_pixel(ix - 2, iy - 1, Rgb([rgb2.r, rgb2.g, rgb2.b]));
        ix -= 2;

        if ix == 0 {
            ix = IMAGE_WIDTH;
            iy -= 1;
        }
        if iy == 0 {
            break;
        }
    }
    imgbuf.save("./test.png").unwrap();
}

由于我的代码中存在多个错误,我得到了this result image。 虽然原来的工具能够保存this perfect result image

c++ rust arduino embedded
1个回答
0
投票

我在github上找到的。 https://github.com/akio777/DATA-COM.git 有“ReadSerialPortWin.exe”源代码。

© www.soinside.com 2019 - 2024. All rights reserved.