cailean
4 months ago
commit
98afb8ebf6
19 changed files with 1760 additions and 0 deletions
@ -0,0 +1,90 @@ |
|||
#.gitignore is a file which makes git ignore files which should |
|||
# not go into version control in the first place |
|||
# Questions? See |
|||
# http://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository#Ignoring-Files |
|||
# http://git-scm.com/docs/gitignore |
|||
|
|||
########################### |
|||
# ignore generated binaries |
|||
# but not the data folder |
|||
########################### |
|||
|
|||
/bin/* |
|||
|
|||
######### |
|||
# general |
|||
######### |
|||
|
|||
[Bb]uild/ |
|||
[Oo]bj/ |
|||
*.o |
|||
[Dd]ebug*/ |
|||
[Rr]elease*/ |
|||
*.mode* |
|||
*.app/ |
|||
*.pyc |
|||
.svn/ |
|||
*.log |
|||
|
|||
######################## |
|||
# IDE files which should |
|||
# be ignored |
|||
######################## |
|||
|
|||
# XCode |
|||
*.pbxuser |
|||
*.perspective |
|||
*.perspectivev3 |
|||
*.mode1v3 |
|||
*.mode2v3 |
|||
# XCode 4 |
|||
*.xccheckout |
|||
xcuserdata/ |
|||
|
|||
# Visual Studio |
|||
*.sdf |
|||
*.opensdf |
|||
*.suo |
|||
*.pdb |
|||
*.ilk |
|||
*.aps |
|||
ipch/ |
|||
|
|||
# Eclipse |
|||
.metadata |
|||
local.properties |
|||
.externalToolBuilders |
|||
|
|||
# Android Studio |
|||
.gradle |
|||
/local.properties |
|||
/.idea/workspace.xml |
|||
/.idea/libraries |
|||
|
|||
################## |
|||
# operating system |
|||
################## |
|||
|
|||
# Linux |
|||
*~ |
|||
# KDE |
|||
.directory |
|||
.AppleDouble |
|||
|
|||
# OSX |
|||
.DS_Store |
|||
*.swp |
|||
*~.nib |
|||
# Thumbnails |
|||
._* |
|||
|
|||
# Windows |
|||
# Image file caches |
|||
Thumbs.db |
|||
# Folder config file |
|||
Desktop.ini |
|||
|
|||
# Android |
|||
.csettings |
|||
|
|||
/bin/data/ |
@ -0,0 +1,181 @@ |
|||
{ |
|||
"configurations": [ |
|||
{ |
|||
"name": "Mac", |
|||
"includePath": [ |
|||
"/usr/include", |
|||
"/usr/local/include", |
|||
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/", |
|||
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1", |
|||
"${workspaceRoot}/../../../libs/openFrameworks", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/3d", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/app", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/communication", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/events", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/gl", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/graphics", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/math", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/sound", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/types", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/utils", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/video", |
|||
"${workspaceRoot}/../../../libs/boost/include", |
|||
"${workspaceRoot}/../../../libs/cairo/include", |
|||
"${workspaceRoot}/../../../libs/curl/include", |
|||
"${workspaceRoot}/../../../libs/fmod/include", |
|||
"${workspaceRoot}/../../../libs/FreeImage/include", |
|||
"${workspaceRoot}/../../../libs/freetype/include", |
|||
"${workspaceRoot}/../../../libs/glew/include", |
|||
"${workspaceRoot}/../../../libs/glfw/include", |
|||
"${workspaceRoot}/../../../libs/glm/include", |
|||
"${workspaceRoot}/../../../libs/json/include", |
|||
"${workspaceRoot}/../../../libs/pugixml/include", |
|||
"${workspaceRoot}/../../../libs/rtAudio/include", |
|||
"${workspaceRoot}/../../../libs/tess2/include", |
|||
"${workspaceRoot}/../../../libs/uriparser/include", |
|||
"${workspaceRoot}/../../../libs/utf8/include" |
|||
], |
|||
"browse": { |
|||
"limitSymbolsToIncludedHeaders": true, |
|||
"databaseFilename": "${workspaceRoot}/.vscode/browse.db", |
|||
"path": [ |
|||
"/usr/include", |
|||
"/usr/local/include", |
|||
"/System/Library/Frameworks", |
|||
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/", |
|||
"${workspaceRoot}/../../../libs", |
|||
"${workspaceRoot}/../../../addons", |
|||
"${workspaceRoot}/../../../libs/openFrameworks" |
|||
] |
|||
}, |
|||
"intelliSenseMode": "clang-x64", |
|||
"macFrameworkPath": [ |
|||
"/System/Library/Frameworks", |
|||
"/Library/Frameworks" |
|||
], |
|||
"compilerPath": "/usr/local/bin/gcc-8", |
|||
"cStandard": "c11", |
|||
"cppStandard": "c++17" |
|||
}, |
|||
{ |
|||
"name": "Linux", |
|||
"includePath": [ |
|||
"/usr/include", |
|||
"/usr/local/include", |
|||
"/usr/include/c++/5", |
|||
"/usr/include/c++/5/backward", |
|||
"/usr/lib/gcc/x86_64-linux-gnu/5/include", |
|||
"/usr/lib/x86_64-linux-gnu/glib-2.0/include", |
|||
"/usr/lib/x86_64-linux-gnu/gstreamer-1.0/include", |
|||
"/usr/local/include", |
|||
"/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed", |
|||
"/usr/include/x86_64-linux-gnu", |
|||
"${workspaceRoot}/../../../libs/openFrameworks", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/3d", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/app", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/communication", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/events", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/gl", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/graphics", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/math", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/sound", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/types", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/utils", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/video", |
|||
"${workspaceRoot}/../../../libs/boost/include", |
|||
"${workspaceRoot}/../../../libs/cairo/include", |
|||
"${workspaceRoot}/../../../libs/curl/include", |
|||
"${workspaceRoot}/../../../libs/fmod/include", |
|||
"${workspaceRoot}/../../../libs/FreeImage/include", |
|||
"${workspaceRoot}/../../../libs/freetype/include", |
|||
"${workspaceRoot}/../../../libs/glew/include", |
|||
"${workspaceRoot}/../../../libs/glfw/include", |
|||
"${workspaceRoot}/../../../libs/glm/include", |
|||
"${workspaceRoot}/../../../libs/json/include", |
|||
"${workspaceRoot}/../../../libs/pugixml/include", |
|||
"${workspaceRoot}/../../../libs/rtAudio/include", |
|||
"${workspaceRoot}/../../../libs/tess2/include", |
|||
"${workspaceRoot}/../../../libs/uriparser/include", |
|||
"${workspaceRoot}/../../../libs/utf8/include", |
|||
"${workspaceRoot}/../../../libs/poco/include", |
|||
"${workspaceRoot}/../../../libs/kiss/include", |
|||
"/usr/include/x86_64-linux-gnu/c++/5", |
|||
"/usr/include/pulse", |
|||
"/usr/include/cairo", |
|||
"/usr/include/gstreamer-1.0", |
|||
"/usr/include/glib-2.0", |
|||
"${workspaceRoot}", |
|||
"/home/cailean/Desktop/openframeworks/of_v0.12.0_linux64gcc6_release/addons/ofxOpenCv/src", |
|||
"/usr/local/onnxruntime-linux-x64-gpu-1.19.2/include", |
|||
"/home/cailean/Desktop/openframeworks/of_v0.12.0_linux64gcc6_release/addons/ofxOpenCv/libs/opencv/include/opencv4" |
|||
], |
|||
"browse": { |
|||
"limitSymbolsToIncludedHeaders": true, |
|||
"databaseFilename": "", |
|||
"path": [ |
|||
"/usr/include", |
|||
"/usr/local/include", |
|||
"${workspaceRoot}/../../../libs", |
|||
"${workspaceRoot}/../../../addons", |
|||
"${workspaceRoot}/../../../libs/openFrameworks", |
|||
"/home/cailean/Desktop/openframeworks/of_v0.12.0_linux64gcc6_release/addons/ofxOpenCv/src", |
|||
"/usr/local/onnxruntime-linux-x64-gpu-1.19.2/include" |
|||
] |
|||
}, |
|||
"intelliSenseMode": "clang-x64", |
|||
"compilerPath": "/usr/bin/g++", |
|||
"cStandard": "c17", |
|||
"cppStandard": "c++17" |
|||
}, |
|||
{ |
|||
"name": "Win32", |
|||
"includePath": [ |
|||
"C:/msys64/mingw32/include/c++/7.4.0", |
|||
"C:/msys64/mingw32/i686-w64-mingw32/include", |
|||
"${workspaceRoot}/../../../libs", |
|||
"${workspaceRoot}/../../../addons", |
|||
"${workspaceRoot}/../../../libs/openFrameworks", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/3d", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/app", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/communication", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/events", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/gl", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/graphics", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/math", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/sound", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/types", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/utils", |
|||
"${workspaceRoot}/../../../libs/openFrameworks/video", |
|||
"${workspaceRoot}/../../../libs/boost/include", |
|||
"${workspaceRoot}/../../../libs/cairo/include", |
|||
"${workspaceRoot}/../../../libs/curl/include", |
|||
"${workspaceRoot}/../../../libs/fmod/include", |
|||
"${workspaceRoot}/../../../libs/FreeImage/include", |
|||
"${workspaceRoot}/../../../libs/freetype/include", |
|||
"${workspaceRoot}/../../../libs/glew/include", |
|||
"${workspaceRoot}/../../../libs/glfw/include", |
|||
"${workspaceRoot}/../../../libs/glm/include", |
|||
"${workspaceRoot}/../../../libs/json/include", |
|||
"${workspaceRoot}/../../../libs/pugixml/include", |
|||
"${workspaceRoot}/../../../libs/rtAudio/include", |
|||
"${workspaceRoot}/../../../libs/tess2/include", |
|||
"${workspaceRoot}/../../../libs/uriparser/include", |
|||
"${workspaceRoot}/../../../libs/utf8/include" |
|||
], |
|||
"browse": { |
|||
"limitSymbolsToIncludedHeaders": true, |
|||
"databaseFilename": "", |
|||
"path": [ |
|||
"${workspaceRoot}/../../../libs", |
|||
"${workspaceRoot}/../../../addons", |
|||
"${workspaceRoot}/../../../libs/openFrameworks" |
|||
] |
|||
}, |
|||
"intelliSenseMode": "clang-x64", |
|||
"compilerPath": "C:/msys64/mingw32/bin/g++.exe", |
|||
"cStandard": "c11", |
|||
"cppStandard": "c++17" |
|||
} |
|||
], |
|||
"version": 4 |
|||
} |
@ -0,0 +1,72 @@ |
|||
{ |
|||
"version": "0.2.0", |
|||
"configurations": [ |
|||
{ |
|||
"name": "C++ Launch", |
|||
"type": "cppdbg", |
|||
"request": "launch", |
|||
"args": [], |
|||
"stopAtEntry": false, |
|||
"cwd": "${workspaceRoot}", |
|||
"environment": [], |
|||
"externalConsole": false, |
|||
"linux": { |
|||
"MIMode": "gdb", |
|||
"setupCommands": [ |
|||
{ |
|||
"description": "Enable pretty-printing for gdb", |
|||
"text": "-enable-pretty-printing", |
|||
"ignoreFailures": true |
|||
} |
|||
], |
|||
"program": "${workspaceRoot}/bin/${workspaceFolderBasename}_debug" |
|||
}, |
|||
"osx": { |
|||
"MIMode": "lldb", |
|||
"program": "${workspaceRoot}/bin/${workspaceFolderBasename}_debug.app/Contents/MacOS/${workspaceFolderBasename}_debug" |
|||
}, |
|||
"windows": { |
|||
"MIMode": "gdb", |
|||
"miDebuggerPath": "gdb.exe", |
|||
"setupCommands": [ |
|||
{ |
|||
"description": "Enable pretty-printing for gdb", |
|||
"text": "-enable-pretty-printing", |
|||
"ignoreFailures": true |
|||
} |
|||
], |
|||
"program": "${workspaceRoot}/bin/${workspaceFolderBasename}_debug" |
|||
} |
|||
}, |
|||
{ |
|||
"name": "C++ Attach", |
|||
"type": "cppdbg", |
|||
"request": "attach", |
|||
"program": "enter program name, for example ${workspaceRoot}/a.out", |
|||
"processId": "${command:pickProcess}", |
|||
"linux": { |
|||
"MIMode": "gdb", |
|||
"setupCommands": [ |
|||
{ |
|||
"description": "Enable pretty-printing for gdb", |
|||
"text": "-enable-pretty-printing", |
|||
"ignoreFailures": true |
|||
} |
|||
] |
|||
}, |
|||
"osx": { |
|||
"MIMode": "lldb" |
|||
}, |
|||
"windows": { |
|||
"MIMode": "gdb", |
|||
"setupCommands": [ |
|||
{ |
|||
"description": "Enable pretty-printing for gdb", |
|||
"text": "-enable-pretty-printing", |
|||
"ignoreFailures": true |
|||
} |
|||
] |
|||
} |
|||
} |
|||
] |
|||
} |
@ -0,0 +1,133 @@ |
|||
{ |
|||
"version": "2.0.0", |
|||
"shell":{ |
|||
"task": true |
|||
}, |
|||
"tasks": [ |
|||
{ |
|||
"type": "shell", |
|||
"label": "Build RELEASE", |
|||
"presentation": { |
|||
"reveal": "always", |
|||
"panel": "shared" |
|||
}, |
|||
"command": "make -j -s 2>&1 && make RunRelease", |
|||
"group": { |
|||
"kind": "build", |
|||
"isDefault": true |
|||
}, |
|||
"problemMatcher": { |
|||
"owner": "cpp", |
|||
"fileLocation": ["relative", "${workspaceFolder}"], |
|||
"pattern": { |
|||
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", |
|||
"file": 1, |
|||
"line": 2, |
|||
"column": 3, |
|||
"severity": 4, |
|||
"message": 5 |
|||
} |
|||
} |
|||
}, |
|||
{ |
|||
"type": "shell", |
|||
"label": "Build DEBUG", |
|||
"presentation": { |
|||
"reveal": "always", |
|||
"panel": "shared" |
|||
}, |
|||
"command": "make Debug -j -s 2>&1 || exit 1", |
|||
"group": { |
|||
"kind": "build", |
|||
"isDefault": true |
|||
}, |
|||
"problemMatcher": { |
|||
"owner": "cpp", |
|||
"fileLocation": ["relative", "${workspaceFolder}"], |
|||
"pattern": { |
|||
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", |
|||
"file": 1, |
|||
"line": 2, |
|||
"column": 3, |
|||
"severity": 4, |
|||
"message": 5 |
|||
} |
|||
} |
|||
}, |
|||
{ |
|||
"type": "shell", |
|||
"label": "Clean DEBUG", |
|||
"presentation": { |
|||
"reveal": "always", |
|||
"panel": "shared" |
|||
}, |
|||
"command": "make CleanDebug", |
|||
"group": { |
|||
"kind": "build", |
|||
"isDefault": true |
|||
}, |
|||
"problemMatcher": { |
|||
"owner": "cpp", |
|||
"fileLocation": ["relative", "${workspaceFolder}"], |
|||
"pattern": { |
|||
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", |
|||
"file": 1, |
|||
"line": 2, |
|||
"column": 3, |
|||
"severity": 4, |
|||
"message": 5 |
|||
} |
|||
} |
|||
}, |
|||
{ |
|||
"type": "shell", |
|||
"label": "Clean RELEASE", |
|||
"presentation": { |
|||
"reveal": "always", |
|||
"panel": "shared" |
|||
}, |
|||
"command": "make CleanRelease", |
|||
"group": { |
|||
"kind": "build", |
|||
"isDefault": true |
|||
}, |
|||
"problemMatcher": { |
|||
"owner": "cpp", |
|||
"fileLocation": ["relative", "${workspaceFolder}"], |
|||
"pattern": { |
|||
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", |
|||
"file": 1, |
|||
"line": 2, |
|||
"column": 3, |
|||
"severity": 4, |
|||
"message": 5 |
|||
} |
|||
} |
|||
}, |
|||
{ |
|||
"type": "shell", |
|||
"label": "Clean ALL", |
|||
"presentation": { |
|||
"reveal": "always", |
|||
"panel": "shared" |
|||
}, |
|||
"command": "make clean", |
|||
"group": { |
|||
"kind": "build", |
|||
"isDefault": true |
|||
}, |
|||
"problemMatcher": { |
|||
"owner": "cpp", |
|||
"fileLocation": ["relative", "${workspaceFolder}"], |
|||
"pattern": { |
|||
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", |
|||
"file": 1, |
|||
"line": 2, |
|||
"column": 3, |
|||
"severity": 4, |
|||
"message": 5 |
|||
} |
|||
} |
|||
} |
|||
] |
|||
} |
@ -0,0 +1,13 @@ |
|||
# Attempt to load a config.make file.
|
|||
# If none is found, project defaults in config.project.make will be used.
|
|||
ifneq ($(wildcard config.make),) |
|||
include config.make |
|||
endif |
|||
|
|||
# make sure the the OF_ROOT location is defined
|
|||
ifndef OF_ROOT |
|||
OF_ROOT=$(realpath ../../..) |
|||
endif |
|||
|
|||
# call the project makefile!
|
|||
include $(OF_ROOT)/libs/openFrameworksCompiled/project/makefileCommon/compile.project.mk |
@ -0,0 +1,2 @@ |
|||
ofxOpenCv |
|||
ofxOpenCv |
@ -0,0 +1,142 @@ |
|||
################################################################################ |
|||
# CONFIGURE PROJECT MAKEFILE (optional) |
|||
# This file is where we make project specific configurations. |
|||
################################################################################ |
|||
|
|||
################################################################################ |
|||
# OF ROOT |
|||
# The location of your root openFrameworks installation |
|||
# (default) OF_ROOT = ../../.. |
|||
################################################################################ |
|||
OF_ROOT = ../../.. |
|||
|
|||
################################################################################ |
|||
# PROJECT ROOT |
|||
# The location of the project - a starting place for searching for files |
|||
# (default) PROJECT_ROOT = . (this directory) |
|||
# |
|||
################################################################################ |
|||
# PROJECT_ROOT = . |
|||
|
|||
################################################################################ |
|||
# PROJECT SPECIFIC CHECKS |
|||
# This is a project defined section to create internal makefile flags to |
|||
# conditionally enable or disable the addition of various features within |
|||
# this makefile. For instance, if you want to make changes based on whether |
|||
# GTK is installed, one might test that here and create a variable to check. |
|||
################################################################################ |
|||
# None |
|||
|
|||
################################################################################ |
|||
# PROJECT EXTERNAL SOURCE PATHS |
|||
# These are fully qualified paths that are not within the PROJECT_ROOT folder. |
|||
# Like source folders in the PROJECT_ROOT, these paths are subject to |
|||
# exlclusion via the PROJECT_EXLCUSIONS list. |
|||
# |
|||
# (default) PROJECT_EXTERNAL_SOURCE_PATHS = (blank) |
|||
# |
|||
# Note: Leave a leading space when adding list items with the += operator |
|||
################################################################################ |
|||
# PROJECT_EXTERNAL_SOURCE_PATHS = |
|||
|
|||
################################################################################ |
|||
# PROJECT EXCLUSIONS |
|||
# These makefiles assume that all folders in your current project directory |
|||
# and any listed in the PROJECT_EXTERNAL_SOURCH_PATHS are are valid locations |
|||
# to look for source code. The any folders or files that match any of the |
|||
# items in the PROJECT_EXCLUSIONS list below will be ignored. |
|||
# |
|||
# Each item in the PROJECT_EXCLUSIONS list will be treated as a complete |
|||
# string unless teh user adds a wildcard (%) operator to match subdirectories. |
|||
# GNU make only allows one wildcard for matching. The second wildcard (%) is |
|||
# treated literally. |
|||
# |
|||
# (default) PROJECT_EXCLUSIONS = (blank) |
|||
# |
|||
# Will automatically exclude the following: |
|||
# |
|||
# $(PROJECT_ROOT)/bin% |
|||
# $(PROJECT_ROOT)/obj% |
|||
# $(PROJECT_ROOT)/%.xcodeproj |
|||
# |
|||
# Note: Leave a leading space when adding list items with the += operator |
|||
################################################################################ |
|||
# PROJECT_EXCLUSIONS = |
|||
|
|||
################################################################################ |
|||
# PROJECT LINKER FLAGS |
|||
# These flags will be sent to the linker when compiling the executable. |
|||
# |
|||
# (default) PROJECT_LDFLAGS = -Wl,-rpath=./libs |
|||
# |
|||
# Note: Leave a leading space when adding list items with the += operator |
|||
################################################################################ |
|||
|
|||
# Currently, shared libraries that are needed are copied to the |
|||
# $(PROJECT_ROOT)/bin/libs directory. The following LDFLAGS tell the linker to |
|||
# add a runtime path to search for those shared libraries, since they aren't |
|||
# incorporated directly into the final executable application binary. |
|||
# TODO: should this be a default setting? |
|||
# PROJECT_LDFLAGS=-Wl,-rpath=./libs |
|||
|
|||
################################################################################ |
|||
# PROJECT DEFINES |
|||
# Create a space-delimited list of DEFINES. The list will be converted into |
|||
# CFLAGS with the "-D" flag later in the makefile. |
|||
# |
|||
# (default) PROJECT_DEFINES = (blank) |
|||
# |
|||
# Note: Leave a leading space when adding list items with the += operator |
|||
################################################################################ |
|||
# PROJECT_DEFINES = |
|||
|
|||
################################################################################ |
|||
# PROJECT CFLAGS |
|||
# This is a list of fully qualified CFLAGS required when compiling for this |
|||
# project. These CFLAGS will be used IN ADDITION TO the PLATFORM_CFLAGS |
|||
# defined in your platform specific core configuration files. These flags are |
|||
# presented to the compiler BEFORE the PROJECT_OPTIMIZATION_CFLAGS below. |
|||
# |
|||
# (default) PROJECT_CFLAGS = (blank) |
|||
# |
|||
# Note: Before adding PROJECT_CFLAGS, note that the PLATFORM_CFLAGS defined in |
|||
# your platform specific configuration file will be applied by default and |
|||
# further flags here may not be needed. |
|||
# |
|||
# Note: Leave a leading space when adding list items with the += operator |
|||
################################################################################ |
|||
# PROJECT_CFLAGS = |
|||
|
|||
################################################################################ |
|||
# PROJECT OPTIMIZATION CFLAGS |
|||
# These are lists of CFLAGS that are target-specific. While any flags could |
|||
# be conditionally added, they are usually limited to optimization flags. |
|||
# These flags are added BEFORE the PROJECT_CFLAGS. |
|||
# |
|||
# PROJECT_OPTIMIZATION_CFLAGS_RELEASE flags are only applied to RELEASE targets. |
|||
# |
|||
# (default) PROJECT_OPTIMIZATION_CFLAGS_RELEASE = (blank) |
|||
# |
|||
# PROJECT_OPTIMIZATION_CFLAGS_DEBUG flags are only applied to DEBUG targets. |
|||
# |
|||
# (default) PROJECT_OPTIMIZATION_CFLAGS_DEBUG = (blank) |
|||
# |
|||
# Note: Before adding PROJECT_OPTIMIZATION_CFLAGS, please note that the |
|||
# PLATFORM_OPTIMIZATION_CFLAGS defined in your platform specific configuration |
|||
# file will be applied by default and further optimization flags here may not |
|||
# be needed. |
|||
# |
|||
# Note: Leave a leading space when adding list items with the += operator |
|||
################################################################################ |
|||
# PROJECT_OPTIMIZATION_CFLAGS_RELEASE = |
|||
# PROJECT_OPTIMIZATION_CFLAGS_DEBUG = |
|||
|
|||
################################################################################ |
|||
# PROJECT COMPILERS |
|||
# Custom compilers can be set for CC and CXX |
|||
# (default) PROJECT_CXX = (blank) |
|||
# (default) PROJECT_CC = (blank) |
|||
# Note: Leave a leading space when adding list items with the += operator |
|||
################################################################################ |
|||
# PROJECT_CXX = |
|||
# PROJECT_CC = |
@ -0,0 +1,107 @@ |
|||
{ |
|||
"folders": [ |
|||
{ |
|||
"path": "." |
|||
}, |
|||
{ |
|||
"path": "${workspaceRoot}/../../../../libs/openFrameworks" |
|||
}, |
|||
{ |
|||
"path": "${workspaceRoot}/../../../../addons" |
|||
} |
|||
], |
|||
"settings": { |
|||
"files.associations": { |
|||
"cctype": "cpp", |
|||
"clocale": "cpp", |
|||
"cmath": "cpp", |
|||
"csignal": "cpp", |
|||
"cstdarg": "cpp", |
|||
"cstddef": "cpp", |
|||
"cstdio": "cpp", |
|||
"cstdlib": "cpp", |
|||
"cstring": "cpp", |
|||
"ctime": "cpp", |
|||
"cwchar": "cpp", |
|||
"cwctype": "cpp", |
|||
"any": "cpp", |
|||
"array": "cpp", |
|||
"atomic": "cpp", |
|||
"strstream": "cpp", |
|||
"bit": "cpp", |
|||
"*.tcc": "cpp", |
|||
"bitset": "cpp", |
|||
"cfenv": "cpp", |
|||
"charconv": "cpp", |
|||
"chrono": "cpp", |
|||
"codecvt": "cpp", |
|||
"compare": "cpp", |
|||
"complex": "cpp", |
|||
"concepts": "cpp", |
|||
"condition_variable": "cpp", |
|||
"cstdint": "cpp", |
|||
"deque": "cpp", |
|||
"forward_list": "cpp", |
|||
"list": "cpp", |
|||
"map": "cpp", |
|||
"set": "cpp", |
|||
"string": "cpp", |
|||
"unordered_map": "cpp", |
|||
"unordered_set": "cpp", |
|||
"vector": "cpp", |
|||
"exception": "cpp", |
|||
"expected": "cpp", |
|||
"algorithm": "cpp", |
|||
"functional": "cpp", |
|||
"iterator": "cpp", |
|||
"memory": "cpp", |
|||
"memory_resource": "cpp", |
|||
"numeric": "cpp", |
|||
"optional": "cpp", |
|||
"random": "cpp", |
|||
"ratio": "cpp", |
|||
"regex": "cpp", |
|||
"source_location": "cpp", |
|||
"string_view": "cpp", |
|||
"system_error": "cpp", |
|||
"tuple": "cpp", |
|||
"type_traits": "cpp", |
|||
"utility": "cpp", |
|||
"fstream": "cpp", |
|||
"future": "cpp", |
|||
"initializer_list": "cpp", |
|||
"iomanip": "cpp", |
|||
"iosfwd": "cpp", |
|||
"iostream": "cpp", |
|||
"istream": "cpp", |
|||
"limits": "cpp", |
|||
"mutex": "cpp", |
|||
"new": "cpp", |
|||
"numbers": "cpp", |
|||
"ostream": "cpp", |
|||
"ranges": "cpp", |
|||
"semaphore": "cpp", |
|||
"shared_mutex": "cpp", |
|||
"span": "cpp", |
|||
"sstream": "cpp", |
|||
"stdexcept": "cpp", |
|||
"stop_token": "cpp", |
|||
"streambuf": "cpp", |
|||
"thread": "cpp", |
|||
"cinttypes": "cpp", |
|||
"typeindex": "cpp", |
|||
"typeinfo": "cpp", |
|||
"valarray": "cpp", |
|||
"variant": "cpp", |
|||
"format": "cpp", |
|||
"stdfloat": "cpp", |
|||
"__nullptr": "cpp", |
|||
"*.ipp": "cpp", |
|||
"__bit_reference": "cpp", |
|||
"__hash_table": "cpp", |
|||
"__split_buffer": "cpp", |
|||
"__tree": "cpp", |
|||
"filesystem": "cpp" |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,69 @@ |
|||
import qbs |
|||
import qbs.Process |
|||
import qbs.File |
|||
import qbs.FileInfo |
|||
import qbs.TextFile |
|||
import "../../../libs/openFrameworksCompiled/project/qtcreator/ofApp.qbs" as ofApp |
|||
|
|||
Project{ |
|||
property string of_root: "../../.." |
|||
|
|||
ofApp { |
|||
name: { return FileInfo.baseName(sourceDirectory) } |
|||
|
|||
files: [ |
|||
'src/main.cpp', |
|||
'src/ofApp.cpp', |
|||
'src/ofApp.h', |
|||
] |
|||
|
|||
of.addons: [ |
|||
'ofxOpenCv', |
|||
'ofxOpenCv', |
|||
] |
|||
|
|||
// additional flags for the project. the of module sets some |
|||
// flags by default to add the core libraries, search paths... |
|||
// this flags can be augmented through the following properties: |
|||
of.pkgConfigs: [] // list of additional system pkgs to include |
|||
of.includePaths: [] // include search paths |
|||
of.cFlags: [] // flags passed to the c compiler |
|||
of.cxxFlags: [] // flags passed to the c++ compiler |
|||
of.linkerFlags: [] // flags passed to the linker |
|||
of.defines: [] // defines are passed as -D to the compiler |
|||
// and can be checked with #ifdef or #if in the code |
|||
of.frameworks: [] // osx only, additional frameworks to link with the project |
|||
of.staticLibraries: [] // static libraries |
|||
of.dynamicLibraries: [] // dynamic libraries |
|||
|
|||
// other flags can be set through the cpp module: http://doc.qt.io/qbs/cpp-module.html |
|||
// eg: this will enable ccache when compiling |
|||
// |
|||
// cpp.compilerWrapper: 'ccache' |
|||
|
|||
Depends{ |
|||
name: "cpp" |
|||
} |
|||
|
|||
// common rules that parse the include search paths, core libraries... |
|||
Depends{ |
|||
name: "of" |
|||
} |
|||
|
|||
// dependency with the OF library |
|||
Depends{ |
|||
name: "openFrameworks" |
|||
} |
|||
} |
|||
|
|||
property bool makeOF: true // use makfiles to compile the OF library |
|||
// will compile OF only once for all your projects |
|||
// otherwise compiled per project with qbs |
|||
|
|||
|
|||
property bool precompileOfMain: false // precompile ofMain.h |
|||
// faster to recompile when including ofMain.h |
|||
// but might use a lot of space per project |
|||
|
|||
references: [FileInfo.joinPaths(of_root, "/libs/openFrameworksCompiled/project/qtcreator/openFrameworks.qbs")] |
|||
} |
@ -0,0 +1 @@ |
|||
## Affection Mapping Beta ## |
@ -0,0 +1,287 @@ |
|||
#include "Onnx.h" |
|||
|
|||
// Setups the model. CUDA is enabled by default
|
|||
void Onnx::Setup(ORTCHAR_T* modelPath, bool isLog, bool useCuda){ |
|||
session_options.SetIntraOpNumThreads(1); |
|||
session_options.SetIntraOpNumThreads(1); |
|||
session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL); |
|||
log = isLog; |
|||
|
|||
// cuda setup
|
|||
if(useCuda){ |
|||
OrtCUDAProviderOptions opts; |
|||
opts.device_id = 0; |
|||
opts.cudnn_conv_algo_search = OrtCudnnConvAlgoSearchExhaustive; |
|||
opts.do_copy_in_default_stream = 0; |
|||
opts.arena_extend_strategy = 0; |
|||
session_options.AppendExecutionProvider_CUDA(opts); |
|||
} |
|||
|
|||
ort_session = std::make_shared<Ort::Session>(ort_env, modelPath, session_options); |
|||
|
|||
Ort::AllocatorWithDefaultOptions allocator; |
|||
for (std::size_t i = 0; i < ort_session->GetInputCount(); i++) { |
|||
input_node_names.emplace_back(ort_session->GetInputNameAllocated(i, allocator).get()); |
|||
input_node_dims = ort_session->GetInputTypeInfo(i).GetTensorTypeAndShapeInfo().GetShape(); |
|||
if(log) |
|||
std::cout << "\t" << input_node_names.at(i) << " : " << PrintShape(input_node_dims) << std::endl; |
|||
} |
|||
|
|||
// some models might have negative shape values to indicate dynamic shape, e.g., for variable batch size.
|
|||
for (auto& s : input_node_dims) { |
|||
if (s < 0) { |
|||
s = 1; |
|||
if(log) |
|||
std::cout << "transfromed!" << std::endl; |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
if(log) |
|||
std::cout << "Output Node Name/Shape (" << output_node_names.size() << "):" << std::endl; |
|||
for (std::size_t i = 0; i < ort_session->GetOutputCount(); i++) { |
|||
output_node_names.emplace_back(ort_session->GetOutputNameAllocated(i, allocator).get()); |
|||
auto output_shapes = ort_session->GetOutputTypeInfo(i).GetTensorTypeAndShapeInfo().GetShape(); |
|||
if(log) |
|||
std::cout << "\t" << output_node_names.at(i) << " : " << PrintShape(output_shapes) << std::endl; |
|||
} |
|||
|
|||
} |
|||
|
|||
// Runs the model, given an image
|
|||
std::vector<Ort::Value> Onnx::Run(ofImage &img){ |
|||
|
|||
auto start = std::chrono::high_resolution_clock::now(); |
|||
|
|||
TransformImage(img); |
|||
size_t input_tensor_size = image_array.total(); |
|||
std::vector<Ort::Value> input_tensors; |
|||
Ort::MemoryInfo mem_info = Ort::MemoryInfo::CreateCpu(OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault); |
|||
input_tensors.emplace_back(Ort::Value::CreateTensor<float>(mem_info, (float*)image_array.data, |
|||
input_tensor_size, input_node_dims.data(), input_node_dims.size())); |
|||
|
|||
// double-check the dimensions of the input tensor
|
|||
assert(input_tensors[0].IsTensor() && input_tensors[0].GetTensorTypeAndShapeInfo().GetShape() == input_node_dims); |
|||
|
|||
//std::cout << "\ninput_tensor shape: " << PrintShape(input_tensors[0].GetTensorTypeAndShapeInfo().GetShape()) << std::endl;
|
|||
|
|||
// pass data through model
|
|||
std::vector<const char*> input_names_char(input_node_names.size(), nullptr); |
|||
std::transform(std::begin(input_node_names), std::end(input_node_names), std::begin(input_names_char), |
|||
[&](const std::string& str) { return str.c_str(); }); |
|||
|
|||
std::vector<const char*> output_names_char(output_node_names.size(), nullptr); |
|||
std::transform(std::begin(output_node_names), std::end(output_node_names), std::begin(output_names_char), |
|||
[&](const std::string& str) { return str.c_str(); }); |
|||
|
|||
std::cout << "Running model... "; |
|||
|
|||
try { |
|||
auto output_tensors = ort_session->Run(Ort::RunOptions{nullptr}, input_names_char.data(), input_tensors.data(), |
|||
input_names_char.size(), output_names_char.data(), output_names_char.size()); |
|||
|
|||
std::cout << "Done!" << std::endl; |
|||
|
|||
if (timeStamp) { |
|||
auto end = std::chrono::high_resolution_clock::now(); |
|||
std::chrono::duration<double, std::milli> elapsed = end - start; |
|||
std::cout << "Update loop took " << elapsed.count() << " ms" << std::endl; |
|||
} |
|||
|
|||
return output_tensors; |
|||
|
|||
} catch (const Ort::Exception& exception) { |
|||
std::cout << "ERROR running model inference: " << exception.what() << std::endl; |
|||
return input_tensors; |
|||
|
|||
} |
|||
|
|||
} |
|||
|
|||
/*
|
|||
Runs a model, with a batch of images as input (emotion.onnx) |
|||
(1) Creates a 1-dim float array based on the batch * channels * width * height) |
|||
(2) Transforms each image into a cv::Mat, and appends it to the array |
|||
(3) Sends that information to the model to be processed. |
|||
*/ |
|||
std::vector<Ort::Value> Onnx::RunBatch(std::vector<ofImage>& images){ |
|||
|
|||
auto start = std::chrono::high_resolution_clock::now(); |
|||
|
|||
// Number of images in the batch
|
|||
size_t batchSize = images.size(); |
|||
|
|||
std::vector<int64_t> batch_node_dims = {static_cast<int64_t>(batchSize), 3, 260, 260}; |
|||
|
|||
std::vector<float> batch_image_array(static_cast<int64_t>(batchSize) * 3 * 260 * 260); |
|||
|
|||
for(size_t i = 0; i < batchSize; i++){ |
|||
TransformImage(images[i]); |
|||
// Copy the image data into the batch_image_array
|
|||
std::memcpy( |
|||
batch_image_array.data() + i * 3 * 260 * 260, // Destination: starting point for this image in the batch array
|
|||
image_array.data, // Source: pixel data in the cv::Mat
|
|||
3 * 260 * 260 * sizeof(float) // Size: number of bytes to copy (3 channels * 260 * 260 pixels)
|
|||
); |
|||
} |
|||
|
|||
size_t input_tensor_size = batch_image_array.size(); |
|||
std::vector<Ort::Value> input_tensors; |
|||
Ort::MemoryInfo mem_info = Ort::MemoryInfo::CreateCpu(OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault); |
|||
input_tensors.emplace_back(Ort::Value::CreateTensor<float>(mem_info, batch_image_array.data(), |
|||
input_tensor_size, batch_node_dims.data(), batch_node_dims.size())); |
|||
|
|||
// double-check the dimensions of the input tensor
|
|||
assert(input_tensors[0].IsTensor() && input_tensors[0].GetTensorTypeAndShapeInfo().GetShape() == batch_node_dims); |
|||
|
|||
std::cout << "\ninput_tensor shape: " << PrintShape(input_tensors[0].GetTensorTypeAndShapeInfo().GetShape()) << std::endl; |
|||
|
|||
// pass data through model
|
|||
std::vector<const char*> input_names_char(input_node_names.size(), nullptr); |
|||
std::transform(std::begin(input_node_names), std::end(input_node_names), std::begin(input_names_char), |
|||
[&](const std::string& str) { return str.c_str(); }); |
|||
|
|||
std::vector<const char*> output_names_char(output_node_names.size(), nullptr); |
|||
std::transform(std::begin(output_node_names), std::end(output_node_names), std::begin(output_names_char), |
|||
[&](const std::string& str) { return str.c_str(); }); |
|||
|
|||
std::cout << "Running model... "; |
|||
|
|||
try { |
|||
auto output_tensors = ort_session->Run(Ort::RunOptions{nullptr}, input_names_char.data(), input_tensors.data(), |
|||
input_names_char.size(), output_names_char.data(), output_names_char.size()); |
|||
|
|||
std::cout << "Done!" << std::endl; |
|||
|
|||
if (timeStamp) { |
|||
auto end = std::chrono::high_resolution_clock::now(); |
|||
std::chrono::duration<double, std::milli> elapsed = end - start; |
|||
std::cout << "Update loop took " << elapsed.count() << " ms" << std::endl; |
|||
} |
|||
|
|||
return output_tensors; |
|||
|
|||
} catch (const Ort::Exception& exception) { |
|||
std::cout << "ERROR running model inference: " << exception.what() << std::endl; |
|||
return input_tensors; |
|||
|
|||
} |
|||
|
|||
} |
|||
|
|||
// Transforms an ofImage into a cv::ImageArray
|
|||
void Onnx::TransformImage(ofImage &img){ |
|||
// Convert ofImage to cv::Mat
|
|||
ofPixels &pixels = img.getPixels(); // Get pixels from ofImage
|
|||
int width = img.getWidth(); |
|||
int height = img.getHeight(); |
|||
int channels = img.getPixels().getNumChannels(); |
|||
|
|||
// Create a cv::Mat from the pixel data
|
|||
cv::Mat cvImg = cv::Mat(height, width, (channels == 3) ? CV_8UC3 : CV_8UC1, pixels.getData()); |
|||
|
|||
// Convert cv::Mat to cv::InputArray
|
|||
cv::InputArray inputArray(cvImg); |
|||
|
|||
image_array = cv::dnn::blobFromImage(inputArray, 1 / 255.0, cv::Size(input_node_dims[2] , input_node_dims[3] ), (0, 0, 0), false, false); |
|||
} |
|||
|
|||
/* Generates a random 1 dimensional float array, creating values between 0->255.
|
|||
Returns a tensor. */ |
|||
Ort::Value Onnx::GenerateTensor(){ |
|||
std::vector<float> random_input_tensor_values(CalculateProduct(input_node_dims)); |
|||
std::generate(random_input_tensor_values.begin(), random_input_tensor_values.end(), [&] { return rand() % 255; }); |
|||
return VectorToTensor(random_input_tensor_values, input_node_dims); |
|||
} |
|||
|
|||
// Calculates the product of the vector, how many values.
|
|||
int Onnx::CalculateProduct(const std::vector<std::int64_t>& v){ |
|||
int total = 1; |
|||
for (auto& i : v) total *= i; |
|||
return total; |
|||
} |
|||
|
|||
// Creates a tensor from a given vector input.
|
|||
Ort::Value Onnx::VectorToTensor(std::vector<float>& data, const std::vector<std::int64_t>& shape){ |
|||
Ort::MemoryInfo mem_info = Ort::MemoryInfo::CreateCpu(OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault); |
|||
auto tensor = Ort::Value::CreateTensor<float>(mem_info, data.data(), data.size(), shape.data(), shape.size()); |
|||
return tensor; |
|||
} |
|||
|
|||
// Prints the shape of the given tensor (ex. input: (1, 1, 512, 512))
|
|||
std::string Onnx::PrintShape(const std::vector<std::int64_t>& v){ |
|||
std::stringstream ss(""); |
|||
for (std::size_t i = 0; i < v.size() - 1; i++) ss << v[i] << "x"; |
|||
ss << v[v.size() - 1]; |
|||
return ss.str(); |
|||
} |
|||
|
|||
// Function to calculate the minimum value in an array
|
|||
float Onnx::ReduceMin(const float* data, size_t size) { |
|||
return *std::min_element(data, data + size); |
|||
} |
|||
|
|||
// Function to calculate the maximum value in an array
|
|||
float Onnx::ReduceMax(const float* data, size_t size) { |
|||
return *std::max_element(data, data + size); |
|||
} |
|||
|
|||
// Function to normalize an array between 0 and 1
|
|||
void Onnx::Normalize(float* data, size_t size, float min_value, float max_value) { |
|||
for (size_t i = 0; i < size; ++i) { |
|||
data[i] = (data[i] - min_value) / (max_value - min_value); |
|||
} |
|||
} |
|||
|
|||
// Coverts the output tensor data to a texture of a given ofFbo.
|
|||
void Onnx::DataToFbo(const float* data, size_t width, size_t height, ofFbo& fbo){ |
|||
// Convert data into opencv mat
|
|||
cv::Mat inputMat(height, width, CV_32FC1, const_cast<float*>(data)); |
|||
|
|||
// Convert to 8-bit grayscale Mat
|
|||
cv::Mat inputMat8U; |
|||
inputMat.convertTo(inputMat8U, CV_8UC1, 255.0); // Convert float to 8-bit grayscale
|
|||
|
|||
// Resize the image using OpenCV
|
|||
cv::Mat resizedMat; |
|||
cv::resize(inputMat8U, resizedMat, cv::Size(fbo.getWidth(), fbo.getHeight()), 0, 0, cv::INTER_LINEAR); |
|||
|
|||
// Convert OpenCV Mat to ofPixels
|
|||
ofPixels pixels; |
|||
pixels.allocate(fbo.getWidth(), fbo.getHeight(), OF_PIXELS_GRAY); |
|||
|
|||
// Copy data from resizedMat to ofPixels
|
|||
for (size_t y = 0; y < fbo.getHeight(); ++y) { |
|||
for (size_t x = 0; x < fbo.getWidth(); ++x) { |
|||
unsigned char value = resizedMat.at<uchar>(y, x); |
|||
pixels.setColor(x, y, ofColor(value)); |
|||
} |
|||
} |
|||
|
|||
// Update FBO with new pixels
|
|||
fbo.begin(); |
|||
ofTexture& texture = fbo.getTexture(); |
|||
texture.loadData(pixels); |
|||
fbo.end(); |
|||
|
|||
|
|||
} |
|||
|
|||
void Onnx::Softmax(float* data, size_t size) { |
|||
std::vector<float> logits(data, data + size); |
|||
std::vector<float> expValues(size); |
|||
float maxLogit = *std::max_element(logits.begin(), logits.end()); |
|||
|
|||
// Calculate exp(logit - maxLogit) for numerical stability
|
|||
std::transform(logits.begin(), logits.end(), expValues.begin(), |
|||
[maxLogit](float logit) { return std::exp(logit - maxLogit); }); |
|||
|
|||
float sumExp = std::accumulate(expValues.begin(), expValues.end(), 0.0f); |
|||
|
|||
// Normalize to get probabilities
|
|||
std::transform(expValues.begin(), expValues.end(), data, |
|||
[sumExp](float expValue) { return expValue / sumExp; }); |
|||
} |
|||
|
|||
|
@ -0,0 +1,57 @@ |
|||
#ifndef ONNX |
|||
#define ONNX |
|||
|
|||
#include <onnxruntime_cxx_api.h> |
|||
#include <algorithm> // std::generate |
|||
#include <cassert> |
|||
#include <cstddef> |
|||
#include <cstdint> |
|||
#include <iostream> |
|||
#include <sstream> |
|||
#include <string> |
|||
#include <vector> |
|||
#include <cstdlib> // For std::rand and std::srand |
|||
#include "ofMain.h" |
|||
#include "ofxOpenCv.h" |
|||
#include <numeric> |
|||
#include <cmath> |
|||
|
|||
class Onnx { |
|||
|
|||
public: |
|||
Onnx() {} |
|||
void Setup(ORTCHAR_T* modelPath, bool isLog, bool useCuda); |
|||
std::vector<Ort::Value> Run(ofImage &img); |
|||
std::vector<Ort::Value> RunBatch(std::vector<ofImage> &images); |
|||
std::string PrintShape(const std::vector<std::int64_t>& v); |
|||
Ort::Value VectorToTensor(std::vector<float>& data, const std::vector<std::int64_t>& shape); |
|||
Ort::Value GenerateTensor(); |
|||
int CalculateProduct(const std::vector<std::int64_t>& v); |
|||
void TransformImage(ofImage &img); |
|||
float ReduceMin(const float* data, size_t size); |
|||
float ReduceMax(const float* data, size_t size); |
|||
void Normalize(float* data, size_t size, float min_value, float max_value); |
|||
void DataToFbo(const float* data, size_t width, size_t height, ofFbo& fbo); |
|||
void Softmax(float* data, size_t size); |
|||
bool timeStamp = true; |
|||
bool log = false; |
|||
|
|||
protected: |
|||
Ort::Env ort_env; |
|||
Ort::SessionOptions session_options; |
|||
cv::Mat image_array; |
|||
std::shared_ptr<Ort::Session> ort_session; |
|||
std::vector<std::string> input_node_names; |
|||
std::vector<int64_t> input_node_dims; // 1 input only.
|
|||
std::size_t input_tensor_size = 1; |
|||
std::vector<float> input_values_handler; |
|||
Ort::MemoryInfo memory_info_handler = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault); |
|||
std::vector<std::string> output_node_names; |
|||
std::vector<std::vector<int64_t>> output_node_dims; // >=1 outputs
|
|||
std::vector<Ort::Value> output_values; |
|||
Ort::Value dummy_tensor{ nullptr }; |
|||
std::vector<ofImage> imageBatch; |
|||
int num_outputs = 1; |
|||
}; |
|||
|
|||
#endif |
@ -0,0 +1,55 @@ |
|||
#include "Player.h" |
|||
|
|||
Player::Player(){ |
|||
hasVideo = false; |
|||
} |
|||
|
|||
/* Basic ofVideoPlayer setup */ |
|||
void Player::Setup(){ |
|||
videoPlayer.setLoopState(OF_LOOP_NONE); |
|||
videoPlayer.setVolume(0); |
|||
} |
|||
|
|||
/* Updated the video player:
|
|||
(1) Allocates the required W x H for the model input |
|||
(2) Updates the video texture, and sets the current frame value */ |
|||
void Player::Update(ofImage &img){ |
|||
|
|||
if(!img.isAllocated() || img.getWidth() != videoPlayer.getWidth() || img.getHeight() != videoPlayer.getHeight()){ |
|||
img.allocate(videoPlayer.getWidth(), videoPlayer.getHeight(), OF_IMAGE_COLOR); |
|||
std::cout << "allocating new ofImage" << std::endl; |
|||
} |
|||
|
|||
if(videoPlayer.isLoaded()){ |
|||
hasVideo = true; |
|||
playerCurrentFrame = videoPlayer.getCurrentFrame(); |
|||
videoPlayer.update(); |
|||
videoPlayer.play(); |
|||
} |
|||
} |
|||
|
|||
void Player::Draw(){ |
|||
if(videoPlayer.isLoaded()){ |
|||
videoPlayer.draw(0, 0); |
|||
} |
|||
} |
|||
|
|||
ofPixels Player::GetVideoPixels(){ |
|||
return videoPlayer.getPixels(); |
|||
} |
|||
|
|||
/* Loads the video from path:
|
|||
(1) Sets the frame |
|||
(2) Allocates the fbo dims for final render */ |
|||
void Player::SetVideo(std::string path, ofFbo &fbo){ |
|||
videoPlayer.load(path); |
|||
videoPlayer.setFrame(800); |
|||
fbo.allocate(videoPlayer.getWidth(), videoPlayer.getHeight(), GL_RGB); |
|||
} |
|||
|
|||
// Sets a random frame in the active video
|
|||
void Player::SetRandomFrame(){ |
|||
int randomFrame = ofRandom(0, videoPlayer.getTotalNumFrames()); |
|||
std::cout << "setting frame: " << randomFrame << std::endl; |
|||
videoPlayer.setFrame(randomFrame); |
|||
} |
@ -0,0 +1,39 @@ |
|||
#ifndef _PLAYER |
|||
#define _PLAYER |
|||
|
|||
#include "ofMain.h" |
|||
|
|||
class Player { |
|||
|
|||
public: |
|||
|
|||
void Setup(); |
|||
void Update(ofImage &img); |
|||
void Draw(); |
|||
void SetVideo(std::string path, ofFbo &fbo); |
|||
ofPixels GetVideoPixels(); |
|||
void SetVideoPosition(); |
|||
void SetRandomFrame(); |
|||
void SetupGUI(); |
|||
void UpdateGUI(); |
|||
void UpdateVector(); |
|||
void CheckNewFrame(); |
|||
void GetCurrentFrame(); |
|||
|
|||
ofVideoPlayer videoPlayer; |
|||
|
|||
int playerCurrentFrame; |
|||
int playerTotalFrameNum; |
|||
int playerVideoIndex; |
|||
std::string videoPath; |
|||
bool hasVideo; |
|||
|
|||
glm::vec2 centerPosition; |
|||
|
|||
ofFbo fbo; |
|||
|
|||
Player(); |
|||
|
|||
}; |
|||
|
|||
#endif |
@ -0,0 +1,155 @@ |
|||
#include "Yolo.h" |
|||
|
|||
// Takes output tensor data, processes that data, and returns an array of BoxfWithLandmarks (detected_faces)
|
|||
void Yolo::ParseOutput(float* &output_tensors, std::vector<types::BoxfWithLandmarks> &sorted_faces, unsigned int num_anchors) { |
|||
|
|||
std::vector<types::BoxfWithLandmarks> detected_faces; |
|||
|
|||
for (unsigned int i = 0; i < num_anchors; ++i) { |
|||
const float *row_ptr = output_tensors + i * 16; // Each row contains 16 values
|
|||
float obj_conf = row_ptr[4]; // Objectness confidence
|
|||
|
|||
if (obj_conf < 0.5) continue; // Filter out low-confidence detections
|
|||
|
|||
// Extract bounding box, confidence, and landmarks
|
|||
float cx = row_ptr[0]; |
|||
float cy = row_ptr[1]; |
|||
float w = row_ptr[2]; |
|||
float h = row_ptr[3]; |
|||
float cls_conf = row_ptr[15]; // Face confidence score
|
|||
|
|||
if (cls_conf < 0.5) continue; // Filter by class confidence
|
|||
|
|||
types::BoxfWithLandmarks face; |
|||
face.box.x1 = cx - w / 2; |
|||
face.box.y1 = cy - h / 2; |
|||
face.box.x2 = cx + w / 2; |
|||
face.box.y2 = cy + h / 2; |
|||
face.box.score = cls_conf; |
|||
face.box.label_text = "face"; |
|||
|
|||
// Extract landmarks
|
|||
for (int j = 0; j < 10; j += 2) { |
|||
face.landmarks.points.push_back(cv::Point2f(row_ptr[5 + j], row_ptr[5 + j + 1])); |
|||
} |
|||
|
|||
detected_faces.push_back(face); // Store the detected face with landmarks
|
|||
} |
|||
|
|||
// Apply NMS to detected faces list to remove any overlapping bounding boxes.
|
|||
NonMaximumSuppression(detected_faces, sorted_faces, 0.5); |
|||
|
|||
// Sort faces based on confidence value
|
|||
SortDetectedFaces(sorted_faces); |
|||
} |
|||
|
|||
// Simple helper for drawing boxes given x1, y1, x2, y2 coordinates.
|
|||
void Yolo::DrawBox(std::vector<types::BoxfWithLandmarks> &detected_faces){ |
|||
for (const auto &face : detected_faces) { |
|||
ofNoFill(); |
|||
ofDrawRectangle(face.box.x1, face.box.y1, face.box.x2 - face.box.x1, face.box.y2 - face.box.y1); |
|||
} |
|||
} |
|||
|
|||
// Simple helper to draw boxes at the center of the detected face.
|
|||
void Yolo::DrawCenter(std::vector<types::BoxfWithLandmarks> &detected_faces){ |
|||
ofNoFill(); |
|||
ofDrawCircle(detected_faces[0].box.center, 5); |
|||
|
|||
} |
|||
|
|||
// Applies NMS to an array of BoxfWithLandmarks.face.boxes, to remove any overlapping bounding boxes.
|
|||
void Yolo::NonMaximumSuppression(std::vector<types::BoxfWithLandmarks> &input_faces, std::vector<types::BoxfWithLandmarks> &output_faces, float iou_threshold) |
|||
{ |
|||
// Sort the boxes by their confidence scores (highest to lowest)
|
|||
std::sort(input_faces.begin(), input_faces.end(), |
|||
[](const types::BoxfWithLandmarks &a, const types::BoxfWithLandmarks &b) { |
|||
return a.box.score > b.box.score; |
|||
}); |
|||
|
|||
std::vector<int> suppressed(input_faces.size(), 0); // Suppression mask
|
|||
|
|||
// Iterate through the boxes
|
|||
for (size_t i = 0; i < input_faces.size(); ++i) { |
|||
if (suppressed[i]) continue; // Skip already suppressed boxes
|
|||
|
|||
// Add this box to the output
|
|||
output_faces.push_back(input_faces[i]); |
|||
|
|||
for (size_t j = i + 1; j < input_faces.size(); ++j) { |
|||
if (suppressed[j]) continue; |
|||
|
|||
// Calculate IoU between box i and box j
|
|||
float iou = input_faces[i].box.iou_of(input_faces[j].box); |
|||
|
|||
// Suppress box j if IoU is greater than the threshold
|
|||
if (iou > iou_threshold) { |
|||
suppressed[j] = 1; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Scales the coordinates of detected faces from the model output dimensions -> the original input image dimensions.
|
|||
void Yolo::ConvertBoxCoordsToOriginalSize(std::vector<types::BoxfWithLandmarks> &detected_faces, size_t original_width, size_t original_height){ |
|||
float width_scale = static_cast<float>(original_width) / modelSize; |
|||
float height_scale = static_cast<float>(original_height) / modelSize; |
|||
|
|||
for (auto &face : detected_faces) { |
|||
// Convert bounding box coordinates
|
|||
face.box.x1 *= width_scale; |
|||
face.box.y1 *= height_scale; |
|||
face.box.x2 *= width_scale; |
|||
face.box.y2 *= height_scale; |
|||
face.box.UpdateCenter(); |
|||
|
|||
// Convert landmarks
|
|||
for (size_t j = 0; j < face.landmarks.points.size(); ++j) { |
|||
face.landmarks.points[j].x *= width_scale; |
|||
face.landmarks.points[j].y *= height_scale; |
|||
} |
|||
} |
|||
} |
|||
|
|||
void Yolo::CropFaceToImage(ofImage &inputImage, types::BoxfWithLandmarks &face, ofxCvColorImage &colorImage){ |
|||
|
|||
colorImage.resetROI(); |
|||
|
|||
// Calculate the coordinates and dimensions of the face box
|
|||
float x1 = face.box.x1; |
|||
float y1 = face.box.y1; |
|||
float x2 = face.box.x2; |
|||
float y2 = face.box.y2; |
|||
|
|||
// Ensure coordinates are within the input image bounds
|
|||
x1 = ofClamp(x1, 0.0f, (float)inputImage.getWidth()); |
|||
y1 = ofClamp(y1, 0.0f, (float)inputImage.getHeight()); |
|||
x2 = ofClamp(x2, 0.0f, (float)inputImage.getWidth()); |
|||
y2 = ofClamp(y2, 0.0f, (float)inputImage.getHeight()); |
|||
|
|||
// Calculate width and height of the cropped area
|
|||
float cropWidth = x2 - x1; |
|||
float cropHeight = y2 - y1; |
|||
|
|||
// Create cropped section, defined by the box coords
|
|||
ofFbo tempFbo; |
|||
tempFbo.allocate(cropWidth, cropHeight, GL_RGB); |
|||
|
|||
tempFbo.begin(); |
|||
ofClear(0); |
|||
inputImage.getTexture().drawSubsection(0, 0, cropWidth, cropHeight, x1, y1); |
|||
tempFbo.end(); |
|||
|
|||
ofFloatPixels pix; |
|||
tempFbo.readToPixels(pix); |
|||
colorImage.setFromPixels(pix); |
|||
|
|||
colorImage.resize(260, 260); |
|||
} |
|||
|
|||
void Yolo::SortDetectedFaces(std::vector<types::BoxfWithLandmarks> &detectedFaces){ |
|||
std::sort(detectedFaces.begin(), detectedFaces.end(), |
|||
[](const types::BoxfWithLandmarks &a, const types::BoxfWithLandmarks &b) { |
|||
return a.box.score > b.box.score; // Sort in descending order
|
|||
}); |
|||
} |
@ -0,0 +1,81 @@ |
|||
#ifndef YOLO |
|||
#define YOLO |
|||
|
|||
#include "ofMain.h" |
|||
#include "ofxOpenCv.h" |
|||
#include <onnxruntime_cxx_api.h> |
|||
#include <algorithm> |
|||
|
|||
struct Emotef{ |
|||
float emotions[7]; |
|||
}; |
|||
|
|||
namespace types { |
|||
|
|||
/*
|
|||
Struct for storing information about detetced faces. |
|||
*/ |
|||
struct Boxf { |
|||
float x1, y1, x2, y2; // Coordinates of the bounding box
|
|||
float score; // Confidence score
|
|||
glm::vec2 center; |
|||
int label; // Class label (e.g., "face")
|
|||
std::string label_text; |
|||
Emotef emotional_state; |
|||
|
|||
// Calculate Intersection over Union (IoU) with another box
|
|||
float iou_of(const Boxf &other) const { |
|||
float intersection_x1 = std::max(x1, other.x1); |
|||
float intersection_y1 = std::max(y1, other.y1); |
|||
float intersection_x2 = std::min(x2, other.x2); |
|||
float intersection_y2 = std::min(y2, other.y2); |
|||
|
|||
float intersection_area = std::max(0.0f, intersection_x2 - intersection_x1) * |
|||
std::max(0.0f, intersection_y2 - intersection_y1); |
|||
|
|||
float this_area = (x2 - x1) * (y2 - y1); |
|||
float other_area = (other.x2 - other.x1) * (other.y2 - other.y1); |
|||
|
|||
float union_area = this_area + other_area - intersection_area; |
|||
|
|||
return intersection_area / union_area; |
|||
} |
|||
|
|||
void UpdateCenter(){ |
|||
center.x = (x1 + x2) / 2; |
|||
center.y = (y1 + y2) / 2; |
|||
} |
|||
|
|||
void SetEmotionState(float* emotional_data){ |
|||
std::copy(emotional_data, emotional_data + 7, emotional_state.emotions); |
|||
} |
|||
}; |
|||
|
|||
struct Landmarks { |
|||
std::vector<cv::Point2f> points; // Facial landmarks points (e.g., eyes, nose, mouth)
|
|||
bool flag = false; // Indicator if landmarks are available
|
|||
}; |
|||
|
|||
struct BoxfWithLandmarks { |
|||
Boxf box; // Bounding box for the face
|
|||
Landmarks landmarks; // Landmark points for the face
|
|||
bool flag = false; // Indicator if this detection is valid
|
|||
}; |
|||
} |
|||
|
|||
class Yolo{ |
|||
public: |
|||
Yolo(){}; |
|||
void ParseOutput(float* &out_ptr, std::vector<types::BoxfWithLandmarks> &sorted_faces, unsigned int num_anchors); |
|||
void DrawBox(std::vector<types::BoxfWithLandmarks> &detected_faces); |
|||
void DrawCenter(std::vector<types::BoxfWithLandmarks> &detected_faces); |
|||
void NonMaximumSuppression(std::vector<types::BoxfWithLandmarks> &input_faces, std::vector<types::BoxfWithLandmarks> &output_faces, float iou_threshold); |
|||
void ConvertBoxCoordsToOriginalSize(std::vector<types::BoxfWithLandmarks> &detected_faces, size_t original_width, size_t original_height); |
|||
void CropFaceToImage(ofImage &inputImage, types::BoxfWithLandmarks &face, ofxCvColorImage &colorImage); |
|||
void SortDetectedFaces(std::vector<types::BoxfWithLandmarks> &detectedFaces); |
|||
private: |
|||
// Input dimenions of the model -- used for coordinate scaling.
|
|||
size_t modelSize = 640; |
|||
}; |
|||
|
|||
#endif |
@ -0,0 +1,17 @@ |
|||
#include "ofMain.h" |
|||
#include "ofApp.h" |
|||
|
|||
//========================================================================
|
|||
int main( ){ |
|||
|
|||
//Use ofGLFWWindowSettings for more options like multi-monitor fullscreen
|
|||
ofGLWindowSettings settings; |
|||
settings.setSize(1280, 720); |
|||
settings.windowMode = OF_WINDOW; //can also be OF_FULLSCREEN
|
|||
|
|||
auto window = ofCreateWindow(settings); |
|||
|
|||
ofRunApp(window, make_shared<ofApp>()); |
|||
ofRunMainLoop(); |
|||
|
|||
} |
@ -0,0 +1,210 @@ |
|||
#include "ofApp.h" |
|||
|
|||
//--------------------------------------------------------------
|
|||
void ofApp::setup(){ |
|||
ofSetFrameRate(24); |
|||
ofSetVerticalSync(true); |
|||
|
|||
player.Setup(); |
|||
player.SetVideo("videos/demo.mp4", fbo); |
|||
|
|||
emoteImage.allocate(260, 260); |
|||
tempImage.allocate(emoteImage.getWidth(), emoteImage.getHeight(), OF_IMAGE_COLOR); |
|||
|
|||
ORTCHAR_T* modelPath = "/home/cailean/Desktop/openframeworks/of_v0.12.0_linux64gcc6_release/apps/myApps/onnx-test/bin/data/depth_anything_v2_vitb.onnx"; |
|||
ORTCHAR_T* modelPath2 = "/home/cailean/Desktop/openframeworks/of_v0.12.0_linux64gcc6_release/apps/myApps/onnx-test/bin/data/yolov5s-face.onnx"; |
|||
ORTCHAR_T* modelPath3 = "/home/cailean/Desktop/openframeworks/of_v0.12.0_linux64gcc6_release/apps/myApps/onnx-test/bin/data/rgb_emotion.onnx"; |
|||
|
|||
/* Setup Models (modelPath, log, useCuda) */ |
|||
yolo.Setup(modelPath2, false, true); |
|||
depth.Setup(modelPath, false, true); |
|||
emotion.Setup(modelPath3, false, true); |
|||
} |
|||
|
|||
|
|||
|
|||
//--------------------------------------------------------------
|
|||
void ofApp::update(){ |
|||
/* Check to see if the application has moved to the first frame
|
|||
As the models need to load first, as the first inference is quite slow */ |
|||
if(ofGetFrameNum() > 0) |
|||
firstRun = false; |
|||
|
|||
/* Clear detetced face list */ |
|||
detected_faces.clear(); |
|||
|
|||
/* Setup model input using ofImage */ |
|||
player.Update(img); |
|||
img.setFromPixels(player.GetVideoPixels()); |
|||
|
|||
/* Run Models */ |
|||
try{ |
|||
auto output_tensors = depth.Run(img); |
|||
float* output_ptr = output_tensors.front().GetTensorMutableData<float>(); |
|||
size_t num_elements = output_tensors.front().GetTensorTypeAndShapeInfo().GetElementCount(); |
|||
|
|||
float min_value = depth.ReduceMin(output_ptr, num_elements); |
|||
float max_value = depth.ReduceMax(output_ptr, num_elements); |
|||
|
|||
depth.Normalize(output_ptr, num_elements, min_value, max_value); |
|||
|
|||
depth.DataToFbo(output_ptr, 518, 518, fbo); |
|||
|
|||
auto output_tensors_face = yolo.Run(img); |
|||
|
|||
auto output_faces = output_tensors_face.front().GetTensorTypeAndShapeInfo().GetShape(); |
|||
|
|||
unsigned int num_anchors = output_faces[1]; // Number of anchors
|
|||
|
|||
float* output_face_ptr = output_tensors_face.front().GetTensorMutableData<float>(); |
|||
|
|||
faceDetector.ParseOutput(output_face_ptr, detected_faces, num_anchors); |
|||
|
|||
faceDetector.ConvertBoxCoordsToOriginalSize(detected_faces, fbo.getWidth(), fbo.getHeight()); |
|||
|
|||
/* As no input is generated for the emotion recognition model, run a dummy vector through the model
|
|||
So it can load */ |
|||
if(firstRun){ |
|||
|
|||
/*
|
|||
Create a dummy initial input of batch_size = 5, as |
|||
when initialising the model, it will attempt to create a space in memory for this array. |
|||
If the batch_size does change it will completely slow down inference, due to how the cudnn_search_algo is set. |
|||
None of the other search alogithms bar EXHAUSTIVE will work.. no idead why. |
|||
*/ |
|||
for(int i = 0; i < emotionImageMaxBatchSize; i++){ |
|||
tempImage.setFromPixels(emoteImage.getPixels()); |
|||
croppedFaces.push_back(tempImage); |
|||
} |
|||
|
|||
// Run model to warmup
|
|||
auto emotion_output_tensor = emotion.RunBatch(croppedFaces); |
|||
|
|||
} else { |
|||
inferEmotionalState(); |
|||
} |
|||
|
|||
/* Run emotion inference */ |
|||
//inferEmotionalState();
|
|||
|
|||
} catch (exception e){ |
|||
|
|||
std::cout << "Model did not run" << std::endl; |
|||
|
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
//--------------------------------------------------------------
|
|||
void ofApp::draw(){ |
|||
fbo.draw(0, 0); |
|||
|
|||
if(!firstRun){ |
|||
faceDetector.DrawBox(detected_faces); |
|||
faceDetector.DrawCenter(detected_faces); |
|||
} |
|||
|
|||
// emoteImage.draw(640, 0);
|
|||
// for(auto& face : detected_faces){
|
|||
// ofDrawBitmapString(std::to_string(face.box.emotional_state.emotions[0]), 700, 300);
|
|||
// }
|
|||
|
|||
} |
|||
|
|||
//--------------------------------------------------------------
|
|||
void ofApp::inferEmotionalState(){ |
|||
|
|||
/*
|
|||
Max faces to process with the model (5) |
|||
*/ |
|||
int max_faces_to_process = std::min(emotionImageMaxBatchSize, static_cast<int>(detected_faces.size())); |
|||
|
|||
/*
|
|||
For the detetced faces, set the cropped image to a location in the image batch array |
|||
*/ |
|||
for (size_t i = 0; i < max_faces_to_process; i++){ |
|||
auto& face = detected_faces[i]; |
|||
faceDetector.CropFaceToImage(img, face, emoteImage); |
|||
tempImage.setFromPixels(emoteImage.getPixels()); |
|||
croppedFaces[i] = tempImage; |
|||
} |
|||
|
|||
|
|||
auto emotion_output_tensor = emotion.RunBatch(croppedFaces); |
|||
|
|||
auto& output_tensor = emotion_output_tensor.front(); |
|||
auto output_shap = output_tensor.GetTensorTypeAndShapeInfo().GetShape(); |
|||
size_t batch_size = output_shap[0]; // Number of images in the batch
|
|||
size_t num_classes = output_shap[1]; // Number of emotion classes
|
|||
std::cout << batch_size << " : " << num_classes << std::endl; |
|||
|
|||
// for(int i = 0; i < max_faces_to_process; ++i){
|
|||
// auto& face = detected_faces[i];
|
|||
// faceDetector.CropFaceToImage(img, face, emoteImage);
|
|||
// tempImage.setFromPixels(emoteImage.getPixels());
|
|||
// auto emotion_output_tensor = emotion.Run(tempImage);
|
|||
// float* emotional_data = emotion_output_tensor.front().GetTensorMutableData<float>();
|
|||
// emotion.Softmax(emotional_data, 7);
|
|||
// face.box.SetEmotionState(emotional_data);
|
|||
// }
|
|||
|
|||
std::cout << croppedFaces.size() << std::endl; |
|||
} |
|||
|
|||
//--------------------------------------------------------------
|
|||
void ofApp::keyPressed(int key){ |
|||
if (key=OF_KEY_LEFT){ |
|||
player.SetRandomFrame(); |
|||
} |
|||
} |
|||
|
|||
//--------------------------------------------------------------
|
|||
void ofApp::keyReleased(int key){ |
|||
|
|||
} |
|||
|
|||
//--------------------------------------------------------------
|
|||
void ofApp::mouseMoved(int x, int y ){ |
|||
|
|||
} |
|||
|
|||
//--------------------------------------------------------------
|
|||
void ofApp::mouseDragged(int x, int y, int button){ |
|||
|
|||
} |
|||
|
|||
//--------------------------------------------------------------
|
|||
void ofApp::mousePressed(int x, int y, int button){ |
|||
|
|||
} |
|||
|
|||
//--------------------------------------------------------------
|
|||
void ofApp::mouseReleased(int x, int y, int button){ |
|||
|
|||
} |
|||
|
|||
//--------------------------------------------------------------
|
|||
void ofApp::mouseEntered(int x, int y){ |
|||
|
|||
} |
|||
|
|||
//--------------------------------------------------------------
|
|||
void ofApp::mouseExited(int x, int y){ |
|||
|
|||
} |
|||
|
|||
//--------------------------------------------------------------
|
|||
void ofApp::windowResized(int w, int h){ |
|||
|
|||
} |
|||
|
|||
//--------------------------------------------------------------
|
|||
void ofApp::gotMessage(ofMessage msg){ |
|||
|
|||
} |
|||
|
|||
//--------------------------------------------------------------
|
|||
void ofApp::dragEvent(ofDragInfo dragInfo){ |
|||
|
|||
} |
@ -0,0 +1,49 @@ |
|||
#pragma once |
|||
|
|||
#include "ofMain.h" |
|||
#include <onnxruntime_cxx_api.h> |
|||
#include "ofxOpenCv.h" |
|||
#include "Onnx.h" |
|||
#include "Yolo.h" |
|||
#include <vector> |
|||
#include "Player.h" |
|||
|
|||
class ofApp : public ofBaseApp{ |
|||
|
|||
public: |
|||
void setup(); |
|||
void update(); |
|||
void draw(); |
|||
|
|||
void keyPressed(int key); |
|||
void keyReleased(int key); |
|||
void mouseMoved(int x, int y ); |
|||
void mouseDragged(int x, int y, int button); |
|||
void mousePressed(int x, int y, int button); |
|||
void mouseReleased(int x, int y, int button); |
|||
void mouseEntered(int x, int y); |
|||
void mouseExited(int x, int y); |
|||
void windowResized(int w, int h); |
|||
void dragEvent(ofDragInfo dragInfo); |
|||
void gotMessage(ofMessage msg); |
|||
void inferEmotionalState(); |
|||
|
|||
ofImage img; |
|||
ofFbo fbo; |
|||
cv::Mat cvImg; |
|||
ofVideoGrabber webcam; |
|||
Player player; |
|||
bool firstRun = true; |
|||
|
|||
Onnx depth; |
|||
Onnx yolo; |
|||
Onnx emotion; |
|||
ofxCvColorImage emoteImage; |
|||
ofImage tempImage; |
|||
std::vector<ofImage> croppedFaces; |
|||
int emotionImageMaxBatchSize = 5; |
|||
|
|||
Emotef emo; |
|||
Yolo faceDetector; |
|||
std::vector<types::BoxfWithLandmarks> detected_faces; |
|||
}; |
Loading…
Reference in new issue