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::{
|
use nokhwa::{
|
||||||
pixel_format::RgbFormat,
|
pixel_format::RgbFormat,
|
||||||
utils::{CameraIndex, RequestedFormat, RequestedFormatType},
|
utils::{CameraIndex, FrameFormat, RequestedFormat, RequestedFormatType},
|
||||||
Camera,
|
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;
|
use eframe::egui;
|
||||||
|
|
||||||
@@ -21,34 +25,5 @@ fn main() {
|
|||||||
|
|
||||||
camera.open_stream();
|
camera.open_stream();
|
||||||
|
|
||||||
// get a frame
|
locate_light(&mut camera).unwrap();
|
||||||
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");
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user