First made read_frame
This commit is contained in:
parent
c7ed0174d5
commit
958b0d0c60
|
@ -76,7 +76,7 @@ fn write_bytes(path: &str, data: Vec<u8>) -> anyhow::Result<()> {
|
||||||
}
|
}
|
||||||
|
|
||||||
//Returns average value of the pixel given size and location
|
//Returns average value of the pixel given size and location
|
||||||
fn get_pixel(frame: &mut EmbedSource, x: i32, y: i32) -> Option<()> {
|
fn get_pixel(frame: &EmbedSource, x: i32, y: i32) -> Option<Vec<u8>> {
|
||||||
if frame.size % 2 != 1 {
|
if frame.size % 2 != 1 {
|
||||||
panic!("Used even size for pixels, please choose something odd");
|
panic!("Used even size for pixels, please choose something odd");
|
||||||
}
|
}
|
||||||
|
@ -89,15 +89,31 @@ fn get_pixel(frame: &mut EmbedSource, x: i32, y: i32) -> Option<()> {
|
||||||
|
|
||||||
for i in -half_size..half_size+1 {
|
for i in -half_size..half_size+1 {
|
||||||
for j in -half_size..half_size+1 {
|
for j in -half_size..half_size+1 {
|
||||||
let bgr: &VecN<u8, 3> = frame.image.at_2d::<opencv::core::Vec3b>(y+i, x+j).unwrap();
|
let bgr = frame.image.at_2d::<opencv::core::Vec3b>(y+i, x+j).unwrap();
|
||||||
//could reduce size of integers ?
|
//could reduce size of integers ?
|
||||||
r_list.push(bgr[2]);
|
r_list.push(bgr[2]);
|
||||||
g_list.push(bgr[1]);
|
g_list.push(bgr[1]);
|
||||||
b_list.push(bgr[0]);
|
b_list.push(bgr[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// return Some(rgb_average);
|
|
||||||
return None;
|
//A hacked on solution, do better
|
||||||
|
let r_sum: usize = r_list.iter().map(|&x| x as usize).sum();
|
||||||
|
let r_average = r_sum / r_list.len();
|
||||||
|
let g_sum: usize = g_list.iter().map(|&x| x as usize).sum();
|
||||||
|
let g_average = g_sum / g_list.len();
|
||||||
|
let b_sum: usize = b_list.iter().map(|&x| x as usize).sum();
|
||||||
|
let b_average = b_sum / b_list.len();
|
||||||
|
|
||||||
|
//Potentially unnecessary conversion
|
||||||
|
let rgb_average = vec![
|
||||||
|
r_average as u8,
|
||||||
|
g_average as u8,
|
||||||
|
b_average as u8
|
||||||
|
];
|
||||||
|
dbg!(&rgb_average);
|
||||||
|
|
||||||
|
return Some(rgb_average);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Draws the pixels, exists so you can draw bigger blocks
|
//Draws the pixels, exists so you can draw bigger blocks
|
||||||
|
@ -176,8 +192,49 @@ fn etch_frame(source: &mut EmbedSource, data: &Data, global_index: &mut usize)
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_frame() {
|
pub fn read_frame(source: &EmbedSource, out_mode: &OutputMode) {
|
||||||
|
let size = source.size as usize;
|
||||||
|
let half_size = (source.size/2) as i32;
|
||||||
|
let width = source.width;
|
||||||
|
let height = source.height;
|
||||||
|
|
||||||
|
//Fix this nesting spiral
|
||||||
|
match out_mode {
|
||||||
|
OutputMode::Color => {
|
||||||
|
let mut byte_data: Vec<u8> = Vec::new();
|
||||||
|
for y in (half_size..height).step_by(size) {
|
||||||
|
for x in (half_size..width).step_by(size) {
|
||||||
|
let rgb = get_pixel(&source, x, y);
|
||||||
|
if rgb == None {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
let rgb = rgb.unwrap();
|
||||||
|
byte_data.push(rgb[0]);
|
||||||
|
byte_data.push(rgb[1]);
|
||||||
|
byte_data.push(rgb[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
OutputMode::Binary => {
|
||||||
|
let mut binary_data: Vec<bool> = Vec::new();
|
||||||
|
for y in (half_size..height).step_by(size) {
|
||||||
|
for x in (half_size..width).step_by(size) {
|
||||||
|
let rgb = get_pixel(&source, x, y);
|
||||||
|
if rgb == None {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
let rgb = rgb.unwrap();
|
||||||
|
if rgb[0] == 255 {
|
||||||
|
binary_data.push(true);
|
||||||
|
} else {
|
||||||
|
binary_data.push(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
Instructions:
|
Instructions:
|
||||||
|
|
|
@ -3,8 +3,10 @@ mod etcher;
|
||||||
mod settings;
|
mod settings;
|
||||||
mod embedsource;
|
mod embedsource;
|
||||||
|
|
||||||
|
use etcher::read_frame;
|
||||||
use settings::{Data, Settings};
|
use settings::{Data, Settings};
|
||||||
|
|
||||||
|
//Make RGB a struct
|
||||||
//Make it calculate how much data is jammed in 1 frame for user
|
//Make it calculate how much data is jammed in 1 frame for user
|
||||||
fn main() -> anyhow::Result<()> {
|
fn main() -> anyhow::Result<()> {
|
||||||
// ui::summon_gooey();
|
// ui::summon_gooey();
|
||||||
|
@ -14,7 +16,8 @@ fn main() -> anyhow::Result<()> {
|
||||||
|
|
||||||
let settings = Settings::new(1, 30, 640, 360);
|
let settings = Settings::new(1, 30, 640, 360);
|
||||||
|
|
||||||
etcher::etch("src/out/output.avi", data, settings)?;
|
read_frame();
|
||||||
|
// etcher::etch("src/out/output.avi", data, settings)?;
|
||||||
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue