From 11f5607b004c67c65c6eabd4378feedba8674be2 Mon Sep 17 00:00:00 2001 From: Joe Date: Sun, 24 Nov 2024 12:08:59 +0000 Subject: [PATCH] no worky but will be faster if worky --- src/locate_light.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 41 ++++++++--------------------------------- 2 files changed, 52 insertions(+), 33 deletions(-) create mode 100644 src/locate_light.rs diff --git a/src/locate_light.rs b/src/locate_light.rs new file mode 100644 index 0000000..8d98a1a --- /dev/null +++ b/src/locate_light.rs @@ -0,0 +1,44 @@ +use nokhwa::{utils::FrameFormat, Camera, NokhwaError}; + +#[derive(Debug)] +pub enum LocatingError { + NokhwaError(NokhwaError), + FormatError, +} + +pub fn locate_light(camera: &mut Camera) -> Result<(u32, u32), LocatingError> { + let buffer = match camera.frame() { + Ok(frame) => Ok(frame), + Err(err) => Err(LocatingError::NokhwaError(err)), + }?; + + if buffer.source_frame_format() != FrameFormat::MJPEG { + return Err(LocatingError::FormatError); + } + + let width = buffer.resolution().width(); + let height = buffer.resolution().height(); + let buffer = buffer.buffer(); + let stride = width * 3; + + let mut avg = (0, 0); + let mut n = 0; + + for j in 0..height { + for i in 0..width { + let first_u8 = (i + j * stride) as usize; + if buffer[first_u8] as u32 + buffer[first_u8 + 1] as u32 + buffer[first_u8 + 2] as u32 + > 250 * 3 + { + avg.0 += i; + avg.1 += j; + n += 1; + } + } + } + + avg.0 /= n; + avg.1 /= n; + + Ok(avg) +} diff --git a/src/main.rs b/src/main.rs index cac8f02..84c14d6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,14 @@ +mod locate_light; + use nokhwa::{ pixel_format::RgbFormat, - utils::{CameraIndex, RequestedFormat, RequestedFormatType}, - Camera, + utils::{CameraIndex, FrameFormat, RequestedFormat, RequestedFormatType}, + Camera, NokhwaError, }; -use image::{DynamicImage, GenericImage, GenericImageView, Rgb, Rgba}; +use locate_light::locate_light; + +use image::{DynamicImage, GenericImage, GenericImageView, ImageBuffer, Rgb, Rgba}; use eframe::egui; @@ -21,34 +25,5 @@ fn main() { camera.open_stream(); - // get a frame - let frame = camera.frame().unwrap(); - println!("Captured Single Frame of {}", frame.buffer().len()); - // decode into an ImageBuffer - let decoded = frame.decode_image::().unwrap(); - let mut img = DynamicImage::from(decoded); - - let mut bright_spots: Vec<(u32, u32)> = vec![]; - - for (i, j, pxl) in img.pixels() { - let sum = pxl.0[0] as u32 + pxl.0[1] as u32 + pxl.0[2] as u32; - if sum > 250 * 3 { - bright_spots.push((i, j)); - } - } - - let mut sum = [0, 0]; - let n = bright_spots.len(); - - for (i, j) in bright_spots { - sum[0] += i; - sum[1] += j; - } - - sum[0] /= n as u32; - sum[1] /= n as u32; - - img.put_pixel(sum[0], sum[1], Rgba(RED)); - - img.save("test.png"); + locate_light(&mut camera).unwrap(); }