no worky but will be faster if worky

This commit is contained in:
2024-11-24 12:08:59 +00:00
parent 419aa50e82
commit 11f5607b00
2 changed files with 52 additions and 33 deletions

44
src/locate_light.rs Normal file
View File

@@ -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)
}

View File

@@ -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::<RgbFormat>().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();
}