builds successfully

This commit is contained in:
Jules Youngberg 2022-06-06 22:06:03 -07:00
parent 0048ea7fa4
commit 9f758c730f
5 changed files with 151 additions and 4302 deletions

View File

@ -27,7 +27,7 @@ Build & install the mediagraph library.
```shell
bazel build --define MEDIAPIPE_DISABLE_GPU=1 mediapipe:libmediagraph.dylib
sudo cp bazel-bin/mediapipe/libmediagraph.dylib /usr/local/lib/libmediagraph.dylib
cp mediapipe/cpuhost.h /usr/local/include/mediagraph.h
cp mediapipe/mediagraph.h /usr/local/include/mediagraph.h
```
### linux (untested)
@ -35,7 +35,7 @@ cp mediapipe/cpuhost.h /usr/local/include/mediagraph.h
```shell
bazel build --define MEDIAPIPE_DISABLE_GPU=1 mediapipe:mediagraph
cp bazel-bin/mediapipe/libmediagraph.so /usr/local/lib/libmediagraph.so
cp mediapipe/cpuhost.h /usr/local/include/mediagraph.h
cp mediapipe/mediagraph.h /usr/local/include/mediagraph.h
```
## usage

View File

@ -1,29 +1,29 @@
extern crate bindgen;
// use std::path::PathBuf;
use std::path::PathBuf;
fn main() {
// println!("cargo:rustc-link-lib=stdc++");
// println!("cargo:rustc-link-lib=opencv4");
// println!("cargo:rustc-link-lib=mediagraph");
// // println!("cargo:rerun-if-changed=wrapper.h");
println!("cargo:rustc-link-lib=stdc++");
println!("cargo:rustc-link-lib=opencv4");
println!("cargo:rustc-link-lib=mediagraph");
// println!("cargo:rerun-if-changed=wrapper.h");
// let bindings = bindgen::Builder::default()
// .clang_arg("-xc++")
// .clang_arg("-std=c++14")
// .clang_arg("-I/usr/local/include/opencv4")
// .generate_comments(true)
// .header("/usr/local/include/mediagraph.h")
// // .whitelist_function("mediapipe_.*")
// // .whitelist_type("mediapipe.*")
// // .whitelist_var("mediapipe_.*")
// .detect_include_paths(true)
// .generate_inline_functions(true)
// .generate()
// .expect("Unable to generate bindings");
let bindings = bindgen::Builder::default()
.clang_arg("-xc++")
.clang_arg("-std=c++14")
.clang_arg("-I/usr/local/include/opencv4")
.generate_comments(true)
.header("/usr/local/include/mediagraph.h")
.allowlist_function("mediagraph.*")
.allowlist_type("mediagraph.*")
.allowlist_var("mediagraph.*")
.detect_include_paths(true)
.generate_inline_functions(true)
.generate()
.expect("Unable to generate bindings");
// let out_path = PathBuf::from("./src");
// bindings
// .write_to_file(out_path.join("bindings.rs"))
// .expect("Couldn't write bindings!");
let out_path = PathBuf::from("./src");
bindings
.write_to_file(out_path.join("bindings.rs"))
.expect("Couldn't write bindings!");
}

View File

@ -1,8 +1,6 @@
#![allow(unused_variables)]
#![allow(dead_code)]
use mediapipe::*;
mod examples {
use super::*;
use opencv::prelude::*;
@ -35,33 +33,6 @@ mod examples {
Ok(())
}
// pub fn face_detection() -> Result<()> {
// let window = "video capture";
// highgui::named_window(window, highgui::WINDOW_AUTOSIZE)?;
// let mut cap = videoio::VideoCapture::new(0, videoio::CAP_ANY)?;
// if !cap.is_opened()? {
// panic!("Unable to open default cam")
// }
// let detector = mediapipe::face_detection::FaceDetector::default();
// loop {
// let mut frame = Mat::default();
// cap.read(&mut frame)?;
// let size = frame.size()?;
// if size.width > 0 {
// highgui::imshow(window, &mut frame)?
// }
// let key = highgui::wait_key(10)?;
// if key > 0 && key != 255 {
// break;
// }
// }
// Ok(())
// }
pub fn face_mesh() -> Result<()> {
let window = "video capture";
@ -90,6 +61,7 @@ mod examples {
imgproc::cvt_color(&raw_frame, &mut rgb_frame, imgproc::COLOR_BGR2RGB, 0)?;
opencv::core::flip(&rgb_frame, &mut flip_frame, 1)?; // horizontal
println!("processing");
detector.process(&flip_frame, &mut mesh);
highgui::imshow(window, &mut flip_frame)?;
@ -137,7 +109,7 @@ mod examples {
if size.width > 0 && !raw_frame.empty() {
imgproc::cvt_color(&raw_frame, &mut rgb_frame, imgproc::COLOR_BGR2RGB, 0)?;
opencv::core::flip(&rgb_frame, &mut flip_frame, 1)?; // horizontal
detector.process(&flip_frame, &mut left, &mut right);
highgui::imshow(window, &mut flip_frame)?;

File diff suppressed because it is too large Load Diff

View File

@ -19,6 +19,9 @@ mod bindings;
pub use bindings::*;
type Mediagraph = mediagraph_Mediagraph;
type Landmark = mediagraph_Landmark;
impl Default for Landmark {
fn default() -> Self {
Self {
@ -31,6 +34,10 @@ impl Default for Landmark {
}
}
struct Pose {
data: [Landmark; 33],
}
impl Default for Pose {
fn default() -> Self {
Self {
@ -39,6 +46,10 @@ impl Default for Pose {
}
}
struct Hand {
data: [Landmark; 21],
}
impl Default for Hand {
fn default() -> Self {
Self {
@ -47,6 +58,10 @@ impl Default for Hand {
}
}
struct FaceMesh {
data: [Landmark; 478],
}
impl Default for FaceMesh {
fn default() -> Self {
Self {
@ -99,7 +114,7 @@ pub mod pose {
pub smooth: bool, // true,
pub detection_con: f32, // 0.5
pub track_con: f32, // 0.5
pub graph: PoseGraph,
pub graph: *mut Mediagraph,
}
impl PoseDetector {
@ -108,8 +123,13 @@ pub mod pose {
CString::new(include_str!("pose_tracking_cpu.txt")).expect("CString::new failed");
let output_node = CString::new("pose_landmarks").expect("CString::new failed");
let graph: PoseGraph =
unsafe { PoseGraph::new(graph_config.as_ptr(), output_node.as_ptr()) };
let graph: *mut Mediagraph = unsafe {
Mediagraph::Create(
mediagraph_GraphType_POSE,
graph_config.as_ptr(),
output_node.as_ptr(),
)
};
Self {
mode,
@ -120,40 +140,20 @@ pub mod pose {
}
}
pub fn process(&mut self, input: &Mat, pose: *mut Pose) -> bool {
unsafe {
let frame = input.as_raw() as *const cv_Mat;
self.graph.process(frame, pose)
}
pub fn process(&mut self, input: &Mat) -> bool {
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(),
)
};
// @todo read each landmark to build a pose struct
true
}
// // draw true
// pub fn find_pose(&self, img: &[u8], draw: bool) {}
// // draw: true, bbox_with_hands: false
// pub fn find_position(&self, img: &[u8], draw: bool, bbox_with_hands: bool) {}
// // draw: true
// pub fn find_angle(
// &self,
// img: &[u8],
// p1: cgmath::Point2<f32>,
// p2: cgmath::Point2<f32>,
// draw: bool,
// ) {
// }
// pub fn find_distance(
// &self,
// p1: cgmath::Point2<f32>,
// p2: cgmath::Point2<f32>,
// img: Option<&[u8]>,
// r: f32,
// t: f32,
// ) {
// }
// pub fn anlge_check(&self, my_angle: f32, target_angle: f32, add_on: f32) {}
}
impl Default for PoseDetector {
@ -171,7 +171,7 @@ pub mod face_mesh {
pub max_faces: usize, // 2
pub min_detection_con: f32, // 0.5
pub min_track_con: f32, // 0.5
pub graph: FaceMeshGraph,
pub graph: *mut Mediagraph,
}
impl FaceMeshDetector {
@ -185,8 +185,14 @@ pub mod face_mesh {
.expect("CString::new failed");
let output_node = CString::new("multi_face_landmarks").expect("CString::new failed");
let graph: FaceMeshGraph =
unsafe { FaceMeshGraph::new(graph_config.as_ptr(), output_node.as_ptr()) };
let graph: *mut Mediagraph = unsafe {
Mediagraph::Create(
mediagraph_GraphType_FACE,
graph_config.as_ptr(),
output_node.as_ptr(),
)
};
Self {
static_mode,
max_faces,
@ -196,22 +202,19 @@ pub mod face_mesh {
}
}
pub fn process(&mut self, input: &Mat, mesh: *mut FaceMesh) -> bool {
unsafe {
let frame = input.as_raw() as *const cv_Mat;
self.graph.process(frame, mesh)
}
pub fn process(&mut self, input: Mat) -> bool {
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(),
)
};
// @todo read each landmark to build a face mesh struct
true
}
// // draw: true
// pub fn find_face_mesh(&self, img: &[u8], draw: bool) {}
// pub fn find_distance(
// &self,
// p1: cgmath::Point2<f32>,
// p2: cgmath::Point2<f32>,
// img: Option<&[u8]>,
// ) {
// }
}
impl Default for FaceMeshDetector {
@ -221,49 +224,8 @@ pub mod face_mesh {
}
}
// pub mod face_detection {
// pub enum FaceKeyPoint {
// RIGHT_EYE = 0,
// LEFT_EYE = 1,
// NOSE_TIP = 2,
// MOUTH_CENTER = 3,
// RIGHT_EAR_TRAGION = 4,
// LEFT_EAR_TRAGION = 5,
// }
// pub struct FaceDetection {}
// impl FaceDetection {
// pub fn process(&self /* image */) /*NamedTuple*/ {}
// }
// pub struct FaceDetector {
// pub min_detection_con: f32, // 0.5
// pub face_detection: FaceDetection,
// }
// impl FaceDetector {
// pub fn new(min_detection_con: f32) -> Self {
// Self {
// min_detection_con,
// face_detection: todo!(),
// }
// }
// // draw: true
// pub fn find_faces(&self, img: &[u8], draw: bool) {}
// }
// impl Default for FaceDetector {
// fn default() -> Self {
// Self::new(0.5)
// }
// }
// }
pub mod hands {
use super::*;
// use mediapipe::*;
// use std::collections::HashMap;
pub enum HandLandmark {
WRIST = 0,
@ -294,21 +256,22 @@ pub mod hands {
pub max_hands: usize,
pub detection_con: f32, // 0.5
pub min_track_con: f32, // 0.5
pub graph: HandsGraph,
pub graph: *mut Mediagraph,
}
impl HandDetector {
pub fn new(mode: bool, max_hands: usize, detection_con: f32, min_track_con: f32) -> Self {
// // ::std::vector<::mediapipe::NormalizedLandmarkList>
// let graph_config = CString::new(include_str!("face_mesh_desktop_live.txt")).expect("CString::new failed");
// let output_node = CString::new("multi_face_landmarks").expect("CString::new failed");
let graph_config = CString::new(include_str!("hand_tracking_desktop_live.txt"))
.expect("CString::new failed");
let output_node = CString::new("hand_landmarks").expect("CString::new failed");
let graph: HandsGraph =
unsafe { HandsGraph::new(graph_config.as_ptr(), output_node.as_ptr()) };
let graph: *mut Mediagraph = unsafe {
Mediagraph::Create(
mediagraph_GraphType_FACE,
graph_config.as_ptr(),
output_node.as_ptr(),
)
};
Self {
mode,
@ -319,26 +282,19 @@ pub mod hands {
}
}
pub fn process(&mut self, input: &Mat, left: *mut Hand, right: *mut Hand) -> bool {
unsafe {
let frame = input.as_raw() as *const cv_Mat;
self.graph.process(frame, left, right)
}
pub fn process(&mut self, input: Mat) -> bool {
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(),
)
};
// @todo read each landmark to build a hands struct
true
}
// // draw: true, flip_type: tru
// pub fn find_hands(&self, img: &[u8], draw: bool, flip_type: bool) {}
// pub fn fingers_up(&self, my_hand: &HashMap<String, String>) /*List of which fingers are up*/
// {
// }
// pub fn find_distance(
// &self,
// p1: cgmath::Point2<f32>,
// p2: cgmath::Point2<f32>,
// img: Option<&[u8]>,
// ) {
// }
}
impl Default for HandDetector {
@ -347,48 +303,3 @@ pub mod hands {
}
}
}
// pub mod objectron {
// pub struct Objectron {}
// impl Objectron {
// pub fn process(&self /* image */) /*NamedTuple*/ {}
// }
// }
// pub mod selfie_segmentation {
// pub struct SelfieSegmentation {}
// impl SelfieSegmentation {
// pub fn process(&self /* image */) /*NamedTuple*/ {}
// }
// pub struct SelfieSegmentationDetector {
// pub model: usize, // 0 is general 1 is landscape(faster)
// pub selfie_segmentation: SelfieSegmentation,
// }
// impl SelfieSegmentationDetector {
// pub fn new(model: usize) -> Self {
// todo!()
// }
// // threshold: 0.1
// pub fn remove_bg(&self, img: &[u8], img_bg: [u8; 3], threshold: f32) {}
// }
// impl Default for SelfieSegmentationDetector {
// fn default() -> Self {
// Self::new(1)
// }
// }
// }
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
let result = 2 + 2;
assert_eq!(result, 4);
}
}