no worky but will be faster if worky
This commit is contained in:
44
src/locate_light.rs
Normal file
44
src/locate_light.rs
Normal 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)
|
||||
}
|
||||
41
src/main.rs
41
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::<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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user