refactored unsafe calls into mediagraph struct
This commit is contained in:
		
							parent
							
								
									9f758c730f
								
							
						
					
					
						commit
						20cc045f11
					
				
							
								
								
									
										120
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										120
									
								
								src/lib.rs
									
									
									
									
									
								
							| 
						 | 
					@ -19,7 +19,7 @@ mod bindings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub use bindings::*;
 | 
					pub use bindings::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Mediagraph = mediagraph_Mediagraph;
 | 
					type GraphType = mediagraph_GraphType;
 | 
				
			||||||
type Landmark = mediagraph_Landmark;
 | 
					type Landmark = mediagraph_Landmark;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl Default for Landmark {
 | 
					impl Default for Landmark {
 | 
				
			||||||
| 
						 | 
					@ -70,6 +70,35 @@ impl Default for FaceMesh {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct Mediagraph {
 | 
				
			||||||
 | 
					    graph: *mut mediagraph_Mediagraph,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl Mediagraph {
 | 
				
			||||||
 | 
					    fn new(graph_type: GraphType, graph_config: &str, output_node: &str) -> Self {
 | 
				
			||||||
 | 
					        let graph_config = CString::new(graph_config).expect("CString::new failed");
 | 
				
			||||||
 | 
					        let output_node = CString::new(output_node).expect("CString::new failed");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let graph: *mut mediagraph_Mediagraph = unsafe {
 | 
				
			||||||
 | 
					            mediagraph_Mediagraph::Create(graph_type, graph_config.as_ptr(), output_node.as_ptr())
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Self { graph }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn process(&mut self, input: &Mat) {
 | 
				
			||||||
 | 
					        let mut data = input.clone();
 | 
				
			||||||
 | 
					        let landmarks = unsafe {
 | 
				
			||||||
 | 
					            mediagraph_Mediagraph_Process(
 | 
				
			||||||
 | 
					                self.graph as *mut std::ffi::c_void,
 | 
				
			||||||
 | 
					                data.data_mut(),
 | 
				
			||||||
 | 
					                data.cols(),
 | 
				
			||||||
 | 
					                data.rows(),
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub mod pose {
 | 
					pub mod pose {
 | 
				
			||||||
    use super::*;
 | 
					    use super::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -114,22 +143,16 @@ pub mod pose {
 | 
				
			||||||
        pub smooth: bool,       // true,
 | 
					        pub smooth: bool,       // true,
 | 
				
			||||||
        pub detection_con: f32, // 0.5
 | 
					        pub detection_con: f32, // 0.5
 | 
				
			||||||
        pub track_con: f32,     // 0.5
 | 
					        pub track_con: f32,     // 0.5
 | 
				
			||||||
        pub graph: *mut Mediagraph,
 | 
					        graph: Mediagraph,
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    impl PoseDetector {
 | 
					    impl PoseDetector {
 | 
				
			||||||
        pub fn new(mode: bool, smooth: bool, detection_con: f32, track_con: f32) -> Self {
 | 
					        pub fn new(mode: bool, smooth: bool, detection_con: f32, track_con: f32) -> Self {
 | 
				
			||||||
            let graph_config =
 | 
					            let graph = Mediagraph::new(
 | 
				
			||||||
                CString::new(include_str!("pose_tracking_cpu.txt")).expect("CString::new failed");
 | 
					                mediagraph_GraphType_POSE,
 | 
				
			||||||
            let output_node = CString::new("pose_landmarks").expect("CString::new failed");
 | 
					                include_str!("pose_tracking_cpu.txt"),
 | 
				
			||||||
 | 
					                "pose_landmarks",
 | 
				
			||||||
            let graph: *mut Mediagraph = unsafe {
 | 
					            );
 | 
				
			||||||
                Mediagraph::Create(
 | 
					 | 
				
			||||||
                    mediagraph_GraphType_POSE,
 | 
					 | 
				
			||||||
                    graph_config.as_ptr(),
 | 
					 | 
				
			||||||
                    output_node.as_ptr(),
 | 
					 | 
				
			||||||
                )
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Self {
 | 
					            Self {
 | 
				
			||||||
                mode,
 | 
					                mode,
 | 
				
			||||||
| 
						 | 
					@ -141,16 +164,7 @@ pub mod pose {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pub fn process(&mut self, input: &Mat) -> bool {
 | 
					        pub fn process(&mut self, input: &Mat) -> bool {
 | 
				
			||||||
            let mut data = input.clone();
 | 
					            self.graph.process(input);
 | 
				
			||||||
            let landmarks = unsafe {
 | 
					 | 
				
			||||||
                mediagraph_Mediagraph_Process(
 | 
					 | 
				
			||||||
                    self.graph as *mut std::ffi::c_void,
 | 
					 | 
				
			||||||
                    data.data_mut(),
 | 
					 | 
				
			||||||
                    data.cols(),
 | 
					 | 
				
			||||||
                    data.rows(),
 | 
					 | 
				
			||||||
                )
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // @todo read each landmark to build a pose struct
 | 
					            // @todo read each landmark to build a pose struct
 | 
				
			||||||
            true
 | 
					            true
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -171,7 +185,7 @@ pub mod face_mesh {
 | 
				
			||||||
        pub max_faces: usize,       // 2
 | 
					        pub max_faces: usize,       // 2
 | 
				
			||||||
        pub min_detection_con: f32, // 0.5
 | 
					        pub min_detection_con: f32, // 0.5
 | 
				
			||||||
        pub min_track_con: f32,     // 0.5
 | 
					        pub min_track_con: f32,     // 0.5
 | 
				
			||||||
        pub graph: *mut Mediagraph,
 | 
					        graph: Mediagraph,
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    impl FaceMeshDetector {
 | 
					    impl FaceMeshDetector {
 | 
				
			||||||
| 
						 | 
					@ -181,17 +195,11 @@ pub mod face_mesh {
 | 
				
			||||||
            min_detection_con: f32,
 | 
					            min_detection_con: f32,
 | 
				
			||||||
            min_track_con: f32,
 | 
					            min_track_con: f32,
 | 
				
			||||||
        ) -> Self {
 | 
					        ) -> Self {
 | 
				
			||||||
            let graph_config = CString::new(include_str!("face_mesh_desktop_live.txt"))
 | 
					            let graph = Mediagraph::new(
 | 
				
			||||||
                .expect("CString::new failed");
 | 
					                mediagraph_GraphType_FACE,
 | 
				
			||||||
            let output_node = CString::new("multi_face_landmarks").expect("CString::new failed");
 | 
					                include_str!("face_mesh_desktop_live.txt"),
 | 
				
			||||||
 | 
					                "multi_face_landmarks",
 | 
				
			||||||
            let graph: *mut Mediagraph = unsafe {
 | 
					            );
 | 
				
			||||||
                Mediagraph::Create(
 | 
					 | 
				
			||||||
                    mediagraph_GraphType_FACE,
 | 
					 | 
				
			||||||
                    graph_config.as_ptr(),
 | 
					 | 
				
			||||||
                    output_node.as_ptr(),
 | 
					 | 
				
			||||||
                )
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Self {
 | 
					            Self {
 | 
				
			||||||
                static_mode,
 | 
					                static_mode,
 | 
				
			||||||
| 
						 | 
					@ -202,16 +210,8 @@ pub mod face_mesh {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pub fn process(&mut self, input: Mat) -> bool {
 | 
					        pub fn process(&mut self, input: &Mat) -> bool {
 | 
				
			||||||
            let mut data = input.clone();
 | 
					            self.graph.process(input);
 | 
				
			||||||
            let landmarks = unsafe {
 | 
					 | 
				
			||||||
                mediagraph_Mediagraph_Process(
 | 
					 | 
				
			||||||
                    self.graph as *mut std::ffi::c_void,
 | 
					 | 
				
			||||||
                    data.data_mut(),
 | 
					 | 
				
			||||||
                    data.cols(),
 | 
					 | 
				
			||||||
                    data.rows(),
 | 
					 | 
				
			||||||
                )
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
            // @todo read each landmark to build a face mesh struct
 | 
					            // @todo read each landmark to build a face mesh struct
 | 
				
			||||||
            true
 | 
					            true
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -256,22 +256,16 @@ pub mod hands {
 | 
				
			||||||
        pub max_hands: usize,
 | 
					        pub max_hands: usize,
 | 
				
			||||||
        pub detection_con: f32, // 0.5
 | 
					        pub detection_con: f32, // 0.5
 | 
				
			||||||
        pub min_track_con: f32, // 0.5
 | 
					        pub min_track_con: f32, // 0.5
 | 
				
			||||||
        pub graph: *mut Mediagraph,
 | 
					        graph: Mediagraph,
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    impl HandDetector {
 | 
					    impl HandDetector {
 | 
				
			||||||
        pub fn new(mode: bool, max_hands: usize, detection_con: f32, min_track_con: f32) -> Self {
 | 
					        pub fn new(mode: bool, max_hands: usize, detection_con: f32, min_track_con: f32) -> Self {
 | 
				
			||||||
            let graph_config = CString::new(include_str!("hand_tracking_desktop_live.txt"))
 | 
					            let graph = Mediagraph::new(
 | 
				
			||||||
                .expect("CString::new failed");
 | 
					                mediagraph_GraphType_HANDS,
 | 
				
			||||||
            let output_node = CString::new("hand_landmarks").expect("CString::new failed");
 | 
					                include_str!("hand_tracking_desktop_live.txt"),
 | 
				
			||||||
 | 
					                "hand_landmarks",
 | 
				
			||||||
            let graph: *mut Mediagraph = unsafe {
 | 
					            );
 | 
				
			||||||
                Mediagraph::Create(
 | 
					 | 
				
			||||||
                    mediagraph_GraphType_FACE,
 | 
					 | 
				
			||||||
                    graph_config.as_ptr(),
 | 
					 | 
				
			||||||
                    output_node.as_ptr(),
 | 
					 | 
				
			||||||
                )
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Self {
 | 
					            Self {
 | 
				
			||||||
                mode,
 | 
					                mode,
 | 
				
			||||||
| 
						 | 
					@ -282,16 +276,8 @@ pub mod hands {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pub fn process(&mut self, input: Mat) -> bool {
 | 
					        pub fn process(&mut self, input: &Mat) -> bool {
 | 
				
			||||||
            let mut data = input.clone();
 | 
					            self.graph.process(input);
 | 
				
			||||||
            let landmarks = unsafe {
 | 
					 | 
				
			||||||
                mediagraph_Mediagraph_Process(
 | 
					 | 
				
			||||||
                    self.graph as *mut std::ffi::c_void,
 | 
					 | 
				
			||||||
                    data.data_mut(),
 | 
					 | 
				
			||||||
                    data.cols(),
 | 
					 | 
				
			||||||
                    data.rows(),
 | 
					 | 
				
			||||||
                )
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
            // @todo read each landmark to build a hands struct
 | 
					            // @todo read each landmark to build a hands struct
 | 
				
			||||||
            true
 | 
					            true
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user