我正在使用 OV7670 相机的 arudino uno 项目使用 此代码。效果很好。借助名为“串行端口读取器”的工具(我从文章中的链接下载),我可以从相机查看图像(仅限 Windows)。
我正在尝试重写这个工具来读取 Rust 中的图像(因为我想在 Mac 上使用它)。 我已成功连接并读取 USB 端口的输出,但无法将这些原始字节转换为合理的内容。
UDR0 = (PINC & 15) | (PIND & 240);
在 captureImg
功能中。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-79500yuv422 YVYU
字节转换为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();
}
我在github上找到的。 https://github.com/akio777/DATA-COM.git 有“ReadSerialPortWin.exe”源代码。