├── .github ├── Logo_main_black.png ├── generate_gh_pages.sh ├── issue_template.md └── stale.yml ├── .gitignore ├── .gitmodules ├── .travis.yml ├── 3rdparty ├── Versions.txt ├── osx │ └── install_deps.sh └── windows │ ├── getCaffe.bat │ ├── getCaffe3rdparty.bat │ ├── getFreeglut.bat │ ├── getOpenCV.bat │ ├── unzip │ ├── LICENSE.txt │ └── unzip.exe │ └── wget │ ├── COPYING │ ├── Version_wget-1.19.1-win64.txt │ ├── wget.exe │ ├── wget.exe.debug │ ├── wget.html │ └── wget.ini.sample ├── CMakeLists.txt ├── LICENSE ├── README.md ├── cmake ├── Cuda.cmake ├── Modules │ ├── FindCaffe.cmake │ ├── FindCuDNN.cmake │ ├── FindGFlags.cmake │ ├── FindGlog.cmake │ ├── FindLIBIGL.cmake │ └── FindSpinnaker.cmake ├── OpenPose.vcxproj.user ├── OpenPoseConfig.cmake.in ├── OpenPose_CL.vcxproj.user ├── OpenPose_CPU.vcxproj.user ├── Utils.cmake └── cmake_uninstall.cmake.in ├── doc ├── Chessboard_in_PDF │ ├── pattern.eps │ └── pattern.pdf ├── GUI_help │ ├── GUI_help.odt │ └── GUI_help.png ├── UML │ └── 1_0_0rc3 │ │ ├── UML.mdj │ │ ├── UML.pdf │ │ └── UML.png ├── contributors.md ├── demo_overview.md ├── doc_autogeneration.doxygen ├── faq.md ├── installation.md ├── installation_deprecated.md ├── installation_jetson_tx2.md ├── library_add_new_module.md ├── library_extend_functionality.md ├── library_how_to_develop.md ├── library_introduction.md ├── library_overview.md ├── media │ ├── body_heat_maps.png │ ├── cmake_installation │ │ ├── im_1.png │ │ ├── im_1_windows.png │ │ ├── im_2.png │ │ ├── im_2_windows.png │ │ ├── im_3.png │ │ ├── im_3_windows.png │ │ └── im_5.png │ ├── dance.gif │ ├── dance_foot.gif │ ├── keypoints_face.png │ ├── keypoints_hand.odt │ ├── keypoints_hand.png │ ├── keypoints_pose.png │ ├── openpose3d.gif │ ├── paf_heat_maps.png │ ├── pose_face.gif │ ├── pose_face_hands.gif │ ├── pose_hands.gif │ └── shake.gif ├── modules │ ├── 3d_reconstruction_module.md │ ├── calibration_module.md │ └── python_module.md ├── output.md ├── quick_start.md ├── release_notes.md ├── released_features.md └── standalone_face_or_hand_keypoint_detector.md ├── examples ├── CMakeLists.txt ├── calibration │ ├── CMakeLists.txt │ └── calibration.cpp ├── media │ ├── COCO_val2014_000000000192.jpg │ ├── COCO_val2014_000000000241.jpg │ ├── COCO_val2014_000000000257.jpg │ ├── COCO_val2014_000000000294.jpg │ ├── COCO_val2014_000000000328.jpg │ ├── COCO_val2014_000000000338.jpg │ ├── COCO_val2014_000000000357.jpg │ ├── COCO_val2014_000000000360.jpg │ ├── COCO_val2014_000000000395.jpg │ ├── COCO_val2014_000000000415.jpg │ ├── COCO_val2014_000000000428.jpg │ ├── COCO_val2014_000000000459.jpg │ ├── COCO_val2014_000000000474.jpg │ ├── COCO_val2014_000000000488.jpg │ ├── COCO_val2014_000000000536.jpg │ ├── COCO_val2014_000000000544.jpg │ ├── COCO_val2014_000000000564.jpg │ ├── COCO_val2014_000000000569.jpg │ ├── COCO_val2014_000000000589.jpg │ ├── COCO_val2014_000000000623.jpg │ └── video.avi ├── openpose │ ├── CMakeLists.txt │ └── openpose.cpp ├── tests │ ├── CMakeLists.txt │ ├── clTest.cpp │ ├── drawProtoTxt.sh │ ├── handFromJsonTest.cpp │ ├── hand_accuracy_test.sh │ ├── pose_accuracy_car_val.sh │ ├── pose_accuracy_coco_test_dev.sh │ ├── pose_accuracy_coco_val.sh │ ├── pose_accuracy_coco_val_2014.sh │ ├── pose_accuracy_coco_val_foot.sh │ ├── pose_accuracy_coco_val_server.sh │ ├── pose_accuracy_coco_val_server_2014.sh │ ├── pose_time_Caffe_layers.sh │ ├── pose_time_visual_GUI.sh │ ├── resizeTest.cpp │ ├── speed_test.sh │ └── wrapperHandFromJsonTest.hpp ├── tutorial_add_module │ ├── 1_custom_post_processing.cpp │ ├── CMakeLists.txt │ ├── userDatum.hpp │ ├── userPostProcessing.hpp │ └── wUserPostProcessing.hpp ├── tutorial_pose │ ├── 1_extract_from_image.cpp │ ├── 2_extract_pose_or_heatmat_from_image.cpp │ └── CMakeLists.txt ├── tutorial_python │ ├── 1_extract_pose.py │ ├── 2_pose_from_heatmaps.py │ └── CMakeLists.txt ├── tutorial_thread │ ├── 1_openpose_read_and_display.cpp │ ├── 2_user_processing_function.cpp │ ├── 3_user_input_processing_and_output.cpp │ ├── 4_user_input_processing_output_and_datum.cpp │ └── CMakeLists.txt ├── tutorial_wrapper │ ├── 1_user_synchronous_postprocessing.cpp │ ├── 2_user_synchronous_input.cpp │ ├── 3_user_synchronous_output.cpp │ ├── 4_user_synchronous_all.cpp │ ├── 5_user_asynchronous.cpp │ ├── 6_user_asynchronous_output.cpp │ └── CMakeLists.txt └── user_code │ ├── CMakeLists.txt │ └── README.md ├── include └── openpose │ ├── 3d │ ├── cameraParameterReader.hpp │ ├── headers.hpp │ ├── jointAngleEstimation.hpp │ ├── poseTriangulation.hpp │ ├── wJointAngleEstimation.hpp │ └── wPoseTriangulation.hpp │ ├── calibration │ ├── cameraParameterEstimation.hpp │ ├── gridPatternFunctions.hpp │ └── headers.hpp │ ├── core │ ├── array.hpp │ ├── common.hpp │ ├── cvMatToOpInput.hpp │ ├── cvMatToOpOutput.hpp │ ├── datum.hpp │ ├── enumClasses.hpp │ ├── gpuRenderer.hpp │ ├── headers.hpp │ ├── keepTopNPeople.hpp │ ├── keypointScaler.hpp │ ├── macros.hpp │ ├── opOutputToCvMat.hpp │ ├── point.hpp │ ├── rectangle.hpp │ ├── renderer.hpp │ ├── scaleAndSizeExtractor.hpp │ ├── wCvMatToOpInput.hpp │ ├── wCvMatToOpOutput.hpp │ ├── wKeepTopNPeople.hpp │ ├── wKeypointScaler.hpp │ ├── wOpOutputToCvMat.hpp │ └── wScaleAndSizeExtractor.hpp │ ├── face │ ├── faceCpuRenderer.hpp │ ├── faceDetector.hpp │ ├── faceDetectorOpenCV.hpp │ ├── faceExtractorCaffe.hpp │ ├── faceExtractorNet.hpp │ ├── faceGpuRenderer.hpp │ ├── faceParameters.hpp │ ├── faceRenderer.hpp │ ├── headers.hpp │ ├── renderFace.hpp │ ├── wFaceDetector.hpp │ ├── wFaceDetectorOpenCV.hpp │ ├── wFaceExtractorNet.hpp │ └── wFaceRenderer.hpp │ ├── filestream │ ├── bvhSaver.hpp │ ├── cocoJsonSaver.hpp │ ├── enumClasses.hpp │ ├── fileSaver.hpp │ ├── fileStream.hpp │ ├── headers.hpp │ ├── heatMapSaver.hpp │ ├── imageSaver.hpp │ ├── jsonOfstream.hpp │ ├── keypointSaver.hpp │ ├── peopleJsonSaver.hpp │ ├── udpSender.hpp │ ├── videoSaver.hpp │ ├── wBvhSaver.hpp │ ├── wCocoJsonSaver.hpp │ ├── wFaceSaver.hpp │ ├── wHandSaver.hpp │ ├── wHeatMapSaver.hpp │ ├── wImageSaver.hpp │ ├── wPeopleJsonSaver.hpp │ ├── wPoseSaver.hpp │ ├── wUdpSender.hpp │ └── wVideoSaver.hpp │ ├── gpu │ ├── cl2.hpp │ ├── cuda.hpp │ ├── cuda.hu │ ├── enumClasses.hpp │ ├── gpu.hpp │ ├── headers.hpp │ └── opencl.hcl │ ├── gui │ ├── enumClasses.hpp │ ├── frameDisplayer.hpp │ ├── gui.hpp │ ├── gui3D.hpp │ ├── guiAdam.hpp │ ├── guiInfoAdder.hpp │ ├── headers.hpp │ ├── wGui.hpp │ ├── wGui3D.hpp │ ├── wGuiAdam.hpp │ └── wGuiInfoAdder.hpp │ ├── hand │ ├── handCpuRenderer.hpp │ ├── handDetector.hpp │ ├── handDetectorFromTxt.hpp │ ├── handExtractorCaffe.hpp │ ├── handExtractorNet.hpp │ ├── handGpuRenderer.hpp │ ├── handParameters.hpp │ ├── handRenderer.hpp │ ├── headers.hpp │ ├── renderHand.hpp │ ├── wHandDetector.hpp │ ├── wHandDetectorFromTxt.hpp │ ├── wHandDetectorTracking.hpp │ ├── wHandDetectorUpdate.hpp │ ├── wHandExtractorNet.hpp │ └── wHandRenderer.hpp │ ├── headers.hpp │ ├── net │ ├── headers.hpp │ ├── maximumBase.hpp │ ├── maximumCaffe.hpp │ ├── net.hpp │ ├── netCaffe.hpp │ ├── nmsBase.hpp │ ├── nmsCaffe.hpp │ ├── resizeAndMergeBase.hpp │ └── resizeAndMergeCaffe.hpp │ ├── pose │ ├── bodyPartConnectorBase.hpp │ ├── bodyPartConnectorCaffe.hpp │ ├── enumClasses.hpp │ ├── headers.hpp │ ├── poseCpuRenderer.hpp │ ├── poseExtractor.hpp │ ├── poseExtractorCaffe.hpp │ ├── poseExtractorNet.hpp │ ├── poseGpuRenderer.hpp │ ├── poseParameters.hpp │ ├── poseParametersRender.hpp │ ├── poseRenderer.hpp │ ├── renderPose.hpp │ ├── wPoseExtractor.hpp │ ├── wPoseExtractorNet.hpp │ └── wPoseRenderer.hpp │ ├── producer │ ├── datumProducer.hpp │ ├── enumClasses.hpp │ ├── flirReader.hpp │ ├── headers.hpp │ ├── imageDirectoryReader.hpp │ ├── ipCameraReader.hpp │ ├── producer.hpp │ ├── spinnakerWrapper.hpp │ ├── videoCaptureReader.hpp │ ├── videoReader.hpp │ ├── wDatumProducer.hpp │ └── webcamReader.hpp │ ├── thread │ ├── enumClasses.hpp │ ├── headers.hpp │ ├── priorityQueue.hpp │ ├── queue.hpp │ ├── queueBase.hpp │ ├── subThread.hpp │ ├── subThreadNoQueue.hpp │ ├── subThreadQueueIn.hpp │ ├── subThreadQueueInOut.hpp │ ├── subThreadQueueOut.hpp │ ├── thread.hpp │ ├── threadManager.hpp │ ├── wIdGenerator.hpp │ ├── wQueueAssembler.hpp │ ├── wQueueOrderer.hpp │ ├── worker.hpp │ ├── workerConsumer.hpp │ └── workerProducer.hpp │ ├── tracking │ ├── headers.hpp │ ├── personIdExtractor.hpp │ ├── personTracker.hpp │ ├── pyramidalLK.hpp │ └── wPersonIdExtractor.hpp │ ├── utilities │ ├── check.hpp │ ├── enumClasses.hpp │ ├── errorAndLog.hpp │ ├── fastMath.hpp │ ├── fileSystem.hpp │ ├── flagsToOpenPose.hpp │ ├── headers.hpp │ ├── keypoint.hpp │ ├── openCv.hpp │ ├── pointerContainer.hpp │ ├── profiler.hpp │ ├── render.hu │ ├── standard.hpp │ └── string.hpp │ └── wrapper │ ├── headers.hpp │ ├── wrapper.hpp │ ├── wrapperAuxiliary.hpp │ ├── wrapperStructExtra.hpp │ ├── wrapperStructFace.hpp │ ├── wrapperStructHand.hpp │ ├── wrapperStructInput.hpp │ ├── wrapperStructOutput.hpp │ └── wrapperStructPose.hpp ├── models ├── cameraParameters │ └── flir │ │ └── 17012332.xml.example ├── face │ ├── haarcascade_frontalface_alt.xml │ └── pose_deploy.prototxt ├── getModels.bat ├── getModels.sh ├── hand │ └── pose_deploy.prototxt └── pose │ ├── body_25 │ └── pose_deploy.prototxt │ ├── coco │ └── pose_deploy_linevec.prototxt │ └── mpi │ ├── pose_deploy_linevec.prototxt │ └── pose_deploy_linevec_faster_4_stages.prototxt ├── python ├── CMakeLists.txt └── openpose │ ├── CMakeLists.txt │ ├── __init__.py │ ├── _openpose.cpp │ └── openpose.py ├── src ├── CMakeLists.txt └── openpose │ ├── 3d │ ├── CMakeLists.txt │ ├── cameraParameterReader.cpp │ ├── defineTemplates.cpp │ ├── jointAngleEstimation.cpp │ └── poseTriangulation.cpp │ ├── CMakeLists.txt │ ├── calibration │ ├── CMakeLists.txt │ ├── cameraParameterEstimation.cpp │ └── gridPatternFunctions.cpp │ ├── core │ ├── CMakeLists.txt │ ├── array.cpp │ ├── cvMatToOpInput.cpp │ ├── cvMatToOpOutput.cpp │ ├── datum.cpp │ ├── defineTemplates.cpp │ ├── gpuRenderer.cpp │ ├── keepTopNPeople.cpp │ ├── keypointScaler.cpp │ ├── opOutputToCvMat.cpp │ ├── point.cpp │ ├── rectangle.cpp │ ├── renderer.cpp │ └── scaleAndSizeExtractor.cpp │ ├── face │ ├── CMakeLists.txt │ ├── defineTemplates.cpp │ ├── faceCpuRenderer.cpp │ ├── faceDetector.cpp │ ├── faceDetectorOpenCV.cpp │ ├── faceExtractorCaffe.cpp │ ├── faceExtractorNet.cpp │ ├── faceGpuRenderer.cpp │ ├── faceRenderer.cpp │ ├── renderFace.cpp │ └── renderFace.cu │ ├── filestream │ ├── CMakeLists.txt │ ├── bvhSaver.cpp │ ├── cocoJsonSaver.cpp │ ├── defineTemplates.cpp │ ├── fileSaver.cpp │ ├── fileStream.cpp │ ├── heatMapSaver.cpp │ ├── imageSaver.cpp │ ├── jsonOfstream.cpp │ ├── keypointSaver.cpp │ ├── peopleJsonSaver.cpp │ ├── udpSender.cpp │ └── videoSaver.cpp │ ├── gpu │ ├── CMakeLists.txt │ ├── cuda.cpp │ ├── gpu.cpp │ └── opencl.cpp │ ├── gui │ ├── CMakeLists.txt │ ├── defineTemplates.cpp │ ├── frameDisplayer.cpp │ ├── gui.cpp │ ├── gui3D.cpp │ ├── guiAdam.cpp │ └── guiInfoAdder.cpp │ ├── hand │ ├── CMakeLists.txt │ ├── defineTemplates.cpp │ ├── handCpuRenderer.cpp │ ├── handDetector.cpp │ ├── handDetectorFromTxt.cpp │ ├── handExtractorCaffe.cpp │ ├── handExtractorNet.cpp │ ├── handGpuRenderer.cpp │ ├── handRenderer.cpp │ ├── renderHand.cpp │ └── renderHand.cu │ ├── net │ ├── CMakeLists.txt │ ├── maximumBase.cpp │ ├── maximumBase.cu │ ├── maximumCaffe.cpp │ ├── netCaffe.cpp │ ├── nmsBase.cpp │ ├── nmsBase.cu │ ├── nmsBaseCL.cpp │ ├── nmsCaffe.cpp │ ├── resizeAndMergeBase.cpp │ ├── resizeAndMergeBase.cu │ ├── resizeAndMergeBaseCL.cpp │ └── resizeAndMergeCaffe.cpp │ ├── pose │ ├── CMakeLists.txt │ ├── bodyPartConnectorBase.cpp │ ├── bodyPartConnectorBase.cu │ ├── bodyPartConnectorCaffe.cpp │ ├── defineTemplates.cpp │ ├── poseCpuRenderer.cpp │ ├── poseExtractor.cpp │ ├── poseExtractorCaffe.cpp │ ├── poseExtractorNet.cpp │ ├── poseGpuRenderer.cpp │ ├── poseParameters.cpp │ ├── poseParametersRender.cpp │ ├── poseRenderer.cpp │ ├── renderPose.cpp │ └── renderPose.cu │ ├── producer │ ├── CMakeLists.txt │ ├── defineTemplates.cpp │ ├── flirReader.cpp │ ├── imageDirectoryReader.cpp │ ├── ipCameraReader.cpp │ ├── producer.cpp │ ├── spinnakerWrapper.cpp │ ├── videoCaptureReader.cpp │ ├── videoReader.cpp │ └── webcamReader.cpp │ ├── thread │ ├── CMakeLists.txt │ └── defineTemplates.cpp │ ├── tracking │ ├── CMakeLists.txt │ ├── defineTemplates.cpp │ ├── personIdExtractor.cpp │ ├── personTracker.cpp │ ├── pyramidalLK.cpp │ └── pyramidalLK.cu │ ├── utilities │ ├── CMakeLists.txt │ ├── errorAndLog.cpp │ ├── fileSystem.cpp │ ├── flagsToOpenPose.cpp │ ├── keypoint.cpp │ ├── openCv.cpp │ ├── profiler.cpp │ └── string.cpp │ └── wrapper │ ├── CMakeLists.txt │ ├── defineTemplates.cpp │ ├── wrapperAuxiliary.cpp │ ├── wrapperStructExtra.cpp │ ├── wrapperStructFace.cpp │ ├── wrapperStructHand.cpp │ ├── wrapperStructInput.cpp │ ├── wrapperStructOutput.cpp │ └── wrapperStructPose.cpp ├── ubuntu ├── Makefile.config.Ubuntu16_cuda8_JetsonTX2 ├── install_caffe_and_openpose_JetsonTX2_JetPack3.1.sh ├── install_cmake.sh ├── install_cuda.sh ├── install_cudnn.sh └── install_openpose_JetsonTX2_JetPack3.1.sh └── ubuntu_deprecated ├── Makefile.config.Ubuntu14_cuda7.example ├── Makefile.config.Ubuntu14_cuda8.example ├── Makefile.config.Ubuntu16_cuda7.example ├── Makefile.config.Ubuntu16_cuda8.example ├── Makefile.example ├── install_caffe_and_openpose_if_cuda8.sh └── install_openpose_if_cuda8.sh /.github/Logo_main_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/.github/Logo_main_black.png -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Number of days of inactivity before an issue becomes stale 2 | daysUntilStale: 60 3 | # Number of days of inactivity before a stale issue is closed 4 | daysUntilClose: 7 5 | # Issues with these labels will never be considered stale 6 | exemptLabels: 7 | - bug/typo 8 | - enhancement 9 | # Label to use when marking an issue as stale 10 | staleLabel: stale/old 11 | # Comment to post when marking an issue as stale. Set to `false` to disable 12 | markComment: > 13 | This issue has been automatically marked as stale because it has not had 14 | recent activity. It will be closed if no further activity occurs. Thank you 15 | for your contributions. 16 | # Comment to post when closing a stale issue. Set to `false` to disable 17 | closeComment: false 18 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "3rdparty/caffe"] 2 | path = 3rdparty/caffe 3 | url = https://github.com/CMU-Perceptual-Computing-Lab/caffe.git 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # This will run on Travis' 'new' container-based infrastructure 2 | 3 | # Blacklist 4 | branches: 5 | only: 6 | - master 7 | 8 | # OS 9 | dist: trusty 10 | sudo: required 11 | 12 | # Environment variables 13 | env: 14 | global: 15 | - GH_REPO_NAME: openpose 16 | - DOXYFILE: $TRAVIS_BUILD_DIR/doc/doc_autogeneration.doxygen 17 | # Set this in Environment Variables on travis-ci.org 18 | # - GH_REPO_REF: github.com//openpose.git 19 | 20 | # Install dependencies 21 | addons: 22 | apt: 23 | packages: 24 | - doxygen 25 | - doxygen-doc 26 | - doxygen-latex 27 | - doxygen-gui 28 | - graphviz 29 | 30 | # Build your code e.g. by calling make 31 | script: 32 | - ./ubuntu/install_cmake.sh 33 | - sudo apt-get -y install libatlas-base-dev 34 | - sudo apt-get -y install libopencv-dev 35 | - pip install --upgrade numpy 36 | - mkdir build 37 | - cd build 38 | - cmake -DBUILD_CAFFE=ON -DDOWNLOAD_BODY_25_MODEL=OFF -DDOWNLOAD_BODY_COCO_MODEL=OFF -DDOWNLOAD_FACE_MODEL=OFF -DDOWNLOAD_HAND_MODEL=OFF -DDOWNLOAD_BODY_MPI_MODEL=OFF .. 39 | - no_cores=`cat /proc/cpuinfo | grep processor | wc -l` 40 | - make -j${no_cores} 41 | 42 | # Generate and deploy documentation 43 | after_success: 44 | - cd $TRAVIS_BUILD_DIR 45 | - chmod +x .github/generate_gh_pages.sh 46 | - ./.github/generate_gh_pages.sh 47 | -------------------------------------------------------------------------------- /3rdparty/Versions.txt: -------------------------------------------------------------------------------- 1 | Asio: 2 | - Version 1.12.1. 3 | - Link: https://think-async.com/Asio/Download 4 | 5 | Eigen: 6 | - Version 3.3.4 (15.06.2017) 7 | - Link: http://eigen.tuxfamily.org/index.php?title=Main_Page 8 | 9 | Unix: 10 | - Caffe: 11 | - Version 1.0.0, extracted from GitHub on 04/26/2018 from the current master branch. 12 | - Link: https://github.com/BVLC/caffe 13 | - GitHub SHA: 864520713a4c5ffae7382ced5d34e4cadc608473 14 | 15 | - Spinnaker: 16 | - Tested on Spinnaker 1.13.0.31 SDK - Linux Ubuntu 16.04 (64-bit) — 05/25/2018 - 41.580MB. 17 | - Prerequisites: https://www.ptgrey.com/tan/10685 18 | 19 | Windows: 20 | - Caffe & Caffe dependencies (caffe3rdparty): 21 | - Version 1.0.0, extracted from GitHub on 07/11/2017 from the current master branch. 22 | - Link: https://github.com/BVLC/caffe/tree/windows 23 | 24 | - FreeGLUT (only for the 3-D reconstruction demo): 25 | - Version 3.0.0-2 (MSVC), extracted from their oficial website. 26 | - Link: https://www.transmissionzero.co.uk/software/freeglut-devel/ 27 | 28 | - OpenCV: 29 | - Version 3.1.0, extracted from their oficial website, section releases/3.1.0/Win pack. 30 | - Link: http://opencv.org/releases.html 31 | 32 | - Unzip: 33 | - Version 5.52. 34 | - Link: http://stahlworks.com/dev/?tool=zipunzip 35 | 36 | - Wget: 37 | - Version wget-1.19.1-win64. 38 | - Link: https://eternallybored.org/misc/wget/ 39 | -------------------------------------------------------------------------------- /3rdparty/osx/install_deps.sh: -------------------------------------------------------------------------------- 1 | echo "This requires brew" 2 | brew install openblas 3 | brew install -vd snappy leveldb gflags glog szip lmdb 4 | # need the homebrew science source for OpenCV and hdf5 5 | brew tap homebrew/science 6 | brew install hdf5 opencv 7 | # with Python pycaffe needs dependencies built from source 8 | brew install --build-from-source --with-python -vd protobuf 9 | brew install --build-from-source -vd boost boost-python 10 | # without Python the usual installation suffices 11 | brew install protobuf boost 12 | -------------------------------------------------------------------------------- /3rdparty/windows/getCaffe.bat: -------------------------------------------------------------------------------- 1 | :: Avoid printing all the comments in the Windows cmd 2 | @echo off 3 | 4 | SET UNZIP_EXE=unzip\unzip.exe 5 | SET WGET_EXE=wget\wget.exe 6 | 7 | :: Download temporary zip 8 | echo ----- Downloading Caffe ----- 9 | SET CAFEE_FOLDER=caffe\ 10 | SET ZIP_NAME=caffe_2018_01_18.zip 11 | SET ZIP_FULL_PATH=%CAFEE_FOLDER%%ZIP_NAME% 12 | %WGET_EXE% -c http://posefs1.perception.cs.cmu.edu/OpenPose/3rdparty/windows/%ZIP_NAME% -P %CAFEE_FOLDER% 13 | echo: 14 | 15 | echo ----- Unzipping Caffe ----- 16 | %UNZIP_EXE% %ZIP_FULL_PATH% 17 | echo: 18 | 19 | echo ----- Deleting Temporary Zip File %ZIP_FULL_PATH% ----- 20 | del "%ZIP_FULL_PATH%" 21 | 22 | echo ----- Caffe Downloaded and Unzipped ----- 23 | -------------------------------------------------------------------------------- /3rdparty/windows/getCaffe3rdparty.bat: -------------------------------------------------------------------------------- 1 | :: Avoid printing all the comments in the Windows cmd 2 | @echo off 3 | 4 | SET UNZIP_EXE=unzip\unzip.exe 5 | SET WGET_EXE=wget\wget.exe 6 | 7 | :: Download temporary zip 8 | echo ----- Downloading Caffe ----- 9 | SET CAFEE_FOLDER=caffe3rdparty\ 10 | SET ZIP_NAME=caffe3rdparty_2017_07_14.zip 11 | SET ZIP_FULL_PATH=%CAFEE_FOLDER%%ZIP_NAME% 12 | %WGET_EXE% -c http://posefs1.perception.cs.cmu.edu/OpenPose/3rdparty/windows/%ZIP_NAME% -P %CAFEE_FOLDER% 13 | echo: 14 | 15 | echo ----- Unzipping Caffe ----- 16 | %UNZIP_EXE% %ZIP_FULL_PATH% 17 | echo: 18 | 19 | echo ----- Deleting Temporary Zip File %ZIP_FULL_PATH% ----- 20 | del "%ZIP_FULL_PATH%" 21 | 22 | echo ----- Caffe Downloaded and Unzipped ----- 23 | -------------------------------------------------------------------------------- /3rdparty/windows/getFreeglut.bat: -------------------------------------------------------------------------------- 1 | :: Avoid printing all the comments in the Windows cmd 2 | @echo off 3 | 4 | SET UNZIP_EXE=unzip\unzip.exe 5 | SET WGET_EXE=wget\wget.exe 6 | 7 | :: Download temporary zip 8 | echo ----- Downloading Caffe ----- 9 | SET FREEGLUT_FOLDER=freeglut\ 10 | SET ZIP_NAME=freeglut_2018_01_14.zip 11 | SET ZIP_FULL_PATH=%FREEGLUT_FOLDER%%ZIP_NAME% 12 | %WGET_EXE% -c http://posefs1.perception.cs.cmu.edu/OpenPose/3rdparty/windows/%ZIP_NAME% -P %FREEGLUT_FOLDER% 13 | echo: 14 | 15 | echo ----- Unzipping Caffe ----- 16 | %UNZIP_EXE% %ZIP_FULL_PATH% 17 | echo: 18 | 19 | echo ----- Deleting Temporary Zip File %ZIP_FULL_PATH% ----- 20 | del "%ZIP_FULL_PATH%" 21 | 22 | echo ----- Caffe Downloaded and Unzipped ----- 23 | -------------------------------------------------------------------------------- /3rdparty/windows/getOpenCV.bat: -------------------------------------------------------------------------------- 1 | :: Avoid printing all the comments in the Windows cmd 2 | @echo off 3 | 4 | SET UNZIP_EXE=unzip\unzip.exe 5 | SET WGET_EXE=wget\wget.exe 6 | 7 | :: Download temporary zip 8 | echo ----- Downloading OpenCV ----- 9 | SET OPENCV_FOLDER=opencv\ 10 | SET ZIP_NAME=opencv_310.zip 11 | SET ZIP_FULL_PATH=%OPENCV_FOLDER%%ZIP_NAME% 12 | %WGET_EXE% -c http://posefs1.perception.cs.cmu.edu/OpenPose/3rdparty/windows/%ZIP_NAME% -P %OPENCV_FOLDER% 13 | echo: 14 | 15 | echo ----- Unzipping OpenCV ----- 16 | %UNZIP_EXE% %ZIP_FULL_PATH% 17 | echo: 18 | 19 | echo ----- Deleting Temporary Zip File %ZIP_FULL_PATH% ----- 20 | del "%ZIP_FULL_PATH%" 21 | 22 | echo ----- OpenCV Downloaded and Unzipped ----- 23 | -------------------------------------------------------------------------------- /3rdparty/windows/unzip/LICENSE.txt: -------------------------------------------------------------------------------- 1 | http://www.info-zip.org/license.html 2 | -------------------------------------------------------------------------------- /3rdparty/windows/unzip/unzip.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/3rdparty/windows/unzip/unzip.exe -------------------------------------------------------------------------------- /3rdparty/windows/wget/Version_wget-1.19.1-win64.txt: -------------------------------------------------------------------------------- 1 | Version wget-1.19.1-win64 from: 2 | - https://eternallybored.org/misc/wget/ 3 | -------------------------------------------------------------------------------- /3rdparty/windows/wget/wget.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/3rdparty/windows/wget/wget.exe -------------------------------------------------------------------------------- /3rdparty/windows/wget/wget.exe.debug: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/3rdparty/windows/wget/wget.exe.debug -------------------------------------------------------------------------------- /cmake/Modules/FindCaffe.cmake: -------------------------------------------------------------------------------- 1 | # Copied from 2 | # https://raw.githubusercontent.com/opencv/opencv_contrib/master/modules/cnn_3dobj/FindCaffe.cmake 3 | 4 | unset(Caffe_FOUND) 5 | unset(Caffe_INCLUDE_DIRS) 6 | unset(Caffe_LIBS) 7 | 8 | find_path(Caffe_INCLUDE_DIRS NAMES 9 | caffe/caffe.hpp 10 | caffe/common.hpp 11 | caffe/net.hpp 12 | caffe/proto/caffe.pb.h 13 | caffe/util/io.hpp 14 | HINTS 15 | ${CMAKE_BINARY_DIR}/caffe/include 16 | NO_DEFAULT_PATH) 17 | 18 | 19 | find_library(Caffe_LIBS NAMES caffe 20 | HINTS 21 | ${CMAKE_BINARY_DIR}/caffe/lib 22 | ${CMAKE_BINARY_DIR}/caffe/lib/x86_64-linux-gnu 23 | NO_DEFAULT_PATH) 24 | 25 | if (Caffe_LIBS AND Caffe_INCLUDE_DIRS) 26 | set(Caffe_FOUND 1) 27 | endif (Caffe_LIBS AND Caffe_INCLUDE_DIRS) 28 | -------------------------------------------------------------------------------- /cmake/Modules/FindGFlags.cmake: -------------------------------------------------------------------------------- 1 | # - Try to find GFLAGS 2 | # 3 | # The following variables are optionally searched for defaults 4 | # GFLAGS_ROOT_DIR: Base directory where all GFLAGS components are found 5 | # 6 | # The following are set after configuration is done: 7 | # GFLAGS_FOUND 8 | # GFLAGS_INCLUDE_DIRS 9 | # GFLAGS_LIBRARIES 10 | # GFLAGS_LIBRARYRARY_DIRS 11 | 12 | include(FindPackageHandleStandardArgs) 13 | 14 | set(GFLAGS_ROOT_DIR "" CACHE PATH "Folder contains Gflags") 15 | 16 | # We are testing only a couple of files in the include directories 17 | if(WIN32) 18 | find_path(GFLAGS_INCLUDE_DIR gflags/gflags.h 19 | PATHS ${GFLAGS_ROOT_DIR}/src/windows) 20 | else() 21 | find_path(GFLAGS_INCLUDE_DIR gflags/gflags.h 22 | PATHS ${GFLAGS_ROOT_DIR}) 23 | endif() 24 | 25 | if(MSVC) 26 | find_library(GFLAGS_LIBRARY_RELEASE 27 | NAMES libgflags 28 | PATHS ${GFLAGS_ROOT_DIR} 29 | PATH_SUFFIXES Release) 30 | 31 | find_library(GFLAGS_LIBRARY_DEBUG 32 | NAMES libgflags-debug 33 | PATHS ${GFLAGS_ROOT_DIR} 34 | PATH_SUFFIXES Debug) 35 | 36 | set(GFLAGS_LIBRARY optimized ${GFLAGS_LIBRARY_RELEASE} debug ${GFLAGS_LIBRARY_DEBUG}) 37 | else() 38 | find_library(GFLAGS_LIBRARY gflags) 39 | endif() 40 | 41 | find_package_handle_standard_args(GFlags DEFAULT_MSG GFLAGS_INCLUDE_DIR GFLAGS_LIBRARY) 42 | 43 | 44 | if(GFLAGS_FOUND) 45 | set(GFLAGS_INCLUDE_DIRS ${GFLAGS_INCLUDE_DIR}) 46 | set(GFLAGS_LIBRARIES ${GFLAGS_LIBRARY}) 47 | message(STATUS "Found gflags (include: ${GFLAGS_INCLUDE_DIR}, library: ${GFLAGS_LIBRARY})") 48 | mark_as_advanced(GFLAGS_LIBRARY_DEBUG GFLAGS_LIBRARY_RELEASE 49 | GFLAGS_LIBRARY GFLAGS_INCLUDE_DIR GFLAGS_ROOT_DIR) 50 | endif() 51 | -------------------------------------------------------------------------------- /cmake/Modules/FindGlog.cmake: -------------------------------------------------------------------------------- 1 | # - Try to find Glog 2 | # 3 | # The following variables are optionally searched for defaults 4 | # GLOG_ROOT_DIR: Base directory where all GLOG components are found 5 | # 6 | # The following are set after configuration is done: 7 | # GLOG_FOUND 8 | # GLOG_INCLUDE_DIRS 9 | # GLOG_LIBRARIES 10 | # GLOG_LIBRARYRARY_DIRS 11 | 12 | include(FindPackageHandleStandardArgs) 13 | 14 | set(GLOG_ROOT_DIR "" CACHE PATH "Folder contains Google glog") 15 | 16 | if (WIN32) 17 | find_path(GLOG_INCLUDE_DIR glog/logging.h 18 | PATHS ${GLOG_ROOT_DIR}/src/windows) 19 | else () 20 | find_path(GLOG_INCLUDE_DIR glog/logging.h 21 | PATHS ${GLOG_ROOT_DIR}) 22 | endif() 23 | 24 | if (MSVC) 25 | find_library(GLOG_LIBRARY_RELEASE libglog_static 26 | PATHS ${GLOG_ROOT_DIR} 27 | PATH_SUFFIXES Release) 28 | 29 | find_library(GLOG_LIBRARY_DEBUG libglog_static 30 | PATHS ${GLOG_ROOT_DIR} 31 | PATH_SUFFIXES Debug) 32 | 33 | set(GLOG_LIBRARY optimized ${GLOG_LIBRARY_RELEASE} debug ${GLOG_LIBRARY_DEBUG}) 34 | else () 35 | find_library(GLOG_LIBRARY glog 36 | PATHS ${GLOG_ROOT_DIR} 37 | PATH_SUFFIXES lib lib64) 38 | endif() 39 | 40 | find_package_handle_standard_args(Glog DEFAULT_MSG GLOG_INCLUDE_DIR GLOG_LIBRARY) 41 | 42 | if(GLOG_FOUND) 43 | set(GLOG_INCLUDE_DIRS ${GLOG_INCLUDE_DIR}) 44 | set(GLOG_LIBRARIES ${GLOG_LIBRARY}) 45 | message(STATUS "Found glog (include: ${GLOG_INCLUDE_DIR}, library: ${GLOG_LIBRARY})") 46 | mark_as_advanced(GLOG_ROOT_DIR GLOG_LIBRARY_RELEASE GLOG_LIBRARY_DEBUG 47 | GLOG_LIBRARY GLOG_INCLUDE_DIR) 48 | endif() 49 | -------------------------------------------------------------------------------- /cmake/Modules/FindSpinnaker.cmake: -------------------------------------------------------------------------------- 1 | # Based on `FindCaffe.cmake` 2 | 3 | unset(SPINNAKER_FOUND) 4 | unset(SPINNAKER_INCLUDE_DIRS) 5 | unset(SPINNAKER_LIB) 6 | 7 | find_path(SPINNAKER_INCLUDE_DIRS NAMES 8 | Spinnaker.h 9 | HINTS 10 | /usr/include/spinnaker/ 11 | /usr/local/include/spinnaker/) 12 | 13 | find_library(SPINNAKER_LIB NAMES Spinnaker 14 | HINTS 15 | /usr/lib 16 | /usr/local/lib) 17 | 18 | if (SPINNAKER_INCLUDE_DIRS AND SPINNAKER_LIB) 19 | set(SPINNAKER_FOUND 1) 20 | endif (SPINNAKER_INCLUDE_DIRS AND SPINNAKER_LIB) 21 | -------------------------------------------------------------------------------- /cmake/OpenPose.vcxproj.user: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PATH=%PATH%;3rdparty\windows\caffe\bin\;3rdparty\windows\opencv\x64\vc14\bin;3rdparty\windows\freeglut\bin\;3rdparty\windows\spinnaker\bin\ 6 | WindowsLocalDebugger 7 | ..\..\.. 8 | 9 | 10 | 11 | PATH=%PATH%;3rdparty\windows\caffe\bin\;3rdparty\windows\opencv\x64\vc14\bin;3rdparty\windows\freeglut\bin\;3rdparty\windows\spinnaker\bin\ 12 | WindowsLocalDebugger 13 | ..\..\.. 14 | 15 | 16 | -------------------------------------------------------------------------------- /cmake/OpenPoseConfig.cmake.in: -------------------------------------------------------------------------------- 1 | # Compute and install package configuration and version files 2 | get_filename_component(_dir "${CMAKE_CURRENT_LIST_FILE}" PATH) 3 | get_filename_component(_prefix "${_dir}/../.." ABSOLUTE) 4 | 5 | # Import the targets 6 | include("${_prefix}/lib/OpenPose/OpenPose.cmake") 7 | if (@BUILD_CAFFE@) 8 | set(Caffe_INCLUDE_DIRS "${_prefix}/include/caffe") 9 | # set(Caffe_LIBS "${_prefix}/lib/libcaffe.so") 10 | endif (@BUILD_CAFFE@) 11 | 12 | # Report other information 13 | set(OpenPose_INCLUDE_DIRS "${_prefix}/include/openpose") 14 | set(OpenPose_VERSION_MAJOR @OpenPose_VERSION_MAJOR@) 15 | set(OpenPose_VERSION_MINOR @OpenPose_VERSION_MINOR@) 16 | set(OpenPose_VERSION_PATCH @OpenPose_VERSION_PATCH@) 17 | set(OpenPose_VERSION @OpenPose_VERSION@) 18 | 19 | # Check that the user requested components 20 | # are actually targets that are part of this build 21 | if (OpenPose_FIND_COMPONENTS) 22 | foreach (comp ${OpenPose_FIND_COMPONENTS}) 23 | if (NOT TARGET ${comp}) 24 | set (OpenPose_${comp}_FOUND 0) 25 | if (OpenPose_FIND_REQUIRED_${comp}) 26 | message(FATAL_ERROR "OpenPose ${comp} not available.") 27 | endif (OpenPose_FIND_REQUIRED_${comp}) 28 | else (NOT TARGET ${comp}) 29 | set(OpenPose_${comp}_FOUND 1) 30 | set(OpenPose_LIBS "${comp};${OpenPose_LIBS}") 31 | endif (NOT TARGET ${comp}) 32 | endforeach () 33 | else (OpenPose_FIND_COMPONENTS) 34 | set(OpenPose_LIBS "openpose") 35 | endif (OpenPose_FIND_COMPONENTS) 36 | 37 | if (OpenPose_INCLUDE_DIRS AND OpenPose_LIBS) 38 | set(OpenPose_FOUND 1) 39 | endif (OpenPose_INCLUDE_DIRS AND OpenPose_LIBS) 40 | -------------------------------------------------------------------------------- /cmake/OpenPose_CL.vcxproj.user: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PATH=%PATH%;3rdparty\windows\caffe_opencl\bin\;3rdparty\windows\opencv\x64\vc14\bin;3rdparty\windows\freeglut\bin\;3rdparty\windows\spinnaker\bin\ 6 | WindowsLocalDebugger 7 | ..\..\.. 8 | 9 | 10 | 11 | PATH=%PATH%;3rdparty\windows\caffe_opencl\bin\;3rdparty\windows\opencv\x64\vc14\bin;3rdparty\windows\freeglut\bin\;3rdparty\windows\spinnaker\bin\ 12 | WindowsLocalDebugger 13 | ..\..\.. 14 | 15 | 16 | -------------------------------------------------------------------------------- /cmake/OpenPose_CPU.vcxproj.user: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PATH=%PATH%;3rdparty\windows\caffe_cpu\bin\;3rdparty\windows\opencv\x64\vc14\bin;3rdparty\windows\freeglut\bin\;3rdparty\windows\spinnaker\bin\ 6 | WindowsLocalDebugger 7 | ..\..\.. 8 | 9 | 10 | 11 | PATH=%PATH%;3rdparty\windows\caffe_cpu\bin\;3rdparty\windows\opencv\x64\vc14\bin;3rdparty\windows\freeglut\bin\;3rdparty\windows\spinnaker\bin\ 12 | WindowsLocalDebugger 13 | ..\..\.. 14 | 15 | 16 | -------------------------------------------------------------------------------- /cmake/cmake_uninstall.cmake.in: -------------------------------------------------------------------------------- 1 | # Reference -- https://cmake.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F 2 | if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") 3 | message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") 4 | endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") 5 | 6 | file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) 7 | string(REGEX REPLACE "\n" ";" files "${files}") 8 | foreach(file ${files}) 9 | message(STATUS "Uninstalling $ENV{DESTDIR}${file}") 10 | if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") 11 | exec_program( 12 | "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" 13 | OUTPUT_VARIABLE rm_out 14 | RETURN_VALUE rm_retval 15 | ) 16 | if(NOT "${rm_retval}" STREQUAL 0) 17 | message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}") 18 | endif(NOT "${rm_retval}" STREQUAL 0) 19 | else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") 20 | message(STATUS "File $ENV{DESTDIR}${file} does not exist.") 21 | endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") 22 | endforeach(file) 23 | 24 | -------------------------------------------------------------------------------- /doc/Chessboard_in_PDF/pattern.eps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/Chessboard_in_PDF/pattern.eps -------------------------------------------------------------------------------- /doc/GUI_help/GUI_help.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/GUI_help/GUI_help.odt -------------------------------------------------------------------------------- /doc/GUI_help/GUI_help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/GUI_help/GUI_help.png -------------------------------------------------------------------------------- /doc/UML/1_0_0rc3/UML.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/UML/1_0_0rc3/UML.pdf -------------------------------------------------------------------------------- /doc/UML/1_0_0rc3/UML.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/UML/1_0_0rc3/UML.png -------------------------------------------------------------------------------- /doc/contributors.md: -------------------------------------------------------------------------------- 1 | OpenPose - Authors and Contributors 2 | ==================================== 3 | 4 | 5 | 6 | ### Authors 7 | OpenPose is authored by [Gines Hidalgo](https://www.gineshidalgo.com/), [Zhe Cao](http://www.andrew.cmu.edu/user/zhecao), [Tomas Simon](http://www.cs.cmu.edu/~tsimon/), [Shih-En Wei](https://scholar.google.com/citations?user=sFQD3k4AAAAJ&hl=en), [Hanbyul Joo](http://www.cs.cmu.edu/~hanbyulj/), and [Yaser Sheikh](http://www.cs.cmu.edu/~yaser/). 8 | 9 | 10 | 11 | ### Contributors 12 | We would also like to thank the following people who have highly contributed to OpenPose: 13 | 14 | 1. [Yaadhav Raaj](https://www.linkedin.com/in/yaadhavraaj): OpenPose maintainer, CPU version, OpenCL version, Mac version, Python API, and person tracker. 15 | 2. [Bikramjot Hanzra](https://www.linkedin.com/in/bikz05): Former OpenPose maintainer, CMake (Ubuntu and Windows) version, and Travis Build. 16 | 3. [Luis Fernando Fraga](https://github.com/fragalfernando/): Implementation of Lukas-Kanade algorith and person ID extractor. 17 | 4. [Helen Medina](https://github.com/helen-medina): Initial Windows version. 18 | -------------------------------------------------------------------------------- /doc/installation_jetson_tx2.md: -------------------------------------------------------------------------------- 1 | OpenPose - Installation on Nvidia Jetson TX2 2 | ==================================== 3 | Note that OpenPose for Nvidia Jetson TX2 was developed and it is maintained by the community. The OpenPose authors will not be able to provide official support for it. 4 | 5 | 6 | ## Contents 7 | 1. [Requirements](#requirements) 8 | 2. [Installation](#installation) 9 | 3. [Usage](#usage) 10 | 11 | 12 | ## Requirements 13 | Jetson TX2 just flashed with [JetPack 3.1](https://developer.nvidia.com/embedded/jetpack) 14 | 15 | Notes: 16 | 17 | - Installation is similar to Jetson TX1 and you can follow this [video tutorial](https://www.youtube.com/watch?v=RJkOGMC8IrY). 18 | - If you are installing from a virtual machine host, installation may need to be done in two steps, please refer to [this solution](https://devtalk.nvidia.com/default/topic/1002081/jetson-tx2/jetpack-3-0-install-with-a-vm/). 19 | - Be sure to complete both OS flashing and CUDA / cuDNN installation parts before installation. 20 | 21 | 22 | ## Installation 23 | Use the following script for installation of both caffe and OpenPose: 24 | ``` 25 | ./ubuntu/install_caffe_and_openpose_JetsonTX2_JetPack3.1.sh 26 | ``` 27 | 28 | 29 | ## Usage 30 | It is for now recommended to use an external camera with the demo. To get to decent FPS you need to lower the net resolution: 31 | ``` 32 | ./build/openpose/openpose.bin -camera_resolution 640x480 -net_resolution 128x96 33 | ``` 34 | 35 | To activate hand or face resolution please complete this command with the following options (warning, both simultaneously will cause out of memory error): 36 | ``` 37 | --hand -hand_net_resolution 256x256 38 | --face -face_net_resolution 256x256 39 | ``` 40 | -------------------------------------------------------------------------------- /doc/library_extend_functionality.md: -------------------------------------------------------------------------------- 1 | OpenPose Library - How to Develop OpenPose 2 | ==================================== 3 | 4 | If you intend to extend the functionality of our library: 5 | 6 | 1. Read the README page. 7 | 8 | 2. Check the basic library overview doc on [library_overview.md](library_overview.md). 9 | 10 | 3. Read, understand and play with the basic real time pose demo source code [examples/openpose/openpose.cpp](../examples/openpose/openpose.cpp) and [examples/tutorial_wrapper](../examples/tutorial_wrapper). It includes all the functionality of our library, and it has been properly commented. 11 | 12 | 4. Read, understand and play with the other tutorials in [examples/](../examples/). It includes more specific examples. 13 | 14 | 5. Check the basic UML diagram on the [UML folder](UML/) to get an idea of each module relations. 15 | 16 | 6. Take a look to the stucuture of the already existing modules. 17 | 18 | 7. The C++ headers files add documentation in [Doxygen](http://www.doxygen.org/) format. Create this documentation by compiling the [include](../include/) folder with Doxygen. This documentation will be completed during the next few weeks/months. 19 | 20 | 8. You can also take a look to the source code or ask us on GitHub. 21 | -------------------------------------------------------------------------------- /doc/library_introduction.md: -------------------------------------------------------------------------------- 1 | OpenPose C++ API - Introduction 2 | ==================================== 3 | 4 | The C++ API is ideal if you want to e.g. change internal functions and/or extend the OpenPose functionality. In order to learn the basics: 5 | 6 | 1. Take a look at the [library Quick Start section](../README.md#quick-start) from the README. 7 | 2. OpenPose Overview: Learn the basics about the library source code in [doc/library_overview.md](./library_overview.md). 8 | 3. Extending Functionality: Learn how to extend the library in [doc/library_extend_functionality.md](./library_extend_functionality.md). 9 | 4. Adding An Extra Module: Learn how to add an extra module in [doc/library_add_new_module.md](./library_add_new_module.md). 10 | 5. See the Doxygen documentation on [http://cmu-perceptual-computing-lab.github.io/openpose/html/index.html](http://cmu-perceptual-computing-lab.github.io/openpose/html/index.html) or build it from the source code. 11 | -------------------------------------------------------------------------------- /doc/media/body_heat_maps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/body_heat_maps.png -------------------------------------------------------------------------------- /doc/media/cmake_installation/im_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/cmake_installation/im_1.png -------------------------------------------------------------------------------- /doc/media/cmake_installation/im_1_windows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/cmake_installation/im_1_windows.png -------------------------------------------------------------------------------- /doc/media/cmake_installation/im_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/cmake_installation/im_2.png -------------------------------------------------------------------------------- /doc/media/cmake_installation/im_2_windows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/cmake_installation/im_2_windows.png -------------------------------------------------------------------------------- /doc/media/cmake_installation/im_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/cmake_installation/im_3.png -------------------------------------------------------------------------------- /doc/media/cmake_installation/im_3_windows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/cmake_installation/im_3_windows.png -------------------------------------------------------------------------------- /doc/media/cmake_installation/im_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/cmake_installation/im_5.png -------------------------------------------------------------------------------- /doc/media/dance.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/dance.gif -------------------------------------------------------------------------------- /doc/media/dance_foot.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/dance_foot.gif -------------------------------------------------------------------------------- /doc/media/keypoints_face.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/keypoints_face.png -------------------------------------------------------------------------------- /doc/media/keypoints_hand.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/keypoints_hand.odt -------------------------------------------------------------------------------- /doc/media/keypoints_hand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/keypoints_hand.png -------------------------------------------------------------------------------- /doc/media/keypoints_pose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/keypoints_pose.png -------------------------------------------------------------------------------- /doc/media/openpose3d.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/openpose3d.gif -------------------------------------------------------------------------------- /doc/media/paf_heat_maps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/paf_heat_maps.png -------------------------------------------------------------------------------- /doc/media/pose_face.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/pose_face.gif -------------------------------------------------------------------------------- /doc/media/pose_face_hands.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/pose_face_hands.gif -------------------------------------------------------------------------------- /doc/media/pose_hands.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/pose_hands.gif -------------------------------------------------------------------------------- /doc/media/shake.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/doc/media/shake.gif -------------------------------------------------------------------------------- /doc/released_features.md: -------------------------------------------------------------------------------- 1 | OpenPose Library - Latest Released Features 2 | ==================================== 3 | 4 | - Jun 2018: [**Combined body-foot model released! Faster and more accurate**](./installation.md)! 5 | - Jun 2018: [**Python API**](./modules/python_module.md) released! 6 | - Jun 2018: [**OpenCL/AMD graphic card version**](./modules/calibration_module.md) released! 7 | - Jun 2018: [**Calibration toolbox**](./modules/calibration_module.md) released! 8 | - Jun 2018: [**Mac OSX version (CPU)**](./installation.md) released! 9 | - Mar 2018: [**CPU version**](./installation.md#cpu-version)! 10 | - Mar 2018: [**3-D keypoint reconstruction module**](./modules/3d_reconstruction_module.md) (from multiple camera views)! 11 | - Sep 2017: [**CMake**](./installation.md) installer and **IP camera** support! 12 | - Jul 2017: [**Windows portable binaries and demo**](https://github.com/CMU-Perceptual-Computing-Lab/openpose/releases)! 13 | - Jul 2017: **Hands** released! 14 | - Jun 2017: **Face** released! 15 | - May 2017: **Windows** version! 16 | - Apr 2017: **Body** released! 17 | For further details, check the [release notes](./release_notes.md). 18 | -------------------------------------------------------------------------------- /examples/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_subdirectory(calibration) 2 | add_subdirectory(openpose) 3 | add_subdirectory(tutorial_add_module) 4 | add_subdirectory(tutorial_pose) 5 | add_subdirectory(tutorial_python) 6 | add_subdirectory(tutorial_thread) 7 | add_subdirectory(tutorial_wrapper) 8 | add_subdirectory(user_code) 9 | if (UNIX OR APPLE) 10 | add_subdirectory(tests) 11 | endif (UNIX OR APPLE) 12 | -------------------------------------------------------------------------------- /examples/calibration/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(EXAMPLE_FILES 2 | calibration.cpp) 3 | 4 | foreach(EXAMPLE_FILE ${EXAMPLE_FILES}) 5 | 6 | get_filename_component(SOURCE_NAME ${EXAMPLE_FILE} NAME_WE) 7 | 8 | if (UNIX OR APPLE) 9 | set(EXE_NAME "${SOURCE_NAME}.bin") 10 | elseif (WIN32) 11 | set(EXE_NAME "Calibration") 12 | endif () 13 | 14 | message(STATUS "Adding Example ${EXE_NAME}") 15 | add_executable(${EXE_NAME} ${EXAMPLE_FILE}) 16 | target_link_libraries(${EXE_NAME} openpose ${examples_3rdparty_libraries}) 17 | 18 | if (WIN32) 19 | set_property(TARGET ${EXE_NAME} PROPERTY FOLDER "Examples") 20 | configure_file(${CMAKE_SOURCE_DIR}/cmake/OpenPose${CL}.vcxproj.user 21 | ${CMAKE_CURRENT_BINARY_DIR}/${EXE_NAME}.vcxproj.user @ONLY) 22 | # Properties->General->Output Directory 23 | set_property(TARGET ${EXE_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/$(Platform)/$(Configuration)) 24 | set_property(TARGET ${EXE_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/$(Platform)/$(Configuration)) 25 | endif (WIN32) 26 | 27 | endforeach() 28 | -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000192.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000192.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000241.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000241.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000257.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000257.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000294.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000294.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000328.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000328.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000338.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000338.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000357.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000357.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000360.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000360.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000395.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000395.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000415.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000415.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000428.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000428.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000459.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000459.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000474.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000474.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000488.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000488.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000536.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000536.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000544.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000544.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000564.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000564.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000569.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000569.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000589.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000589.jpg -------------------------------------------------------------------------------- /examples/media/COCO_val2014_000000000623.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/COCO_val2014_000000000623.jpg -------------------------------------------------------------------------------- /examples/media/video.avi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yysijie/openpose/92cdcad76c84a1a403b4ed141b584a973200bb74/examples/media/video.avi -------------------------------------------------------------------------------- /examples/openpose/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(EXAMPLE_FILES 2 | openpose.cpp) 3 | 4 | foreach(EXAMPLE_FILE ${EXAMPLE_FILES}) 5 | 6 | get_filename_component(SOURCE_NAME ${EXAMPLE_FILE} NAME_WE) 7 | 8 | if (UNIX OR APPLE) 9 | set(EXE_NAME "${SOURCE_NAME}.bin") 10 | elseif (WIN32) 11 | set(EXE_NAME "OpenPoseDemo") 12 | endif () 13 | 14 | message(STATUS "Adding Example ${EXE_NAME}") 15 | add_executable(${EXE_NAME} ${EXAMPLE_FILE}) 16 | target_link_libraries(${EXE_NAME} openpose ${examples_3rdparty_libraries}) 17 | 18 | if (WIN32) 19 | set_property(TARGET ${EXE_NAME} PROPERTY FOLDER "Examples") 20 | configure_file(${CMAKE_SOURCE_DIR}/cmake/OpenPose${VCXPROJ_FILE_GPU_MODE}.vcxproj.user 21 | ${CMAKE_CURRENT_BINARY_DIR}/${EXE_NAME}.vcxproj.user @ONLY) 22 | # Properties->General->Output Directory 23 | set_property(TARGET ${EXE_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/$(Platform)/$(Configuration)) 24 | set_property(TARGET ${EXE_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/$(Platform)/$(Configuration)) 25 | endif (WIN32) 26 | 27 | endforeach() 28 | -------------------------------------------------------------------------------- /examples/tests/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(EXAMPLE_FILES 2 | handFromJsonTest.cpp 3 | resizeTest.cpp) 4 | 5 | foreach(EXAMPLE_FILE ${EXAMPLE_FILES}) 6 | 7 | get_filename_component(SOURCE_NAME ${EXAMPLE_FILE} NAME_WE) 8 | 9 | if (UNIX OR APPLE) 10 | set(EXE_NAME "${SOURCE_NAME}.bin") 11 | elseif (WIN32) 12 | set(EXE_NAME "${SOURCE_NAME}") 13 | endif () 14 | 15 | message(STATUS "Adding Example ${EXE_NAME}") 16 | add_executable(${EXE_NAME} ${EXAMPLE_FILE}) 17 | target_link_libraries(${EXE_NAME} openpose ${examples_3rdparty_libraries}) 18 | 19 | if (WIN32) 20 | set_property(TARGET ${EXE_NAME} PROPERTY FOLDER "Examples/Tutorial/Tests") 21 | configure_file(${CMAKE_SOURCE_DIR}/cmake/OpenPose${VCXPROJ_FILE_GPU_MODE}.vcxproj.user 22 | ${CMAKE_CURRENT_BINARY_DIR}/${EXE_NAME}.vcxproj.user @ONLY) 23 | # Properties->General->Output Directory 24 | set_property(TARGET ${EXE_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/$(Platform)/$(Configuration)) 25 | set_property(TARGET ${EXE_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/$(Platform)/$(Configuration)) 26 | endif (WIN32) 27 | 28 | endforeach() 29 | -------------------------------------------------------------------------------- /examples/tests/drawProtoTxt.sh: -------------------------------------------------------------------------------- 1 | # Script for internal use. We might completely change it continuously and we will not answer questions about it. 2 | 3 | # Required 4 | # sudo apt-get install graphviz 5 | 6 | # USAGE EXAMPLE 7 | # clear && clear && make all -j24 && bash ./examples/tests/speed_test.sh 8 | 9 | # # Go back to main folder 10 | # cd ../../ 11 | 12 | PROTO_TXT_PATH=/mnt/DataUbuntu/openpose_train/training_results/pose/pose_training.prototxt 13 | OUTPUT_PNG_PATH=/mnt/DataUbuntu/openpose_train/training_results/pose/pose_training.png 14 | 15 | # Get model speed 16 | python ~/devel/openpose_caffe_train/python/draw_net.py $PROTO_TXT_PATH $OUTPUT_PNG_PATH 17 | display $OUTPUT_PNG_PATH 18 | rm $OUTPUT_PNG_PATH 19 | -------------------------------------------------------------------------------- /examples/tests/pose_accuracy_car_val.sh: -------------------------------------------------------------------------------- 1 | # Script for internal use. We might completely change it continuously and we will not answer questions about it. 2 | 3 | clear && clear 4 | 5 | # USAGE EXAMPLE 6 | # clear && clear && make all -j`nproc` && bash ./examples/tests/pose_accuracy_coco_test.sh 7 | 8 | # # Go back to main folder 9 | # cd ../../ 10 | 11 | 12 | # Write COCO-format JSON 13 | # Last id: 14 | # ID 20671 <--> #frames = 1471 --> ~ 1.5 min at 15fps 15 | # ID 50006 <--> #frames = 3559 --> ~ 4 min at 15fps 16 | 17 | # Parameters 18 | IMAGE_FOLDER=/mnt/DataUbuntu/openpose_train/dataset/COCO/car_dataset/Dataset/images_jpg_val/ 19 | JSON_FOLDER=../evaluation/coco_val_jsons/ 20 | OP_BIN=./build/examples/openpose/openpose.bin 21 | 22 | # 1 scale 23 | $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}car_1.json --display 0 --render_pose 0 --model_pose CAR_12 24 | 25 | # # 4 scales 26 | # $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1_4.json --display 0 --render_pose 0 --model_pose CAR_12 --scale_number 4 --scale_gap 0.25 --net_resolution "1312x736" 27 | # $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1_4.json --display 0 --render_pose 0 --model_pose CAR_12 --scale_number 4 --scale_gap 0.25 --net_resolution "1312x736" --frame_last 1005 28 | 29 | # # Debugging - Rendered frames saved 30 | # $OP_BIN --image_dir $IMAGE_FOLDER --write_images ${JSON_FOLDER}frameOutput --display 0 31 | -------------------------------------------------------------------------------- /examples/tests/pose_accuracy_coco_test_dev.sh: -------------------------------------------------------------------------------- 1 | # Script for internal use. We might completely change it continuously and we will not answer questions about it. 2 | 3 | clear && clear 4 | 5 | # USAGE EXAMPLE 6 | # See ./examples/tests/pose_accuracy_coco_test.sh 7 | 8 | # Parameters 9 | IMAGE_FOLDER=/media/posefs3b/Users/gines/openpose_train/dataset/COCO/cocoapi/images/test2017_dev/ 10 | JSON_FOLDER=../evaluation/coco_val_jsons/ 11 | OP_BIN=./build/examples/openpose/openpose.bin 12 | 13 | # # 1 scale 14 | # $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1_test.json --display 0 --render_pose 0 15 | 16 | # 4 scales 17 | $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1_4_test.json --display 0 --render_pose 0 --scale_number 4 --scale_gap 0.25 --net_resolution "1312x736" 18 | -------------------------------------------------------------------------------- /examples/tests/pose_accuracy_coco_val.sh: -------------------------------------------------------------------------------- 1 | # Script for internal use. We might completely change it continuously and we will not answer questions about it. 2 | 3 | clear && clear 4 | 5 | # USAGE EXAMPLE 6 | # clear && clear && make all -j`nproc` && bash ./examples/tests/pose_accuracy_coco_test.sh 7 | 8 | # # Go back to main folder 9 | # cd ../../ 10 | 11 | 12 | # Write COCO-format JSON 13 | # Last id: 14 | # ID 20671 <--> #frames = 1471 --> ~ 1.5 min at 15fps 15 | # ID 50006 <--> #frames = 3559 --> ~ 4 min at 15fps 16 | 17 | # Parameters 18 | IMAGE_FOLDER=/home/gines/devel/images/val2017/ 19 | JSON_FOLDER=../evaluation/coco_val_jsons/ 20 | OP_BIN=./build/examples/openpose/openpose.bin 21 | 22 | # 1 scale 23 | $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1.json --display 0 --render_pose 0 24 | 25 | # 1 scale - Debugging 26 | # $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1.json --display 0 --write_images ~/Desktop/CppValidation/ 27 | 28 | # # 3 scales 29 | # $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1_3.json --display 0 --render_pose 0 --scale_number 3 --scale_gap 0.25 30 | 31 | # # 4 scales 32 | # $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1_4.json --display 0 --render_pose 0 --scale_number 4 --scale_gap 0.25 --net_resolution "1312x736" 33 | 34 | # # Debugging - Rendered frames saved 35 | # $OP_BIN --image_dir $IMAGE_FOLDER --write_images ${JSON_FOLDER}frameOutput --display 0 36 | -------------------------------------------------------------------------------- /examples/tests/pose_accuracy_coco_val_2014.sh: -------------------------------------------------------------------------------- 1 | # Script for internal use. We might completely change it continuously and we will not answer questions about it. 2 | 3 | clear && clear 4 | 5 | # USAGE EXAMPLE 6 | # clear && clear && make all -j`nproc` && bash ./examples/tests/pose_accuracy_coco_test.sh 7 | 8 | # # Go back to main folder 9 | # cd ../../ 10 | 11 | 12 | # Write COCO-format JSON 13 | # Note: `--frame_last 3558` --> total = 3559 frames 14 | # Last id: 15 | # ID 20671 <--> #frames = 1471 --> ~ 1.5 min at 15fps 16 | # ID 50006 <--> #frames = 3559 --> ~ 4 min at 15fps 17 | 18 | # Parameters 19 | IMAGE_FOLDER=/home/gines/devel/images/val2014/ 20 | JSON_FOLDER=../evaluation/coco_val_jsons/ 21 | OP_BIN=./build/examples/openpose/openpose.bin 22 | 23 | # 1 scale 24 | $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1.json --display 0 --render_pose 0 --frame_last 3558 25 | 26 | # 1 scale - Debugging 27 | # $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1.json --display 0 --frame_last 3558 --write_images ~/Desktop/CppValidation/ 28 | 29 | # # 3 scales 30 | # $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1_3.json --display 0 --render_pose 0 --scale_number 3 --scale_gap 0.25 --frame_last 3558 31 | 32 | # # 4 scales 33 | # $OP_BIN --num_gpu 1 --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1_4.json --display 0 --render_pose 0 --scale_number 4 --scale_gap 0.25 --net_resolution "1312x736" --frame_last 3558 34 | 35 | # # Debugging - Rendered frames saved 36 | # $OP_BIN --image_dir $IMAGE_FOLDER --write_images ${JSON_FOLDER}frameOutput --display 0 37 | -------------------------------------------------------------------------------- /examples/tests/pose_accuracy_coco_val_foot.sh: -------------------------------------------------------------------------------- 1 | # Script for internal use. We might completely change it continuously and we will not answer questions about it. 2 | 3 | clear && clear 4 | 5 | # USAGE EXAMPLE 6 | # See ./examples/tests/pose_accuracy_coco_test.sh 7 | 8 | # Parameters 9 | IMAGE_FOLDER=/home/gines/devel/images/val2017/ 10 | JSON_FOLDER=../evaluation/coco_val_jsons/ 11 | OP_BIN=./build/examples/openpose/openpose.bin 12 | 13 | # 1 scale 14 | $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_foot_json ${JSON_FOLDER}1_foot.json --write_coco_json ${JSON_FOLDER}1.json --display 0 --render_pose 0 15 | 16 | # # 4 scales 17 | # $OP_BIN --model_pose BODY_25 --image_dir $IMAGE_FOLDER --write_coco_foot_json ${JSON_FOLDER}1_4_foot.json --display 0 --render_pose 0 --scale_number 4 --scale_gap 0.25 --net_resolution "1312x736" 18 | -------------------------------------------------------------------------------- /examples/tests/pose_accuracy_coco_val_server.sh: -------------------------------------------------------------------------------- 1 | # Script for internal use. We might completely change it continuously and we will not answer questions about it. 2 | 3 | clear && clear 4 | 5 | # USAGE EXAMPLE 6 | # See ./examples/tests/pose_accuracy_coco_test.sh 7 | 8 | # Parameters 9 | IMAGE_FOLDER=/home/gines/devel/images/val2017/ 10 | JSON_FOLDER=../evaluation/coco_val_jsons/ 11 | OP_BIN=./build/examples/openpose/openpose.bin 12 | 13 | # 1 scale 14 | $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1.json --display 0 --render_pose 0 15 | 16 | # 3 scales 17 | $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1_3.json --display 0 --render_pose 0 --scale_number 3 --scale_gap 0.25 18 | 19 | # 4 scales 20 | $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1_4.json --display 0 --render_pose 0 --scale_number 4 --scale_gap 0.25 --net_resolution "1312x736" 21 | -------------------------------------------------------------------------------- /examples/tests/pose_accuracy_coco_val_server_2014.sh: -------------------------------------------------------------------------------- 1 | # Script for internal use. We might completely change it continuously and we will not answer questions about it. 2 | 3 | clear && clear 4 | 5 | # USAGE EXAMPLE 6 | # See ./examples/tests/pose_accuracy_coco_test.sh 7 | 8 | # Parameters 9 | IMAGE_FOLDER=/home/gines/devel/images/val2014/ 10 | JSON_FOLDER=../evaluation/coco_val_jsons/ 11 | OP_BIN=./build/examples/openpose/openpose.bin 12 | 13 | # 1 scale 14 | $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1.json --display 0 --render_pose 0 --frame_last 3558 15 | 16 | # 3 scales 17 | $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1_3.json --display 0 --render_pose 0 --scale_number 3 --scale_gap 0.25 --frame_last 3558 18 | 19 | # 4 scales 20 | $OP_BIN --image_dir $IMAGE_FOLDER --write_coco_json ${JSON_FOLDER}1_4.json --display 0 --render_pose 0 --scale_number 4 --scale_gap 0.25 --net_resolution "1312x736" --frame_last 3558 21 | -------------------------------------------------------------------------------- /examples/tests/pose_time_Caffe_layers.sh: -------------------------------------------------------------------------------- 1 | # Script for internal use. We might completely change it continuously and we will not answer questions about it. 2 | 3 | # # Go back to main folder 4 | # cd ../../ 5 | 6 | # Performance results 7 | PROTOTXT_PATH=/home/gines/Dropbox/Perceptual_Computing_Lab/openpose/openpose/models/pose/coco/pose_deploy_linevec.prototxt 8 | 9 | gedit $0 10 | # First: Add 656 x 368 as input_dim in: 11 | gedit $PROTOTXT_PATH 12 | ./3rdparty/caffe/build/tools/caffe time -model $PROTOTXT_PATH -gpu 0 -phase TEST 13 | gedit $PROTOTXT_PATH 14 | -------------------------------------------------------------------------------- /examples/tests/pose_time_visual_GUI.sh: -------------------------------------------------------------------------------- 1 | # Script for internal use. We might completely change it continuously and we will not answer questions about it. 2 | 3 | # # Go back to main folder 4 | # cd ../../ 5 | 6 | # Re-build 7 | clear && clear && make all -j12 8 | 9 | # Performance results (~1400) 10 | ./build/examples/openpose/openpose.bin --video soccer.mp4 --frame_last 1500 11 | # Including 2nd graphics card (~3500) 12 | # ./build/examples/openpose/openpose.bin --video soccer.mp4 --frame_last 3750 13 | -------------------------------------------------------------------------------- /examples/tests/speed_test.sh: -------------------------------------------------------------------------------- 1 | # Script for internal use. We might completely change it continuously and we will not answer questions about it. 2 | 3 | # USAGE EXAMPLE 4 | # clear && clear && make all -j24 && bash ./examples/tests/speed_test.sh 5 | 6 | # # Go back to main folder 7 | # cd ../../ 8 | 9 | # Get model speed 10 | ~/devel/openpose_caffe_train/build/tools/caffe time -gpu 0 -model /mnt/DataUbuntu/openpose_train/training_results_light/pose/pose_training.prototxt 11 | # ./3rdparty/caffe/build/tools/caffe time -gpu 0 -model /mnt/DataUbuntu/openpose_train/training_results_light/pose/pose_training.prototxt 12 | -------------------------------------------------------------------------------- /examples/tutorial_add_module/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(EXAMPLE_FILES 2 | 1_custom_post_processing.cpp) 3 | 4 | include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake) 5 | 6 | foreach(EXAMPLE_FILE ${EXAMPLE_FILES}) 7 | 8 | get_filename_component(SOURCE_NAME ${EXAMPLE_FILE} NAME_WE) 9 | 10 | if (UNIX OR APPLE) 11 | set(EXE_NAME "${SOURCE_NAME}.bin") 12 | elseif (WIN32) 13 | set(EXE_NAME "${SOURCE_NAME}") 14 | endif () 15 | 16 | message(STATUS "Adding Example ${EXE_NAME}") 17 | add_executable(${EXE_NAME} ${EXAMPLE_FILE}) 18 | target_link_libraries(${EXE_NAME} openpose ${examples_3rdparty_libraries}) 19 | 20 | if (WIN32) 21 | set_property(TARGET ${EXE_NAME} PROPERTY FOLDER "Examples/Tutorial/AddModule") 22 | configure_file(${CMAKE_SOURCE_DIR}/cmake/OpenPose${VCXPROJ_FILE_GPU_MODE}.vcxproj.user 23 | ${CMAKE_CURRENT_BINARY_DIR}/${EXE_NAME}.vcxproj.user @ONLY) 24 | # Properties->General->Output Directory 25 | set_property(TARGET ${EXE_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/$(Platform)/$(Configuration)) 26 | set_property(TARGET ${EXE_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/$(Platform)/$(Configuration)) 27 | endif (WIN32) 28 | 29 | endforeach() 30 | -------------------------------------------------------------------------------- /examples/tutorial_add_module/userDatum.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_TUTORIAL_USER_DATUM_HPP 2 | #define OPENPOSE_TUTORIAL_USER_DATUM_HPP 3 | 4 | #include // cv::Mat 5 | #include 6 | #include 7 | 8 | namespace op 9 | { 10 | // If the user needs his own variables to be shared accross Worker classes, he can directly add them here. 11 | struct UserDatum : public Datum 12 | { 13 | /** 14 | * Description of your variable. 15 | */ 16 | bool boolThatUserNeedsForSomeReason; 17 | 18 | UserDatum() {}; 19 | 20 | virtual ~UserDatum(){}; 21 | }; 22 | } 23 | 24 | #endif // OPENPOSE_TUTORIAL_USER_DATUM_HPP 25 | -------------------------------------------------------------------------------- /examples/tutorial_pose/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(EXAMPLE_FILES 2 | 1_extract_from_image.cpp 3 | 2_extract_pose_or_heatmat_from_image.cpp) 4 | 5 | foreach(EXAMPLE_FILE ${EXAMPLE_FILES}) 6 | 7 | get_filename_component(SOURCE_NAME ${EXAMPLE_FILE} NAME_WE) 8 | 9 | if (UNIX OR APPLE) 10 | set(EXE_NAME "${SOURCE_NAME}.bin") 11 | elseif (WIN32) 12 | set(EXE_NAME "${SOURCE_NAME}") 13 | endif () 14 | 15 | message(STATUS "Adding Example ${EXE_NAME}") 16 | add_executable(${EXE_NAME} ${EXAMPLE_FILE}) 17 | target_link_libraries(${EXE_NAME} openpose ${examples_3rdparty_libraries}) 18 | 19 | if (WIN32) 20 | set_property(TARGET ${EXE_NAME} PROPERTY FOLDER "Examples/Tutorial/Pose") 21 | configure_file(${CMAKE_SOURCE_DIR}/cmake/OpenPose${VCXPROJ_FILE_GPU_MODE}.vcxproj.user 22 | ${CMAKE_CURRENT_BINARY_DIR}/${EXE_NAME}.vcxproj.user @ONLY) 23 | # Properties->General->Output Directory 24 | set_property(TARGET ${EXE_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/$(Platform)/$(Configuration)) 25 | set_property(TARGET ${EXE_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/$(Platform)/$(Configuration)) 26 | endif (WIN32) 27 | 28 | endforeach() 29 | -------------------------------------------------------------------------------- /examples/tutorial_python/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ### Add Python Test 2 | configure_file(1_extract_pose.py 1_extract_pose.py) 3 | configure_file(2_pose_from_heatmaps.py 2_pose_from_heatmaps.py) 4 | -------------------------------------------------------------------------------- /examples/tutorial_thread/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(EXAMPLE_FILES 2 | 1_openpose_read_and_display.cpp 3 | 2_user_processing_function.cpp 4 | 3_user_input_processing_and_output.cpp 5 | 4_user_input_processing_output_and_datum.cpp) 6 | 7 | foreach(EXAMPLE_FILE ${EXAMPLE_FILES}) 8 | 9 | get_filename_component(SOURCE_NAME ${EXAMPLE_FILE} NAME_WE) 10 | 11 | if (UNIX OR APPLE) 12 | set(EXE_NAME "${SOURCE_NAME}.bin") 13 | elseif (WIN32) 14 | set(EXE_NAME "${SOURCE_NAME}") 15 | endif () 16 | 17 | message(STATUS "Adding Example ${EXE_NAME}") 18 | add_executable(${EXE_NAME} ${EXAMPLE_FILE}) 19 | target_link_libraries(${EXE_NAME} openpose ${examples_3rdparty_libraries}) 20 | 21 | if (WIN32) 22 | set_property(TARGET ${EXE_NAME} PROPERTY FOLDER "Examples/Tutorial/Thread") 23 | configure_file(${CMAKE_SOURCE_DIR}/cmake/OpenPose${VCXPROJ_FILE_GPU_MODE}.vcxproj.user 24 | ${CMAKE_CURRENT_BINARY_DIR}/${EXE_NAME}.vcxproj.user @ONLY) 25 | # Properties->General->Output Directory 26 | set_property(TARGET ${EXE_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/$(Platform)/$(Configuration)) 27 | set_property(TARGET ${EXE_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/$(Platform)/$(Configuration)) 28 | endif (WIN32) 29 | 30 | endforeach() 31 | -------------------------------------------------------------------------------- /examples/tutorial_wrapper/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(EXAMPLE_FILES 2 | 1_user_synchronous_postprocessing.cpp 3 | 2_user_synchronous_input.cpp 4 | 3_user_synchronous_output.cpp 5 | 4_user_synchronous_all.cpp 6 | 5_user_asynchronous.cpp 7 | 6_user_asynchronous_output.cpp) 8 | 9 | include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake) 10 | 11 | foreach(EXAMPLE_FILE ${EXAMPLE_FILES}) 12 | 13 | get_filename_component(SOURCE_NAME ${EXAMPLE_FILE} NAME_WE) 14 | 15 | if (UNIX OR APPLE) 16 | set(EXE_NAME "${SOURCE_NAME}.bin") 17 | elseif (WIN32) 18 | set(EXE_NAME "${SOURCE_NAME}") 19 | endif () 20 | 21 | message(STATUS "Adding Example ${EXE_NAME}") 22 | add_executable(${EXE_NAME} ${EXAMPLE_FILE}) 23 | target_link_libraries(${EXE_NAME} openpose ${examples_3rdparty_libraries}) 24 | 25 | if (WIN32) 26 | set_property(TARGET ${EXE_NAME} PROPERTY FOLDER "Examples/Tutorial/Wrapper") 27 | configure_file(${CMAKE_SOURCE_DIR}/cmake/OpenPose${VCXPROJ_FILE_GPU_MODE}.vcxproj.user 28 | ${CMAKE_CURRENT_BINARY_DIR}/${EXE_NAME}.vcxproj.user @ONLY) 29 | # Properties->General->Output Directory 30 | set_property(TARGET ${EXE_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/$(Platform)/$(Configuration)) 31 | set_property(TARGET ${EXE_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/$(Platform)/$(Configuration)) 32 | endif (WIN32) 33 | 34 | endforeach() 35 | -------------------------------------------------------------------------------- /examples/user_code/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Uncomment these lines with your custom file names 2 | # set(USER_CODE_FILES 3 | # ADD_HERE_YOUR_FILE1.cpp 4 | # ADD_HERE_YOUR_FILE1.hpp 5 | # ADD_HERE_YOUR_FILE2.cpp 6 | # # ... 7 | # ADD_HERE_YOUR_FILEn.cpp) 8 | 9 | foreach(USER_CODE_FILE ${USER_CODE_FILES}) 10 | 11 | get_filename_component(SOURCE_NAME ${USER_CODE_FILE} NAME_WE) 12 | 13 | if (UNIX OR APPLE) 14 | set(EXE_NAME "${SOURCE_NAME}.bin") 15 | elseif (WIN32) 16 | set(EXE_NAME "UserCustomCode") 17 | endif () 18 | 19 | message(STATUS "Adding Example ${EXE_NAME}") 20 | add_executable(${EXE_NAME} ${USER_CODE_FILE}) 21 | target_link_libraries(${EXE_NAME} openpose ${examples_3rdparty_libraries}) 22 | 23 | if (WIN32) 24 | set_property(TARGET ${EXE_NAME} PROPERTY FOLDER "User Code") 25 | configure_file(${CMAKE_SOURCE_DIR}/cmake/OpenPose${VCXPROJ_FILE_GPU_MODE}.vcxproj.user 26 | ${CMAKE_CURRENT_BINARY_DIR}/${EXE_NAME}.vcxproj.user @ONLY) 27 | # Properties->General->Output Directory 28 | set_property(TARGET ${EXE_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/$(Platform)/$(Configuration)) 29 | set_property(TARGET ${EXE_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/$(Platform)/$(Configuration)) 30 | endif (WIN32) 31 | 32 | endforeach() 33 | -------------------------------------------------------------------------------- /examples/user_code/README.md: -------------------------------------------------------------------------------- 1 | Adding and Testing Custom Code 2 | ==================================== 3 | 4 | 5 | 6 | ## Purpose 7 | You can quickly add your custom code into this folder so that quick prototypes can be easily tested without having to create a whoel new project just for it. 8 | 9 | 10 | 11 | ## How-to 12 | 1. Install/compile OpenPose as usual. 13 | 2. Add your custom *.cpp / *.hpp files here,. Hint: You might want to start by copying the [OpenPoseDemo](../openpose/openpose.cpp) example or any of the [examples/tutorial_wrapper/](../tutorial_wrapper/) examples. Then, you can simply modify their content. 14 | 3. Add the name of your custom *.cpp / *.hpp files at the top of the [examples/user_code/CMakeLists.txt](./CMakeLists.txt) file. 15 | 4. Re-compile OpenPose. 16 | ``` 17 | # Ubuntu/Mac 18 | cd build/ 19 | make -j`nproc` 20 | # Windows 21 | # Close Visual Studio, re-run CMake, and re-compile the project in Visual Studio 22 | ``` 23 | 5. **Run step 4 every time that you make changes into your code**. 24 | 25 | 26 | 27 | ## Running your Custom Code 28 | Run: 29 | ``` 30 | ./build/examples/user_code/{your_custom_file_name} 31 | ``` 32 | -------------------------------------------------------------------------------- /include/openpose/3d/headers.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_3D_HEADERS_HPP 2 | #define OPENPOSE_3D_HEADERS_HPP 3 | 4 | // 3d module 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #endif // OPENPOSE_3D_HEADERS_HPP 12 | -------------------------------------------------------------------------------- /include/openpose/3d/jointAngleEstimation.hpp: -------------------------------------------------------------------------------- 1 | #ifdef USE_3D_ADAM_MODEL 2 | #ifndef OPENPOSE_3D_JOINT_ANGLE_ESTIMATION_HPP 3 | #define OPENPOSE_3D_JOINT_ANGLE_ESTIMATION_HPP 4 | 5 | #ifdef USE_EIGEN 6 | #include 7 | #endif 8 | #ifdef USE_3D_ADAM_MODEL 9 | #include 10 | #endif 11 | #include 12 | #include 13 | 14 | namespace op 15 | { 16 | OP_API int mapOPToAdam(const int oPPart); 17 | 18 | class OP_API JointAngleEstimation 19 | { 20 | public: 21 | static const std::shared_ptr getTotalModel(); 22 | 23 | JointAngleEstimation(const bool returnJacobian); 24 | 25 | void initializationOnThread(); 26 | 27 | void adamFastFit(Eigen::Matrix& adamPose, 28 | Eigen::Vector3d& adamTranslation, 29 | Eigen::Matrix& vtVec, 30 | Eigen::Matrix& j0Vec, 31 | Eigen::VectorXd& adamFacecoeffsExp, 32 | const Array& poseKeypoints3D, 33 | const Array& faceKeypoints3D, 34 | const std::array, 2>& handKeypoints3D); 35 | 36 | private: 37 | // PIMPL idiom 38 | // http://www.cppsamples.com/common-tasks/pimpl.html 39 | struct ImplJointAngleEstimation; 40 | std::shared_ptr spImpl; 41 | 42 | // PIMP requires DELETE_COPY & destructor, or extra code 43 | // http://oliora.github.io/2015/12/29/pimpl-and-rule-of-zero.html 44 | DELETE_COPY(JointAngleEstimation); 45 | }; 46 | } 47 | 48 | #endif // OPENPOSE_3D_JOINT_ANGLE_ESTIMATION_HPP 49 | #endif 50 | -------------------------------------------------------------------------------- /include/openpose/3d/poseTriangulation.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_3D_POSE_TRIANGULATION_HPP 2 | #define OPENPOSE_3D_POSE_TRIANGULATION_HPP 3 | 4 | #include 5 | #include 6 | 7 | namespace op 8 | { 9 | class OP_API PoseTriangulation 10 | { 11 | public: 12 | PoseTriangulation(const int minViews3d); 13 | 14 | void initializationOnThread(); 15 | 16 | Array reconstructArray(const std::vector>& keypointsVector, 17 | const std::vector& cameraMatrices, 18 | const std::vector>& imageSizes) const; 19 | 20 | std::vector> reconstructArray(const std::vector>>& keypointsVector, 21 | const std::vector& cameraMatrices, 22 | const std::vector>& imageSizes) const; 23 | 24 | private: 25 | const int mMinViews3d; 26 | }; 27 | } 28 | 29 | #endif // OPENPOSE_3D_POSE_TRIANGULATION_HPP 30 | -------------------------------------------------------------------------------- /include/openpose/calibration/gridPatternFunctions.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_CALIBRATION_GRID_PATTERN_FUNCTIONS_HPP 2 | #define OPENPOSE_CALIBRATION_GRID_PATTERN_FUNCTIONS_HPP 3 | 4 | #include 5 | #include 6 | 7 | namespace op 8 | { 9 | enum class Points2DOrigin 10 | { 11 | TopLeft, 12 | TopRight, 13 | BottomLeft, 14 | BottomRight 15 | }; 16 | 17 | OP_API std::pair> findAccurateGridCorners(const cv::Mat& image, 18 | const cv::Size& gridInnerCorners); 19 | 20 | OP_API std::vector getObjects3DVector(const cv::Size& gridInnerCorners, 21 | const float gridSquareSizeMm); 22 | 23 | OP_API void drawGridCorners(cv::Mat& image, const cv::Size& gridInnerCorners, 24 | const std::vector& points2DVector); 25 | 26 | OP_API std::array getOutterCornerIndices(const std::vector& points2DVector, 27 | const cv::Size& gridInnerCorners); 28 | 29 | OP_API void reorderPoints(std::vector& points2DVector, 30 | const cv::Size& gridInnerCorners, 31 | const Points2DOrigin points2DOriginDesired); 32 | 33 | OP_API void plotGridCorners(const cv::Size& gridInnerCorners, 34 | const std::vector& points2DVector, 35 | const std::string& imagePath, 36 | const cv::Mat& image); 37 | } 38 | 39 | #endif // OPENPOSE_CALIBRATION_GRID_PATTERN_FUNCTIONS_HPP 40 | -------------------------------------------------------------------------------- /include/openpose/calibration/headers.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_CALIBRATION_HEADERS_HPP 2 | #define OPENPOSE_CALIBRATION_HEADERS_HPP 3 | 4 | // calibration module 5 | #include 6 | #include 7 | 8 | #endif // OPENPOSE_CALIBRATION_HEADERS_HPP 9 | -------------------------------------------------------------------------------- /include/openpose/core/common.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_CORE_COMMON_HPP 2 | #define OPENPOSE_CORE_COMMON_HPP 3 | 4 | // Std library most used classes 5 | #include 6 | #include // std::shared_ptr, std::unique_ptr 7 | #include 8 | #include 9 | // OpenPose most used classes 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | // Datum at the end, otherwise circular dependency with array, point & rectangle 17 | #include 18 | 19 | #endif // OPENPOSE_CORE_COMMON_HPP 20 | -------------------------------------------------------------------------------- /include/openpose/core/cvMatToOpInput.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_CORE_CV_MAT_TO_OP_INPUT_HPP 2 | #define OPENPOSE_CORE_CV_MAT_TO_OP_INPUT_HPP 3 | 4 | #include // cv::Mat 5 | #include 6 | #include 7 | 8 | namespace op 9 | { 10 | class OP_API CvMatToOpInput 11 | { 12 | public: 13 | CvMatToOpInput(const PoseModel poseModel = PoseModel::BODY_25); 14 | 15 | std::vector> createArray(const cv::Mat& cvInputData, 16 | const std::vector& scaleInputToNetInputs, 17 | const std::vector>& netInputSizes) const; 18 | 19 | private: 20 | const PoseModel mPoseModel; 21 | }; 22 | } 23 | 24 | #endif // OPENPOSE_CORE_CV_MAT_TO_OP_INPUT_HPP 25 | -------------------------------------------------------------------------------- /include/openpose/core/cvMatToOpOutput.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_CORE_CV_MAT_TO_OP_OUTPUT_HPP 2 | #define OPENPOSE_CORE_CV_MAT_TO_OP_OUTPUT_HPP 3 | 4 | #include // cv::Mat 5 | #include 6 | 7 | namespace op 8 | { 9 | class OP_API CvMatToOpOutput 10 | { 11 | public: 12 | Array createArray(const cv::Mat& cvInputData, const double scaleInputToOutput, 13 | const Point& outputResolution) const; 14 | }; 15 | } 16 | 17 | #endif // OPENPOSE_CORE_CV_MAT_TO_OP_OUTPUT_HPP 18 | -------------------------------------------------------------------------------- /include/openpose/core/enumClasses.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_CORE_ENUM_CLASSES_HPP 2 | #define OPENPOSE_CORE_ENUM_CLASSES_HPP 3 | 4 | namespace op 5 | { 6 | enum class ScaleMode : unsigned char 7 | { 8 | InputResolution, 9 | NetOutputResolution, 10 | OutputResolution, 11 | ZeroToOne, // [0, 1] 12 | PlusMinusOne, // [-1, 1] 13 | UnsignedChar, // [0, 255] 14 | NoScale, 15 | }; 16 | 17 | enum class HeatMapType : unsigned char 18 | { 19 | Parts, 20 | Background, 21 | PAFs, 22 | }; 23 | 24 | enum class RenderMode : unsigned char 25 | { 26 | None, 27 | Cpu, 28 | Gpu, 29 | }; 30 | 31 | enum class ElementToRender : unsigned char 32 | { 33 | Skeleton, 34 | Background, 35 | AddKeypoints, 36 | AddPAFs, 37 | }; 38 | } 39 | 40 | #endif // OPENPOSE_CORE_ENUM_CLASSES_HPP 41 | -------------------------------------------------------------------------------- /include/openpose/core/headers.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_CORE_HEADERS_HPP 2 | #define OPENPOSE_CORE_HEADERS_HPP 3 | 4 | // core module 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | 27 | #endif // OPENPOSE_CORE_HEADERS_HPP 28 | -------------------------------------------------------------------------------- /include/openpose/core/keepTopNPeople.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_CORE_KEEP_TOP_N_PEOPLE_HPP 2 | #define OPENPOSE_CORE_KEEP_TOP_N_PEOPLE_HPP 3 | 4 | #include 5 | 6 | namespace op 7 | { 8 | class OP_API KeepTopNPeople 9 | { 10 | public: 11 | explicit KeepTopNPeople(const int numberPeopleMax); 12 | 13 | Array keepTopPeople(const Array& peopleArrays, const Array& poseScores) const; 14 | 15 | private: 16 | const int mNumberPeopleMax; 17 | }; 18 | } 19 | 20 | #endif // OPENPOSE_CORE_KEEP_TOP_N_PEOPLE_HPP 21 | -------------------------------------------------------------------------------- /include/openpose/core/keypointScaler.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_CORE_KEYPOINT_SCALER_HPP 2 | #define OPENPOSE_CORE_KEYPOINT_SCALER_HPP 3 | 4 | #include 5 | #include 6 | 7 | namespace op 8 | { 9 | class OP_API KeypointScaler 10 | { 11 | public: 12 | explicit KeypointScaler(const ScaleMode scaleMode); 13 | 14 | void scale(Array& arrayToScale, const double scaleInputToOutput, const double scaleNetToOutput, 15 | const Point& producerSize) const; 16 | 17 | void scale(std::vector>& arraysToScale, const double scaleInputToOutput, 18 | const double scaleNetToOutput, const Point& producerSize) const; 19 | 20 | void scale(std::vector>>& poseCandidates, const double scaleInputToOutput, 21 | const double scaleNetToOutput, const Point& producerSize) const; 22 | 23 | private: 24 | const ScaleMode mScaleMode; 25 | }; 26 | } 27 | 28 | #endif // OPENPOSE_CORE_KEYPOINT_SCALER_HPP 29 | -------------------------------------------------------------------------------- /include/openpose/core/opOutputToCvMat.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_CORE_OP_OUTPUT_TO_CV_MAT_HPP 2 | #define OPENPOSE_CORE_OP_OUTPUT_TO_CV_MAT_HPP 3 | 4 | #include // cv::Mat 5 | #include 6 | 7 | namespace op 8 | { 9 | class OP_API OpOutputToCvMat 10 | { 11 | public: 12 | cv::Mat formatToCvMat(const Array& outputData) const; 13 | }; 14 | } 15 | 16 | #endif // OPENPOSE_CORE_OP_OUTPUT_TO_CV_MAT_HPP 17 | -------------------------------------------------------------------------------- /include/openpose/core/renderer.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_CORE_RENDERER_HPP 2 | #define OPENPOSE_CORE_RENDERER_HPP 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | namespace op 9 | { 10 | class OP_API Renderer 11 | { 12 | public: 13 | explicit Renderer(const float renderThreshold, const float alphaKeypoint, const float alphaHeatMap, 14 | const bool blendOriginalFrame = true, const unsigned int elementToRender = 0u, 15 | const unsigned int numberElementsToRender = 0u); 16 | 17 | void increaseElementToRender(const int increment); 18 | 19 | void setElementToRender(const int elementToRender); 20 | 21 | void setElementToRender(const ElementToRender elementToRender); 22 | 23 | bool getBlendOriginalFrame() const; 24 | 25 | void setBlendOriginalFrame(const bool blendOriginalFrame); 26 | 27 | float getAlphaKeypoint() const; 28 | 29 | void setAlphaKeypoint(const float alphaKeypoint); 30 | 31 | float getAlphaHeatMap() const; 32 | 33 | void setAlphaHeatMap(const float alphaHeatMap); 34 | 35 | bool getShowGooglyEyes() const; 36 | 37 | void setShowGooglyEyes(const bool showGooglyEyes); 38 | 39 | protected: 40 | const float mRenderThreshold; 41 | std::atomic mBlendOriginalFrame; 42 | std::shared_ptr> spElementToRender; 43 | std::shared_ptr spNumberElementsToRender; 44 | std::atomic mShowGooglyEyes; 45 | 46 | private: 47 | float mAlphaKeypoint; 48 | float mAlphaHeatMap; 49 | 50 | DELETE_COPY(Renderer); 51 | }; 52 | } 53 | 54 | #endif // OPENPOSE_CORE_RENDERER_HPP 55 | -------------------------------------------------------------------------------- /include/openpose/core/scaleAndSizeExtractor.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_CORE_SCALE_AND_SIZE_EXTRACTOR_HPP 2 | #define OPENPOSE_CORE_SCALE_AND_SIZE_EXTRACTOR_HPP 3 | 4 | #include 5 | #include 6 | 7 | namespace op 8 | { 9 | class OP_API ScaleAndSizeExtractor 10 | { 11 | public: 12 | ScaleAndSizeExtractor(const Point& netInputResolution, const Point& outputResolution, 13 | const int scaleNumber = 1, const double scaleGap = 0.25); 14 | 15 | std::tuple, std::vector>, double, Point> extract( 16 | const Point& inputResolution) const; 17 | 18 | private: 19 | const Point mNetInputResolution; 20 | const Point mOutputSize; 21 | const int mScaleNumber; 22 | const double mScaleGap; 23 | }; 24 | } 25 | 26 | #endif // OPENPOSE_CORE_SCALE_AND_SIZE_EXTRACTOR_HPP 27 | -------------------------------------------------------------------------------- /include/openpose/face/faceCpuRenderer.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FACE_FACE_CPU_RENDERER_HPP 2 | #define OPENPOSE_FACE_FACE_CPU_RENDERER_HPP 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | namespace op 10 | { 11 | class OP_API FaceCpuRenderer : public Renderer, public FaceRenderer 12 | { 13 | public: 14 | FaceCpuRenderer(const float renderThreshold, const float alphaKeypoint = FACE_DEFAULT_ALPHA_KEYPOINT, 15 | const float alphaHeatMap = FACE_DEFAULT_ALPHA_HEAT_MAP); 16 | 17 | void renderFaceInherited(Array& outputData, const Array& faceKeypoints); 18 | 19 | DELETE_COPY(FaceCpuRenderer); 20 | }; 21 | } 22 | 23 | #endif // OPENPOSE_FACE_FACE_CPU_RENDERER_HPP 24 | -------------------------------------------------------------------------------- /include/openpose/face/faceDetector.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FACE_FACE_DETECTOR_HPP 2 | #define OPENPOSE_FACE_FACE_DETECTOR_HPP 3 | 4 | #include 5 | #include 6 | 7 | namespace op 8 | { 9 | class OP_API FaceDetector 10 | { 11 | public: 12 | explicit FaceDetector(const PoseModel poseModel); 13 | 14 | std::vector> detectFaces(const Array& poseKeypoints) const; 15 | 16 | private: 17 | const unsigned int mNeck; 18 | const unsigned int mNose; 19 | const unsigned int mLEar; 20 | const unsigned int mREar; 21 | const unsigned int mLEye; 22 | const unsigned int mREye; 23 | 24 | DELETE_COPY(FaceDetector); 25 | }; 26 | } 27 | 28 | #endif // OPENPOSE_FACE_FACE_DETECTOR_HPP 29 | -------------------------------------------------------------------------------- /include/openpose/face/faceDetectorOpenCV.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FACE_FACE_DETECTOR_OPENCV_HPP 2 | #define OPENPOSE_FACE_FACE_DETECTOR_OPENCV_HPP 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | namespace op 9 | { 10 | class OP_API FaceDetectorOpenCV 11 | { 12 | public: 13 | explicit FaceDetectorOpenCV(const std::string& modelFolder); 14 | 15 | // No thread-save 16 | std::vector> detectFaces(const cv::Mat& cvInputData); 17 | 18 | private: 19 | cv::CascadeClassifier mFaceCascade; 20 | 21 | DELETE_COPY(FaceDetectorOpenCV); 22 | }; 23 | } 24 | 25 | #endif // OPENPOSE_FACE_FACE_DETECTOR_OPENCV_HPP 26 | -------------------------------------------------------------------------------- /include/openpose/face/faceGpuRenderer.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FACE_FACE_GPU_RENDERER_HPP 2 | #define OPENPOSE_FACE_FACE_GPU_RENDERER_HPP 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | namespace op 10 | { 11 | class OP_API FaceGpuRenderer : public GpuRenderer, public FaceRenderer 12 | { 13 | public: 14 | FaceGpuRenderer(const float renderThreshold, 15 | const float alphaKeypoint = FACE_DEFAULT_ALPHA_KEYPOINT, 16 | const float alphaHeatMap = FACE_DEFAULT_ALPHA_HEAT_MAP); 17 | 18 | ~FaceGpuRenderer(); 19 | 20 | void initializationOnThread(); 21 | 22 | void renderFaceInherited(Array& outputData, const Array& faceKeypoints); 23 | 24 | private: 25 | float* pGpuFace; // GPU aux memory 26 | 27 | DELETE_COPY(FaceGpuRenderer); 28 | }; 29 | } 30 | 31 | #endif // OPENPOSE_FACE_FACE_GPU_RENDERER_HPP 32 | -------------------------------------------------------------------------------- /include/openpose/face/faceParameters.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FACE_FACE_PARAMETERS_HPP 2 | #define OPENPOSE_FACE_FACE_PARAMETERS_HPP 3 | 4 | #include 5 | #include 6 | 7 | namespace op 8 | { 9 | const auto FACE_MAX_FACES = POSE_MAX_PEOPLE; 10 | 11 | const auto FACE_NUMBER_PARTS = 70u; 12 | #define FACE_PAIRS_RENDER_GPU \ 13 | 0,1, 1,2, 2,3, 3,4, 4,5, 5,6, 6,7, 7,8, 8,9, 9,10, 10,11, 11,12, 12,13, 13,14, 14,15, 15,16, 17,18, 18,19, 19,20, \ 14 | 20,21, 22,23, 23,24, 24,25, 25,26, 27,28, 28,29, 29,30, 31,32, 32,33, 33,34, 34,35, 36,37, 37,38, 38,39, 39,40, 40,41, \ 15 | 41,36, 42,43, 43,44, 44,45, 45,46, 46,47, 47,42, 48,49, 49,50, 50,51, 51,52, 52,53, 53,54, 54,55, 55,56, 56,57, 57,58, \ 16 | 58,59, 59,48, 60,61, 61,62, 62,63, 63,64, 64,65, 65,66, 66,67, 67,60 17 | #define FACE_SCALES_RENDER_GPU 1 18 | const std::vector FACE_PAIRS_RENDER {FACE_PAIRS_RENDER_GPU}; 19 | #define FACE_COLORS_RENDER_GPU 255.f, 255.f, 255.f 20 | const std::vector FACE_COLORS_RENDER{FACE_COLORS_RENDER_GPU}; 21 | const std::vector FACE_SCALES_RENDER{FACE_SCALES_RENDER_GPU}; 22 | 23 | // Constant parameters 24 | const auto FACE_CCN_DECREASE_FACTOR = 8.f; 25 | const std::string FACE_PROTOTXT{"face/pose_deploy.prototxt"}; 26 | const std::string FACE_TRAINED_MODEL{"face/pose_iter_116000.caffemodel"}; 27 | 28 | // Rendering parameters 29 | const auto FACE_DEFAULT_ALPHA_KEYPOINT = POSE_DEFAULT_ALPHA_KEYPOINT; 30 | const auto FACE_DEFAULT_ALPHA_HEAT_MAP = POSE_DEFAULT_ALPHA_HEAT_MAP; 31 | } 32 | 33 | #endif // OPENPOSE_FACE_FACE_PARAMETERS_HPP 34 | -------------------------------------------------------------------------------- /include/openpose/face/faceRenderer.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FACE_FACE_RENDERER_HPP 2 | #define OPENPOSE_FACE_FACE_RENDERER_HPP 3 | 4 | #include 5 | 6 | namespace op 7 | { 8 | class OP_API FaceRenderer 9 | { 10 | public: 11 | virtual void initializationOnThread(){}; 12 | 13 | void renderFace(Array& outputData, const Array& faceKeypoints, 14 | const float scaleInputToOutput); 15 | 16 | private: 17 | virtual void renderFaceInherited(Array& outputData, const Array& faceKeypoints) = 0; 18 | }; 19 | } 20 | 21 | #endif // OPENPOSE_FACE_FACE_RENDERER_HPP 22 | -------------------------------------------------------------------------------- /include/openpose/face/headers.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FACE_HEADERS_HPP 2 | #define OPENPOSE_FACE_HEADERS_HPP 3 | 4 | // face module 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | #endif // OPENPOSE_FACE_HEADERS_HPP 20 | -------------------------------------------------------------------------------- /include/openpose/face/renderFace.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FACE_RENDER_FACE_HPP 2 | #define OPENPOSE_FACE_RENDER_FACE_HPP 3 | 4 | #include 5 | #include 6 | 7 | namespace op 8 | { 9 | OP_API void renderFaceKeypointsCpu(Array& frameArray, const Array& faceKeypoints, const float renderThreshold); 10 | 11 | OP_API void renderFaceKeypointsGpu(float* framePtr, const Point& frameSize, const float* const facePtr, const int numberPeople, 12 | const float renderThreshold, const float alphaColorToAdd = FACE_DEFAULT_ALPHA_KEYPOINT); 13 | } 14 | 15 | #endif // OPENPOSE_FACE_RENDER_FACE_HPP 16 | -------------------------------------------------------------------------------- /include/openpose/filestream/bvhSaver.hpp: -------------------------------------------------------------------------------- 1 | #ifdef USE_3D_ADAM_MODEL 2 | #ifndef OPENPOSE_FILESTREAM_BVH_SAVER_HPP 3 | #define OPENPOSE_FILESTREAM_BVH_SAVER_HPP 4 | 5 | #ifdef USE_3D_ADAM_MODEL 6 | #include 7 | #endif 8 | #include 9 | 10 | namespace op 11 | { 12 | class OP_API BvhSaver 13 | { 14 | public: 15 | BvhSaver(const std::string bvhFilePath, 16 | const std::shared_ptr& totalModel = nullptr, 17 | const double fps = 30.); 18 | 19 | ~BvhSaver(); 20 | 21 | void initializationOnThread(); 22 | 23 | void updateBvh(const Eigen::Matrix& adamPose, 24 | const Eigen::Vector3d& adamTranslation, 25 | const Eigen::Matrix& j0Vec); 26 | 27 | 28 | private: 29 | // PIMPL idiom 30 | // http://www.cppsamples.com/common-tasks/pimpl.html 31 | struct ImplBvhSaver; 32 | std::shared_ptr spImpl; 33 | 34 | // PIMP requires DELETE_COPY & destructor, or extra code 35 | // http://oliora.github.io/2015/12/29/pimpl-and-rule-of-zero.html 36 | DELETE_COPY(BvhSaver); 37 | }; 38 | } 39 | 40 | #endif // OPENPOSE_FILESTREAM_BVH_SAVER_HPP 41 | #endif 42 | -------------------------------------------------------------------------------- /include/openpose/filestream/cocoJsonSaver.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FILESTREAM_POSE_JSON_COCO_SAVER_HPP 2 | #define OPENPOSE_FILESTREAM_POSE_JSON_COCO_SAVER_HPP 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | namespace op 9 | { 10 | /** 11 | * The CocoJsonSaver class creates a COCO validation json file with details about the processed images. It 12 | * inherits from Recorder. 13 | */ 14 | class OP_API CocoJsonSaver 15 | { 16 | public: 17 | /** 18 | * This constructor of CocoJsonSaver extends the Recorder::Recorder(const std::string & filePathToSave) 19 | * constructor. 20 | * @param filePathToSave const std::string parameter with the final file path where the generated json file 21 | * will be saved. 22 | */ 23 | explicit CocoJsonSaver(const std::string& filePathToSave, const bool humanReadable = true, 24 | const CocoJsonFormat cocoJsonFormat = CocoJsonFormat::Body); 25 | 26 | ~CocoJsonSaver(); 27 | 28 | void record(const Array& poseKeypoints, const Array& poseScores, const std::string& imageName); 29 | 30 | private: 31 | const CocoJsonFormat mCocoJsonFormat; 32 | JsonOfstream mJsonOfstream; 33 | bool mFirstElementAdded; 34 | 35 | DELETE_COPY(CocoJsonSaver); 36 | }; 37 | } 38 | 39 | #endif // OPENPOSE_FILESTREAM_POSE_JSON_COCO_SAVER_HPP 40 | -------------------------------------------------------------------------------- /include/openpose/filestream/enumClasses.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FILESTREAM_ENUM_CLASSES_HPP 2 | #define OPENPOSE_FILESTREAM_ENUM_CLASSES_HPP 3 | 4 | namespace op 5 | { 6 | enum class DataFormat : unsigned char 7 | { 8 | Json, 9 | Xml, 10 | Yaml, 11 | Yml, 12 | }; 13 | enum class CocoJsonFormat : bool 14 | { 15 | Body, 16 | Foot, 17 | }; 18 | } 19 | 20 | #endif // OPENPOSE_FILESTREAM_ENUM_CLASSES_HPP 21 | -------------------------------------------------------------------------------- /include/openpose/filestream/fileSaver.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FILESTREAM_DATA_SAVER_HPP 2 | #define OPENPOSE_FILESTREAM_DATA_SAVER_HPP 3 | 4 | #include 5 | #include 6 | 7 | namespace op 8 | { 9 | class OP_API FileSaver 10 | { 11 | protected: 12 | explicit FileSaver(const std::string& directoryPath); 13 | 14 | std::string getNextFileName(const unsigned long long index) const; 15 | 16 | std::string getNextFileName(const std::string& fileNameNoExtension) const; 17 | 18 | private: 19 | const std::string mDirectoryPath; 20 | }; 21 | } 22 | 23 | #endif // OPENPOSE_FILESTREAM_DATA_SAVER_HPP 24 | -------------------------------------------------------------------------------- /include/openpose/filestream/headers.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FILESTREAM_HEADERS_HPP 2 | #define OPENPOSE_FILESTREAM_HEADERS_HPP 3 | 4 | // fileStream module 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | 28 | #endif // OPENPOSE_FILESTREAM_HEADERS_HPP 29 | -------------------------------------------------------------------------------- /include/openpose/filestream/heatMapSaver.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FILESTREAM_HEAT_MAP_SAVER_HPP 2 | #define OPENPOSE_FILESTREAM_HEAT_MAP_SAVER_HPP 3 | 4 | #include 5 | #include 6 | 7 | namespace op 8 | { 9 | class OP_API HeatMapSaver : public FileSaver 10 | { 11 | public: 12 | HeatMapSaver(const std::string& directoryPath, const std::string& imageFormat); 13 | 14 | void saveHeatMaps(const std::vector>& heatMaps, const std::string& fileName) const; 15 | 16 | private: 17 | const std::string mImageFormat; 18 | }; 19 | } 20 | 21 | #endif // OPENPOSE_FILESTREAM_HEAT_MAP_SAVER_HPP 22 | -------------------------------------------------------------------------------- /include/openpose/filestream/imageSaver.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FILESTREAM_IMAGE_SAVER_HPP 2 | #define OPENPOSE_FILESTREAM_IMAGE_SAVER_HPP 3 | 4 | #include // cv::Mat 5 | #include 6 | #include 7 | 8 | namespace op 9 | { 10 | class OP_API ImageSaver : public FileSaver 11 | { 12 | public: 13 | ImageSaver(const std::string& directoryPath, const std::string& imageFormat); 14 | 15 | void saveImages(const std::vector& cvOutputDatas, const std::string& fileName) const; 16 | 17 | private: 18 | const std::string mImageFormat; 19 | }; 20 | } 21 | 22 | #endif // OPENPOSE_FILESTREAM_IMAGE_SAVER_HPP 23 | -------------------------------------------------------------------------------- /include/openpose/filestream/jsonOfstream.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FILESTREAM_JSON_OFSTREAM_HPP 2 | #define OPENPOSE_FILESTREAM_JSON_OFSTREAM_HPP 3 | 4 | #include // std::ofstream 5 | #include 6 | 7 | namespace op 8 | { 9 | class OP_API JsonOfstream 10 | { 11 | public: 12 | explicit JsonOfstream(const std::string& filePath, const bool humanReadable = true); 13 | 14 | ~JsonOfstream(); 15 | 16 | void objectOpen(); 17 | 18 | void objectClose(); 19 | 20 | void arrayOpen(); 21 | 22 | void arrayClose(); 23 | 24 | void version(const std::string& version); 25 | 26 | void key(const std::string& string); 27 | 28 | template 29 | inline void plainText(const T& value) 30 | { 31 | mOfstream << value; 32 | } 33 | 34 | inline void comma() 35 | { 36 | mOfstream << ","; 37 | } 38 | 39 | void enter(); 40 | 41 | private: 42 | const bool mHumanReadable; 43 | long long mBracesCounter; 44 | long long mBracketsCounter; 45 | std::ofstream mOfstream; 46 | 47 | DELETE_COPY(JsonOfstream); 48 | }; 49 | } 50 | 51 | #endif // OPENPOSE_FILESTREAM_JSON_OFSTREAM_HPP 52 | -------------------------------------------------------------------------------- /include/openpose/filestream/keypointSaver.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FILESTREAM_KEYPOINT_SAVER_HPP 2 | #define OPENPOSE_FILESTREAM_KEYPOINT_SAVER_HPP 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | namespace op 9 | { 10 | class OP_API KeypointSaver : public FileSaver 11 | { 12 | public: 13 | KeypointSaver(const std::string& directoryPath, const DataFormat format); 14 | 15 | void saveKeypoints(const std::vector>& keypointVector, const std::string& fileName, const std::string& keypointName) const; 16 | 17 | private: 18 | const DataFormat mFormat; 19 | }; 20 | } 21 | 22 | #endif // OPENPOSE_FILESTREAM_KEYPOINT_SAVER_HPP 23 | -------------------------------------------------------------------------------- /include/openpose/filestream/peopleJsonSaver.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FILESTREAM_PEOPLE_JSON_SAVER_HPP 2 | #define OPENPOSE_FILESTREAM_PEOPLE_JSON_SAVER_HPP 3 | 4 | #include 5 | #include 6 | 7 | namespace op 8 | { 9 | class OP_API PeopleJsonSaver : public FileSaver 10 | { 11 | public: 12 | PeopleJsonSaver(const std::string& directoryPath); 13 | 14 | void save(const std::vector, std::string>>& keypointVector, 15 | const std::vector>>& candidates, 16 | const std::string& fileName, const bool humanReadable = true) const; 17 | }; 18 | } 19 | 20 | #endif // OPENPOSE_FILESTREAM_PEOPLE_JSON_SAVER_HPP 21 | -------------------------------------------------------------------------------- /include/openpose/filestream/udpSender.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FILESTREAM_UDP_SENDER_HPP 2 | #define OPENPOSE_FILESTREAM_UDP_SENDER_HPP 3 | 4 | #include 5 | 6 | namespace op 7 | { 8 | class OP_API UdpSender 9 | { 10 | public: 11 | UdpSender(const std::string& udpHost, const std::string& udpPort); 12 | 13 | void sendJointAngles(const double* const adamPosePtr, const int adamPoseRows, 14 | const double* const adamTranslationPtr, 15 | const double* const adamFaceCoeffsExpPtr, const int faceCoeffRows); 16 | 17 | private: 18 | // PIMPL idiom 19 | // http://www.cppsamples.com/common-tasks/pimpl.html 20 | struct ImplUdpSender; 21 | std::shared_ptr spImpl; 22 | 23 | // PIMP requires DELETE_COPY & destructor, or extra code 24 | // http://oliora.github.io/2015/12/29/pimpl-and-rule-of-zero.html 25 | DELETE_COPY(UdpSender); 26 | }; 27 | } 28 | 29 | #endif // OPENPOSE_FILESTREAM_UDP_SENDER_HPP 30 | -------------------------------------------------------------------------------- /include/openpose/filestream/videoSaver.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_FILESTREAM_VIDEO_SAVER_HPP 2 | #define OPENPOSE_FILESTREAM_VIDEO_SAVER_HPP 3 | 4 | #include // cv::Mat 5 | #include // cv::VideoWriter 6 | #include 7 | 8 | namespace op 9 | { 10 | class OP_API VideoSaver 11 | { 12 | public: 13 | VideoSaver(const std::string& videoSaverPath, const int cvFourcc, const double fps, const Point& cvSize); 14 | 15 | bool isOpened(); 16 | 17 | void write(const cv::Mat& cvMat); 18 | 19 | void write(const std::vector& cvMats); 20 | 21 | private: 22 | const std::string mVideoSaverPath; 23 | const int mCvFourcc; 24 | const double mFps; 25 | const Point mCvSize; 26 | cv::VideoWriter mVideoWriter; 27 | unsigned int mNumberImages; 28 | 29 | DELETE_COPY(VideoSaver); 30 | }; 31 | } 32 | 33 | #endif // OPENPOSE_FILESTREAM_VIDEO_SAVER_HPP 34 | -------------------------------------------------------------------------------- /include/openpose/gpu/cuda.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_GPU_CUDA_HPP 2 | #define OPENPOSE_GPU_CUDA_HPP 3 | 4 | #include // std::pair 5 | #include 6 | 7 | namespace op 8 | { 9 | const auto CUDA_NUM_THREADS = 512u; 10 | 11 | OP_API void cudaCheck(const int line = -1, const std::string& function = "", const std::string& file = ""); 12 | 13 | OP_API int getCudaGpuNumber(); 14 | 15 | inline unsigned int getNumberCudaBlocks(const unsigned int totalRequired, 16 | const unsigned int numberCudaThreads = CUDA_NUM_THREADS) 17 | { 18 | return (totalRequired + numberCudaThreads - 1) / numberCudaThreads; 19 | } 20 | 21 | OP_API void getNumberCudaThreadsAndBlocks(dim3& numberCudaThreads, dim3& numberCudaBlocks, 22 | const Point& frameSize); 23 | } 24 | 25 | #endif // OPENPOSE_GPU_CUDA_HPP 26 | -------------------------------------------------------------------------------- /include/openpose/gpu/enumClasses.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_GPU_ENUM_CLASSES_HPP 2 | #define OPENPOSE_GPU_ENUM_CLASSES_HPP 3 | 4 | namespace op 5 | { 6 | enum class GpuMode : unsigned char 7 | { 8 | Cuda = 0, 9 | OpenCL = 1, 10 | NoGpu = 2, 11 | Size, 12 | }; 13 | } 14 | 15 | #endif // OPENPOSE_GPU_ENUM_CLASSES_HPP 16 | -------------------------------------------------------------------------------- /include/openpose/gpu/gpu.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_GPU_GPU_HPP 2 | #define OPENPOSE_GPU_GPU_HPP 3 | 4 | #include 5 | #include 6 | 7 | namespace op 8 | { 9 | OP_API int getGpuNumber(); 10 | 11 | OP_API GpuMode getGpuMode(); 12 | } 13 | 14 | #endif // OPENPOSE_GPU_GPU_HPP 15 | -------------------------------------------------------------------------------- /include/openpose/gpu/headers.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_GPU_HEADERS_HPP 2 | #define OPENPOSE_GPU_HEADERS_HPP 3 | 4 | // gpu module 5 | #include 6 | #include 7 | #include 8 | 9 | #endif // OPENPOSE_GPU_HEADERS_HPP 10 | -------------------------------------------------------------------------------- /include/openpose/gui/enumClasses.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_GUI_ENUM_CLASSES_HPP 2 | #define OPENPOSE_GUI_ENUM_CLASSES_HPP 3 | 4 | namespace op 5 | { 6 | /** 7 | * GUI display modes. 8 | * An enum class with the different output screen options. E.g., 2-D, 3-D, all, none. 9 | */ 10 | enum class DisplayMode : unsigned short 11 | { 12 | NoDisplay, /**< No display. */ 13 | DisplayAll, /**< All (2-D and 3-D/Adam) displays */ 14 | Display2D, /**< Only 2-D display. */ 15 | Display3D, /**< Only 3-D display. */ 16 | DisplayAdam /**< Only Adam display. */ 17 | }; 18 | 19 | /** 20 | * Full screen modes. 21 | * An enum class with the different full screen mode options, i.e., full screen or windored. 22 | */ 23 | enum class FullScreenMode : bool 24 | { 25 | FullScreen, /**< Full screen mode. */ 26 | Windowed, /**< Windowed mode, depending on the frame output size. */ 27 | }; 28 | } 29 | 30 | #endif // OPENPOSE_GUI_ENUM_CLASSES_HPP 31 | -------------------------------------------------------------------------------- /include/openpose/gui/gui3D.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_GUI_GUI_3D_HPP 2 | #define OPENPOSE_GUI_GUI_3D_HPP 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | namespace op 11 | { 12 | class OP_API Gui3D : public Gui 13 | { 14 | public: 15 | Gui3D(const Point& outputSize, const bool fullScreen, 16 | const std::shared_ptr>& isRunningSharedPtr, 17 | const std::shared_ptr, std::atomic>>& videoSeekSharedPtr = nullptr, 18 | const std::vector>& poseExtractorNets = {}, 19 | const std::vector>& faceExtractorNets = {}, 20 | const std::vector>& handExtractorNets = {}, 21 | const std::vector>& renderers = {}, 22 | const PoseModel poseModel = PoseModel::BODY_25, 23 | const DisplayMode displayMode = DisplayMode::DisplayAll); 24 | 25 | virtual ~Gui3D(); 26 | 27 | virtual void initializationOnThread(); 28 | 29 | void setKeypoints(const Array& poseKeypoints3D, const Array& faceKeypoints3D, 30 | const Array& leftHandKeypoints3D, const Array& rightHandKeypoints3D); 31 | 32 | virtual void update(); 33 | }; 34 | } 35 | 36 | #endif // OPENPOSE_GUI_GUI_3D_HPP 37 | -------------------------------------------------------------------------------- /include/openpose/gui/guiInfoAdder.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_GUI_ADD_GUI_INFO_HPP 2 | #define OPENPOSE_GUI_ADD_GUI_INFO_HPP 3 | 4 | #include 5 | #include // cv::Mat 6 | #include 7 | 8 | namespace op 9 | { 10 | class OP_API GuiInfoAdder 11 | { 12 | public: 13 | GuiInfoAdder(const int numberGpus, const bool guiEnabled = false); 14 | 15 | void addInfo(cv::Mat& cvOutputData, const int numberPeople, const unsigned long long id, 16 | const std::string& elementRenderedName, const unsigned long long frameNumber, 17 | const Array& poseIds = Array{}, 18 | const Array& poseKeypoints = Array{}); 19 | 20 | private: 21 | // Const variables 22 | const int mNumberGpus; 23 | const bool mGuiEnabled; 24 | // Other variables 25 | std::queue mFpsQueue; 26 | double mFps; 27 | unsigned int mFpsCounter; 28 | std::string mLastElementRenderedName; 29 | int mLastElementRenderedCounter; 30 | unsigned long long mLastId; 31 | }; 32 | } 33 | 34 | #endif // OPENPOSE_GUI_ADD_GUI_INFO_HPP 35 | -------------------------------------------------------------------------------- /include/openpose/gui/headers.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_GUI_HEADERS_HPP 2 | #define OPENPOSE_GUI_HEADERS_HPP 3 | 4 | // gui module 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | #endif // OPENPOSE_GUI_HEADERS_HPP 17 | -------------------------------------------------------------------------------- /include/openpose/hand/handCpuRenderer.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_HAND_HAND_CPU_RENDERER_HPP 2 | #define OPENPOSE_HAND_HAND_CPU_RENDERER_HPP 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | namespace op 10 | { 11 | class OP_API HandCpuRenderer : public Renderer, public HandRenderer 12 | { 13 | public: 14 | HandCpuRenderer(const float renderThreshold, const float alphaKeypoint = HAND_DEFAULT_ALPHA_KEYPOINT, 15 | const float alphaHeatMap = HAND_DEFAULT_ALPHA_HEAT_MAP); 16 | 17 | void renderHandInherited(Array& outputData, const std::array, 2>& handKeypoints); 18 | 19 | DELETE_COPY(HandCpuRenderer); 20 | }; 21 | } 22 | 23 | #endif // OPENPOSE_HAND_HAND_CPU_RENDERER_HPP 24 | -------------------------------------------------------------------------------- /include/openpose/hand/handDetector.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_HAND_HAND_DETECTOR_HPP 2 | #define OPENPOSE_HAND_HAND_DETECTOR_HPP 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | namespace op 9 | { 10 | // Note: This class is thread-safe, so several GPUs can be running hands and using `updateTracker`, and updateTracker will keep the latest known 11 | // tracking 12 | class OP_API HandDetector 13 | { 14 | public: 15 | explicit HandDetector(const PoseModel poseModel); 16 | 17 | std::vector, 2>> detectHands(const Array& poseKeypoints) const; 18 | 19 | std::vector, 2>> trackHands(const Array& poseKeypoints); 20 | 21 | void updateTracker(const std::array, 2>& handKeypoints, const unsigned long long id); 22 | 23 | private: 24 | enum class PosePart : unsigned int 25 | { 26 | LWrist = 0, 27 | LElbow, 28 | LShoulder, 29 | RWrist, 30 | RElbow, 31 | RShoulder, 32 | Size, 33 | }; 34 | 35 | const std::array mPoseIndexes; 36 | std::vector, (int)PosePart::Size>> mPoseTrack; 37 | std::vector> mHandLeftPrevious; 38 | std::vector> mHandRightPrevious; 39 | unsigned long long mCurrentId; 40 | std::mutex mMutex; 41 | 42 | std::array getPoseKeypoints(const PoseModel poseModel, 43 | const std::array& poseStrings) const; 44 | 45 | DELETE_COPY(HandDetector); 46 | }; 47 | } 48 | 49 | #endif // OPENPOSE_HAND_HAND_DETECTOR_HPP 50 | -------------------------------------------------------------------------------- /include/openpose/hand/handDetectorFromTxt.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_HAND_HAND_DETECTOR_FROM_TXT_HPP 2 | #define OPENPOSE_HAND_HAND_DETECTOR_FROM_TXT_HPP 3 | 4 | #include 5 | #include 6 | 7 | namespace op 8 | { 9 | class OP_API HandDetectorFromTxt 10 | { 11 | public: 12 | explicit HandDetectorFromTxt(const std::string& txtDirectoryPath); 13 | 14 | std::vector, 2>> detectHands(); 15 | 16 | private: 17 | const std::string mTxtDirectoryPath; 18 | const std::vector mFilePaths; 19 | long long mFrameNameCounter; 20 | 21 | DELETE_COPY(HandDetectorFromTxt); 22 | }; 23 | } 24 | 25 | #endif // OPENPOSE_HAND_HAND_DETECTOR_FROM_TXT_HPP 26 | -------------------------------------------------------------------------------- /include/openpose/hand/handGpuRenderer.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_HAND_HAND_GPU_RENDERER_HPP 2 | #define OPENPOSE_HAND_HAND_GPU_RENDERER_HPP 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | namespace op 10 | { 11 | class OP_API HandGpuRenderer : public GpuRenderer, public HandRenderer 12 | { 13 | public: 14 | HandGpuRenderer(const float renderThreshold, 15 | const float alphaKeypoint = HAND_DEFAULT_ALPHA_KEYPOINT, 16 | const float alphaHeatMap = HAND_DEFAULT_ALPHA_HEAT_MAP); 17 | 18 | ~HandGpuRenderer(); 19 | 20 | void initializationOnThread(); 21 | 22 | void renderHandInherited(Array& outputData, const std::array, 2>& handKeypoints); 23 | 24 | private: 25 | float* pGpuHand; // GPU aux memory 26 | 27 | DELETE_COPY(HandGpuRenderer); 28 | }; 29 | } 30 | 31 | #endif // OPENPOSE_HAND_HAND_GPU_RENDERER_HPP 32 | -------------------------------------------------------------------------------- /include/openpose/hand/handRenderer.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_HAND_HAND_RENDERER_HPP 2 | #define OPENPOSE_HAND_HAND_RENDERER_HPP 3 | 4 | #include 5 | 6 | namespace op 7 | { 8 | class OP_API HandRenderer 9 | { 10 | public: 11 | virtual void initializationOnThread(){}; 12 | 13 | void renderHand(Array& outputData, const std::array, 2>& handKeypoints, 14 | const float scaleInputToOutput); 15 | 16 | private: 17 | virtual void renderHandInherited(Array& outputData, 18 | const std::array, 2>& handKeypoints) = 0; 19 | }; 20 | } 21 | 22 | #endif // OPENPOSE_HAND_HAND_RENDERER_HPP 23 | -------------------------------------------------------------------------------- /include/openpose/hand/headers.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_HAND_HEADERS_HPP 2 | #define OPENPOSE_HAND_HEADERS_HPP 3 | 4 | // hand module 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | 21 | #endif // OPENPOSE_HAND_HEADERS_HPP 22 | -------------------------------------------------------------------------------- /include/openpose/hand/renderHand.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_HAND_GPU_HAND_RENDER_HPP 2 | #define OPENPOSE_HAND_GPU_HAND_RENDER_HPP 3 | 4 | #include 5 | #include 6 | 7 | namespace op 8 | { 9 | OP_API void renderHandKeypointsCpu(Array& frameArray, const std::array, 2>& handKeypoints, 10 | const float renderThreshold); 11 | 12 | OP_API void renderHandKeypointsGpu(float* framePtr, const Point& frameSize, const float* const handsPtr, 13 | const int numberHands, const float renderThreshold, 14 | const float alphaColorToAdd = HAND_DEFAULT_ALPHA_KEYPOINT); 15 | } 16 | 17 | #endif // OPENPOSE_HAND_GPU_HAND_RENDER_HPP 18 | -------------------------------------------------------------------------------- /include/openpose/headers.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_HEADERS_HPP 2 | #define OPENPOSE_HEADERS_HPP 3 | 4 | // 3d module 5 | #include 6 | 7 | // calibration module 8 | #include 9 | 10 | // core module 11 | #include 12 | 13 | // face module 14 | #include 15 | 16 | // filestream module 17 | #include 18 | 19 | // gui module 20 | #include 21 | 22 | // hand module 23 | #include 24 | 25 | // net module 26 | #include 27 | 28 | // pose module 29 | #include 30 | 31 | // producer module 32 | #include 33 | 34 | // threading module 35 | #include 36 | 37 | // tracking module 38 | #include 39 | 40 | // utilities module 41 | #include 42 | 43 | // wrapper module 44 | #include 45 | 46 | #endif // OPENPOSE_HEADERS_HPP 47 | -------------------------------------------------------------------------------- /include/openpose/net/headers.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_NET_HEADERS_HPP 2 | #define OPENPOSE_NET_HEADERS_HPP 3 | 4 | // net module 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | #endif // OPENPOSE_NET_HEADERS_HPP 15 | -------------------------------------------------------------------------------- /include/openpose/net/maximumBase.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_NET_MAXIMUM_BASE_HPP 2 | #define OPENPOSE_NET_MAXIMUM_BASE_HPP 3 | 4 | #include 5 | 6 | namespace op 7 | { 8 | template 9 | OP_API void maximumCpu(T* targetPtr, const T* const sourcePtr, const std::array& targetSize, 10 | const std::array& sourceSize); 11 | 12 | template 13 | OP_API void maximumGpu(T* targetPtr, const T* const sourcePtr, const std::array& targetSize, 14 | const std::array& sourceSize); 15 | } 16 | 17 | #endif // OPENPOSE_NET_MAXIMUM_BASE_HPP 18 | -------------------------------------------------------------------------------- /include/openpose/net/maximumCaffe.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_NET_MAXIMUM_CAFFE_HPP 2 | #define OPENPOSE_NET_MAXIMUM_CAFFE_HPP 3 | 4 | #include 5 | 6 | namespace op 7 | { 8 | // It mostly follows the Caffe::layer implementation, so Caffe users can easily use it. However, in order to keep 9 | // the compatibility with any generic Caffe version, we keep this 'layer' inside our library rather than in the 10 | // Caffe code. 11 | template 12 | class OP_API MaximumCaffe 13 | { 14 | public: 15 | explicit MaximumCaffe(); 16 | 17 | virtual void LayerSetUp(const std::vector*>& bottom, const std::vector*>& top); 18 | 19 | virtual void Reshape(const std::vector*>& bottom, const std::vector*>& top); 20 | 21 | virtual inline const char* type() const { return "Maximum"; } 22 | 23 | virtual void Forward_cpu(const std::vector*>& bottom, const std::vector*>& top); 24 | 25 | virtual void Forward_gpu(const std::vector*>& bottom, const std::vector*>& top); 26 | 27 | virtual void Backward_cpu(const std::vector*>& top, const std::vector& propagate_down, 28 | const std::vector*>& bottom); 29 | 30 | virtual void Backward_gpu(const std::vector*>& top, const std::vector& propagate_down, 31 | const std::vector*>& bottom); 32 | 33 | private: 34 | std::array mBottomSize; 35 | std::array mTopSize; 36 | }; 37 | } 38 | 39 | #endif // OPENPOSE_NET_MAXIMUM_CAFFE_HPP 40 | -------------------------------------------------------------------------------- /include/openpose/net/net.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_NET_NET_HPP 2 | #define OPENPOSE_NET_NET_HPP 3 | 4 | #include 5 | 6 | namespace op 7 | { 8 | class OP_API Net 9 | { 10 | public: 11 | virtual void initializationOnThread() = 0; 12 | 13 | virtual void forwardPass(const Array& inputData) const = 0; 14 | }; 15 | } 16 | 17 | #endif // OPENPOSE_NET_NET_HPP 18 | -------------------------------------------------------------------------------- /include/openpose/net/netCaffe.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_NET_NET_CAFFE_HPP 2 | #define OPENPOSE_NET_NET_CAFFE_HPP 3 | 4 | #include 5 | #include 6 | 7 | namespace op 8 | { 9 | class OP_API NetCaffe : public Net 10 | { 11 | public: 12 | NetCaffe(const std::string& caffeProto, const std::string& caffeTrainedModel, const int gpuId = 0, 13 | const bool enableGoogleLogging = true, const std::string& lastBlobName = "net_output"); 14 | 15 | virtual ~NetCaffe(); 16 | 17 | void initializationOnThread(); 18 | 19 | void forwardPass(const Array& inputNetData) const; 20 | 21 | boost::shared_ptr> getOutputBlob() const; 22 | 23 | private: 24 | // PIMPL idiom 25 | // http://www.cppsamples.com/common-tasks/pimpl.html 26 | struct ImplNetCaffe; 27 | std::unique_ptr upImpl; 28 | 29 | // PIMP requires DELETE_COPY & destructor, or extra code 30 | // http://oliora.github.io/2015/12/29/pimpl-and-rule-of-zero.html 31 | DELETE_COPY(NetCaffe); 32 | }; 33 | } 34 | 35 | #endif // OPENPOSE_NET_NET_CAFFE_HPP 36 | -------------------------------------------------------------------------------- /include/openpose/net/nmsBase.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_NET_NMS_BASE_HPP 2 | #define OPENPOSE_NET_NMS_BASE_HPP 3 | 4 | #include 5 | 6 | namespace op 7 | { 8 | template 9 | OP_API void nmsCpu(T* targetPtr, int* kernelPtr, const T* const sourcePtr, const T threshold, 10 | const std::array& targetSize, const std::array& sourceSize, 11 | const Point& offset); 12 | 13 | template 14 | OP_API void nmsGpu(T* targetPtr, int* kernelPtr, const T* const sourcePtr, const T threshold, 15 | const std::array& targetSize, const std::array& sourceSize, 16 | const Point& offset); 17 | 18 | template 19 | OP_API void nmsOcl(T* targetPtr, int* kernelPtr, const T* const sourcePtr, const T threshold, 20 | const std::array& targetSize, const std::array& sourceSize, 21 | const Point& offset, const int gpuID = 0); 22 | } 23 | 24 | #endif // OPENPOSE_NET_NMS_BASE_HPP 25 | -------------------------------------------------------------------------------- /include/openpose/net/resizeAndMergeBase.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_NET_RESIZE_AND_MERGE_BASE_HPP 2 | #define OPENPOSE_NET_RESIZE_AND_MERGE_BASE_HPP 3 | 4 | #include 5 | 6 | namespace op 7 | { 8 | template 9 | OP_API void resizeAndMergeCpu(T* targetPtr, const std::vector& sourcePtrs, 10 | const std::array& targetSize, 11 | const std::vector>& sourceSizes, 12 | const std::vector& scaleInputToNetInputs = {1.f}); 13 | 14 | template 15 | OP_API void resizeAndMergeGpu(T* targetPtr, const std::vector& sourcePtrs, 16 | const std::array& targetSize, 17 | const std::vector>& sourceSizes, 18 | const std::vector& scaleInputToNetInputs = {1.f}); 19 | 20 | template 21 | OP_API void resizeAndMergeOcl(T* targetPtr, const std::vector& sourcePtrs, 22 | std::vector& sourceTempPtrs, 23 | const std::array& targetSize, 24 | const std::vector>& sourceSizes, 25 | const std::vector& scaleInputToNetInputs = {1.f}, 26 | const int gpuID = 0); 27 | } 28 | 29 | #endif // OPENPOSE_NET_RESIZE_AND_MERGE_BASE_HPP 30 | -------------------------------------------------------------------------------- /include/openpose/pose/enumClasses.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_POSE_ENUM_CLASSES_HPP 2 | #define OPENPOSE_POSE_ENUM_CLASSES_HPP 3 | 4 | namespace op 5 | { 6 | /** 7 | * An enum class in which all the possible type of pose estimation models are included. 8 | */ 9 | enum class PoseModel : unsigned char 10 | { 11 | /** 12 | * COCO + 6 foot keypoints + neck + lower abs model, with 25+1 components (see poseParameters.hpp for details). 13 | */ 14 | BODY_25 = 0, 15 | COCO_18, /**< COCO model + neck, with 18+1 components (see poseParameters.hpp for details). */ 16 | MPI_15, /**< MPI model, with 15+1 components (see poseParameters.hpp for details). */ 17 | MPI_15_4, /**< Variation of the MPI model, reduced number of CNN stages to 4: faster but less accurate.*/ 18 | BODY_19, /**< Experimental. Do not use. */ 19 | BODY_19_X2, /**< Experimental. Do not use. */ 20 | BODY_59, /**< Experimental. Do not use. */ 21 | BODY_19N, /**< Experimental. Do not use. */ 22 | BODY_25E, /**< Experimental. Do not use. */ 23 | BODY_25_19, /**< Experimental. Do not use. */ 24 | BODY_65, /**< Experimental. Do not use. */ 25 | CAR_12, /**< Experimental. Do not use. */ 26 | Size, 27 | }; 28 | 29 | enum class PoseProperty : unsigned char 30 | { 31 | NMSThreshold = 0, 32 | ConnectInterMinAboveThreshold, 33 | ConnectInterThreshold, 34 | ConnectMinSubsetCnt, 35 | ConnectMinSubsetScore, 36 | Size, 37 | }; 38 | } 39 | 40 | #endif // OPENPOSE_POSE_ENUM_CLASSES_HPP 41 | -------------------------------------------------------------------------------- /include/openpose/pose/headers.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_POSE_HEADERS_HPP 2 | #define OPENPOSE_POSE_HEADERS_HPP 3 | 4 | // pose module 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | 21 | #endif // OPENPOSE_POSE_HEADERS_HPP 22 | -------------------------------------------------------------------------------- /include/openpose/pose/poseCpuRenderer.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_POSE_POSE_CPU_RENDERER_HPP 2 | #define OPENPOSE_POSE_POSE_CPU_RENDERER_HPP 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | namespace op 11 | { 12 | class OP_API PoseCpuRenderer : public Renderer, public PoseRenderer 13 | { 14 | public: 15 | PoseCpuRenderer(const PoseModel poseModel, const float renderThreshold, const bool blendOriginalFrame = true, 16 | const float alphaKeypoint = POSE_DEFAULT_ALPHA_KEYPOINT, 17 | const float alphaHeatMap = POSE_DEFAULT_ALPHA_HEAT_MAP, 18 | const unsigned int elementToRender = 0u); 19 | 20 | std::pair renderPose(Array& outputData, const Array& poseKeypoints, 21 | const float scaleInputToOutput, 22 | const float scaleNetToOutput = -1.f); 23 | 24 | private: 25 | DELETE_COPY(PoseCpuRenderer); 26 | }; 27 | } 28 | 29 | #endif // OPENPOSE_POSE_POSE_CPU_RENDERER_HPP 30 | -------------------------------------------------------------------------------- /include/openpose/pose/poseGpuRenderer.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_POSE_POSE_GPU_RENDERER_HPP 2 | #define OPENPOSE_POSE_POSE_GPU_RENDERER_HPP 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | namespace op 12 | { 13 | class OP_API PoseGpuRenderer : public GpuRenderer, public PoseRenderer 14 | { 15 | public: 16 | PoseGpuRenderer(const PoseModel poseModel, const std::shared_ptr& poseExtractorNet, 17 | const float renderThreshold, const bool blendOriginalFrame = true, 18 | const float alphaKeypoint = POSE_DEFAULT_ALPHA_KEYPOINT, 19 | const float alphaHeatMap = POSE_DEFAULT_ALPHA_HEAT_MAP, 20 | const unsigned int elementToRender = 0u); 21 | 22 | ~PoseGpuRenderer(); 23 | 24 | void initializationOnThread(); 25 | 26 | std::pair renderPose(Array& outputData, const Array& poseKeypoints, 27 | const float scaleInputToOutput, 28 | const float scaleNetToOutput = -1.f); 29 | 30 | private: 31 | const std::shared_ptr spPoseExtractorNet; 32 | // Init with thread 33 | float* pGpuPose; // GPU aux memory 34 | 35 | DELETE_COPY(PoseGpuRenderer); 36 | }; 37 | } 38 | 39 | #endif // OPENPOSE_POSE_POSE_GPU_RENDERER_HPP 40 | -------------------------------------------------------------------------------- /include/openpose/pose/poseRenderer.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_POSE_POSE_RENDERER_HPP 2 | #define OPENPOSE_POSE_POSE_RENDERER_HPP 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | namespace op 9 | { 10 | class OP_API PoseRenderer 11 | { 12 | public: 13 | PoseRenderer(const PoseModel poseModel); 14 | 15 | virtual void initializationOnThread(){}; 16 | 17 | virtual std::pair renderPose(Array& outputData, const Array& poseKeypoints, 18 | const float scaleInputToOutput, 19 | const float scaleNetToOutput = -1.f) = 0; 20 | 21 | protected: 22 | const PoseModel mPoseModel; 23 | const std::map mPartIndexToName; 24 | 25 | private: 26 | 27 | DELETE_COPY(PoseRenderer); 28 | }; 29 | } 30 | 31 | #endif // OPENPOSE_POSE_POSE_RENDERER_HPP 32 | -------------------------------------------------------------------------------- /include/openpose/producer/enumClasses.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_PRODUCER_ENUM_CLASSES_HPP 2 | #define OPENPOSE_PRODUCER_ENUM_CLASSES_HPP 3 | 4 | namespace op 5 | { 6 | enum class ProducerFpsMode : bool 7 | { 8 | OriginalFps, /**< The frames will be extracted at the original source fps (frames might be skipped or repeated). */ 9 | RetrievalFps, /**< The frames will be extracted when the software retrieves them (frames will not be skipped or repeated). */ 10 | }; 11 | 12 | enum class ProducerProperty : unsigned char 13 | { 14 | AutoRepeat = 0, 15 | Flip, 16 | Rotation, 17 | Size, 18 | }; 19 | 20 | /** 21 | * Type of producers 22 | * An enum class in which all the possible type of Producer are included. In order to add a new Producer, 23 | * include its name in this enum and add a new 'else if' statement inside ProducerFactory::createProducer(). 24 | */ 25 | enum class ProducerType : unsigned char 26 | { 27 | FlirCamera, /**< Stereo FLIR (Point-Grey) camera reader. Based on Spinnaker SDK. */ 28 | ImageDirectory, /**< An image directory reader. It is able to read images on a folder with a interface similar to the OpenCV cv::VideoCapture. */ 29 | IPCamera, /**< An IP camera frames extractor, extending the functionality of cv::VideoCapture. */ 30 | Video, /**< A video frames extractor, extending the functionality of cv::VideoCapture. */ 31 | Webcam, /**< A webcam frames extractor, extending the functionality of cv::VideoCapture. */ 32 | None, /**< No type defined. Default state when no specific Producer has been picked yet. */ 33 | }; 34 | } 35 | 36 | #endif // OPENPOSE_PRODUCER_ENUM_CLASSES_HPP 37 | -------------------------------------------------------------------------------- /include/openpose/producer/flirReader.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_PRODUCER_FLIR_READER_HPP 2 | #define OPENPOSE_PRODUCER_FLIR_READER_HPP 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | namespace op 9 | { 10 | /** 11 | * FlirReader is an abstract class to extract frames from a FLIR stereo-camera system. Its interface imitates the 12 | * cv::VideoCapture class, so it can be used quite similarly to the cv::VideoCapture class. Thus, 13 | * it is quite similar to VideoReader and WebcamReader. 14 | */ 15 | class OP_API FlirReader : public Producer 16 | { 17 | public: 18 | /** 19 | * Constructor of FlirReader. It opens all the available FLIR cameras 20 | */ 21 | explicit FlirReader(const std::string& cameraParametersPath, const Point& cameraResolution, 22 | const bool undistortImage = true, const int cameraIndex = -1); 23 | 24 | ~FlirReader(); 25 | 26 | std::vector getCameraMatrices(); 27 | 28 | std::vector getCameraExtrinsics(); 29 | 30 | std::vector getCameraIntrinsics(); 31 | 32 | std::string getNextFrameName(); 33 | 34 | bool isOpened() const; 35 | 36 | void release(); 37 | 38 | double get(const int capProperty); 39 | 40 | void set(const int capProperty, const double value); 41 | 42 | private: 43 | SpinnakerWrapper mSpinnakerWrapper; 44 | Point mResolution; 45 | long long mFrameNameCounter; 46 | 47 | cv::Mat getRawFrame(); 48 | 49 | std::vector getRawFrames(); 50 | 51 | DELETE_COPY(FlirReader); 52 | }; 53 | } 54 | 55 | #endif // OPENPOSE_PRODUCER_FLIR_READER_HPP 56 | -------------------------------------------------------------------------------- /include/openpose/producer/headers.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_PRODUCER_HEADERS_HPP 2 | #define OPENPOSE_PRODUCER_HEADERS_HPP 3 | 4 | // producer module 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | #endif // OPENPOSE_PRODUCER_HEADERS_HPP 18 | -------------------------------------------------------------------------------- /include/openpose/producer/ipCameraReader.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_PRODUCER_IP_CAMERA_READER_HPP 2 | #define OPENPOSE_PRODUCER_IP_CAMERA_READER_HPP 3 | 4 | #include 5 | #include 6 | 7 | namespace op 8 | { 9 | /** 10 | * IpCameraReader is a wrapper of the cv::VideoCapture class for IP camera streaming. 11 | */ 12 | class OP_API IpCameraReader : public VideoCaptureReader 13 | { 14 | public: 15 | /** 16 | * Constructor of IpCameraReader. It opens the IP camera as a wrapper of cv::VideoCapture. 17 | * @param cameraPath const std::string parameter with the full camera IP link. 18 | */ 19 | explicit IpCameraReader(const std::string& cameraPath); 20 | 21 | std::vector getCameraMatrices(); 22 | 23 | std::vector getCameraExtrinsics(); 24 | 25 | std::vector getCameraIntrinsics(); 26 | 27 | std::string getNextFrameName(); 28 | 29 | inline double get(const int capProperty) 30 | { 31 | return VideoCaptureReader::get(capProperty); 32 | } 33 | 34 | inline void set(const int capProperty, const double value) 35 | { 36 | VideoCaptureReader::set(capProperty, value); 37 | } 38 | 39 | private: 40 | const std::string mPathName; 41 | 42 | cv::Mat getRawFrame(); 43 | 44 | std::vector getRawFrames(); 45 | 46 | DELETE_COPY(IpCameraReader); 47 | }; 48 | } 49 | 50 | #endif // OPENPOSE_PRODUCER_IP_CAMERA_READER_HPP 51 | -------------------------------------------------------------------------------- /include/openpose/producer/spinnakerWrapper.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_PRODUCER_SPINNAKER_WRAPPER_HPP 2 | #define OPENPOSE_PRODUCER_SPINNAKER_WRAPPER_HPP 3 | 4 | #include 5 | 6 | namespace op 7 | { 8 | /** 9 | * SpinnakerWrapper is a subclass of SpinnakerWrapper. It decouples the final interface (meant to imitates 10 | * cv::VideoCapture) from the Spinnaker SDK wrapper. 11 | */ 12 | class OP_API SpinnakerWrapper 13 | { 14 | public: 15 | /** 16 | * Constructor of SpinnakerWrapper. It opens all the available FLIR cameras 17 | * cameraIndex = -1 means that all cameras are taken 18 | */ 19 | explicit SpinnakerWrapper(const std::string& cameraParameterPath, const Point& cameraResolution, 20 | const bool undistortImage, const int cameraIndex = -1); 21 | 22 | ~SpinnakerWrapper(); 23 | 24 | std::vector getRawFrames(); 25 | 26 | std::vector getCameraMatrices() const; 27 | 28 | std::vector getCameraExtrinsics() const; 29 | 30 | std::vector getCameraIntrinsics() const; 31 | 32 | Point getResolution() const; 33 | 34 | bool isOpened() const; 35 | 36 | void release(); 37 | 38 | private: 39 | // PIMPL idiom 40 | // http://www.cppsamples.com/common-tasks/pimpl.html 41 | struct ImplSpinnakerWrapper; 42 | std::shared_ptr upImpl; 43 | 44 | DELETE_COPY(SpinnakerWrapper); 45 | }; 46 | } 47 | 48 | #endif // OPENPOSE_PRODUCER_SPINNAKER_WRAPPER_HPP 49 | -------------------------------------------------------------------------------- /include/openpose/thread/enumClasses.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_THREAD_ENUM_CLASSES_HPP 2 | #define OPENPOSE_THREAD_ENUM_CLASSES_HPP 3 | 4 | namespace op 5 | { 6 | /** 7 | * ThreadManager synchronization mode. 8 | */ 9 | enum class ThreadManagerMode : unsigned char 10 | { 11 | /** 12 | * First and last queues of ThreadManager will be given to the user, so he must push elements to the first queue and retrieve 13 | * them from the last one after being processed. 14 | * Recommended for prototyping environments (easier to test but more error-prone and potentially slower in performance). 15 | */ 16 | Asynchronous, 17 | AsynchronousIn, /**< Similar to Asynchronous, but only the input (first) queue is given to the user. */ 18 | AsynchronousOut, /**< Similar to Asynchronous, but only the output (last) queue is given to the user. */ 19 | /** 20 | * Everything will run inside the ThreadManager. 21 | * Recommended for production environments (more difficult to set up but faster in performance and less error-prone). 22 | */ 23 | Synchronous, 24 | }; 25 | } 26 | 27 | #endif // OPENPOSE_THREAD_ENUM_CLASSES_HPP 28 | -------------------------------------------------------------------------------- /include/openpose/thread/headers.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_THREAD_HEADERS_HPP 2 | #define OPENPOSE_THREAD_HEADERS_HPP 3 | 4 | // thread module 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | 23 | #endif // OPENPOSE_THREAD_HEADERS_HPP 24 | -------------------------------------------------------------------------------- /include/openpose/thread/subThreadNoQueue.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_THREAD_THREAD_NO_QUEUE_HPP 2 | #define OPENPOSE_THREAD_THREAD_NO_QUEUE_HPP 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | namespace op 9 | { 10 | template>> 11 | class SubThreadNoQueue : public SubThread 12 | { 13 | public: 14 | explicit SubThreadNoQueue(const std::vector& tWorkers); 15 | 16 | bool work(); 17 | 18 | DELETE_COPY(SubThreadNoQueue); 19 | }; 20 | } 21 | 22 | 23 | 24 | 25 | 26 | // Implementation 27 | namespace op 28 | { 29 | template 30 | SubThreadNoQueue::SubThreadNoQueue(const std::vector& tWorkers) : 31 | SubThread{tWorkers} 32 | {} 33 | 34 | template 35 | bool SubThreadNoQueue::work() 36 | { 37 | try 38 | { 39 | TDatums tDatums; 40 | return this->workTWorkers(tDatums, true); 41 | } 42 | catch (const std::exception& e) 43 | { 44 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 45 | return false; 46 | } 47 | } 48 | 49 | COMPILE_TEMPLATE_DATUM(SubThreadNoQueue); 50 | } 51 | 52 | #endif // OPENPOSE_THREAD_THREAD_NO_QUEUE_HPP 53 | -------------------------------------------------------------------------------- /include/openpose/thread/worker.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_THREAD_WORKER_HPP 2 | #define OPENPOSE_THREAD_WORKER_HPP 3 | 4 | #include 5 | 6 | namespace op 7 | { 8 | template 9 | class Worker 10 | { 11 | public: 12 | Worker(); 13 | 14 | virtual ~Worker(); 15 | 16 | virtual void initializationOnThread() = 0; 17 | 18 | bool checkAndWork(TDatums& tDatums); 19 | 20 | inline bool isRunning() const 21 | { 22 | return mIsRunning; 23 | } 24 | 25 | inline void stop() 26 | { 27 | mIsRunning = false; 28 | } 29 | 30 | // Virtual in case some function needs spetial stopping (e.g. buffers might not stop inmediately and need a few iterations) 31 | inline virtual void tryStop() 32 | { 33 | stop(); 34 | } 35 | 36 | protected: 37 | virtual void work(TDatums& tDatums) = 0; 38 | 39 | private: 40 | bool mIsRunning; 41 | 42 | DELETE_COPY(Worker); 43 | }; 44 | } 45 | 46 | 47 | 48 | 49 | 50 | // Implementation 51 | namespace op 52 | { 53 | template 54 | Worker::Worker() : 55 | mIsRunning{true} 56 | { 57 | } 58 | 59 | template 60 | Worker::~Worker() 61 | { 62 | } 63 | 64 | template 65 | bool Worker::checkAndWork(TDatums& tDatums) 66 | { 67 | if (mIsRunning) 68 | work(tDatums); 69 | return mIsRunning; 70 | } 71 | 72 | COMPILE_TEMPLATE_DATUM(Worker); 73 | } 74 | 75 | #endif // OPENPOSE_THREAD_WORKER_HPP 76 | -------------------------------------------------------------------------------- /include/openpose/thread/workerConsumer.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_THREAD_WORKER_CONSUMER_HPP 2 | #define OPENPOSE_THREAD_WORKER_CONSUMER_HPP 3 | 4 | #include 5 | #include 6 | 7 | namespace op 8 | { 9 | template 10 | class WorkerConsumer : public Worker 11 | { 12 | public: 13 | virtual ~WorkerConsumer(); 14 | 15 | inline void work(TDatums& tDatums) 16 | { 17 | workConsumer(tDatums); 18 | } 19 | 20 | protected: 21 | virtual void workConsumer(const TDatums& tDatums) = 0; 22 | }; 23 | } 24 | 25 | 26 | 27 | 28 | 29 | // Implementation 30 | namespace op 31 | { 32 | template 33 | WorkerConsumer::~WorkerConsumer() 34 | { 35 | } 36 | 37 | COMPILE_TEMPLATE_DATUM(WorkerConsumer); 38 | } 39 | 40 | #endif // OPENPOSE_THREAD_WORKER_CONSUMER_HPP 41 | -------------------------------------------------------------------------------- /include/openpose/thread/workerProducer.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_THREAD_WORKER_PRODUCER_HPP 2 | #define OPENPOSE_THREAD_WORKER_PRODUCER_HPP 3 | 4 | #include 5 | #include 6 | 7 | namespace op 8 | { 9 | template 10 | class WorkerProducer : public Worker 11 | { 12 | public: 13 | virtual ~WorkerProducer(); 14 | 15 | inline void work(TDatums& tDatums) 16 | { 17 | tDatums = std::move(workProducer()); 18 | } 19 | 20 | protected: 21 | virtual TDatums workProducer() = 0; 22 | }; 23 | } 24 | 25 | 26 | 27 | 28 | 29 | // Implementation 30 | namespace op 31 | { 32 | template 33 | WorkerProducer::~WorkerProducer() 34 | { 35 | } 36 | 37 | COMPILE_TEMPLATE_DATUM(WorkerProducer); 38 | } 39 | 40 | #endif // OPENPOSE_THREAD_WORKER_PRODUCER_HPP 41 | -------------------------------------------------------------------------------- /include/openpose/tracking/headers.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_TRACKING_HEADERS_HPP 2 | #define OPENPOSE_TRACKING_HEADERS_HPP 3 | 4 | // tracking module 5 | #include 6 | #include 7 | #include 8 | 9 | #endif // OPENPOSE_TRACKING_HEADERS_HPP 10 | -------------------------------------------------------------------------------- /include/openpose/tracking/pyramidalLK.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_TRACKING_LKPYRAMIDAL_HPP 2 | #define OPENPOSE_TRACKING_LKPYRAMIDAL_HPP 3 | 4 | #include 5 | 6 | namespace op 7 | { 8 | OP_API void pyramidalLKCpu(std::vector& coordI, std::vector& coordJ, 9 | std::vector& pyramidImagesPrevious, 10 | std::vector& pyramidImagesCurrent, 11 | std::vector& status, const cv::Mat& imagePrevious, 12 | const cv::Mat& imageCurrent, const int levels = 3, const int patchSize = 21); 13 | OP_API int pyramidalLKGpu(std::vector& ptsI, std::vector& ptsJ, 14 | std::vector& status, const cv::Mat& imagePrevious, 15 | const cv::Mat& imageCurrent, const int levels = 3, const int patchSize = 21); 16 | OP_API void pyramidalLKOcv(std::vector& coordI, std::vector& coordJ, 17 | std::vector& pyramidImagesPrevious, 18 | std::vector& pyramidImagesCurrent, 19 | std::vector& status, const cv::Mat& imagePrevious, 20 | const cv::Mat& imageCurrent, const int levels = 3, const int patchSize = 21, 21 | const bool initFlow = false); 22 | } 23 | 24 | #endif // OPENPOSE_TRACKING_LKPYRAMIDAL_HPP 25 | -------------------------------------------------------------------------------- /include/openpose/utilities/enumClasses.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_UTILITIES_ENUM_CLASSES_HPP 2 | #define OPENPOSE_UTILITIES_ENUM_CLASSES_HPP 3 | 4 | namespace op 5 | { 6 | enum class ErrorMode : unsigned char 7 | { 8 | StdRuntimeError, 9 | FileLogging, 10 | StdCerr, 11 | All, 12 | }; 13 | 14 | enum class LogMode : unsigned char 15 | { 16 | FileLogging, 17 | StdCout, 18 | All, 19 | }; 20 | 21 | enum class Priority : unsigned char 22 | { 23 | None = 0, 24 | Low = 1, 25 | Normal = 2, 26 | High = 3, 27 | Max = 4, 28 | NoOutput = 255, 29 | }; 30 | } 31 | 32 | #endif // OPENPOSE_UTILITIES_ENUM_CLASSES_HPP 33 | -------------------------------------------------------------------------------- /include/openpose/utilities/headers.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_UTILITIES_HEADERS_HPP 2 | #define OPENPOSE_UTILITIES_HEADERS_HPP 3 | 4 | // utilities module 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | #endif // OPENPOSE_UTILITIES_HEADERS_HPP 19 | -------------------------------------------------------------------------------- /include/openpose/utilities/keypoint.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_UTILITIES_KEYPOINT_HPP 2 | #define OPENPOSE_UTILITIES_KEYPOINT_HPP 3 | 4 | #include 5 | 6 | namespace op 7 | { 8 | OP_API float getDistance(const Array& keypoints, const int person, const int elementA, const int elementB); 9 | 10 | OP_API void averageKeypoints(Array& keypointsA, const Array& keypointsB, const int personA); 11 | 12 | OP_API void scaleKeypoints(Array& keypoints, const float scale); 13 | 14 | OP_API void scaleKeypoints2d(Array& keypoints, const float scaleX, const float scaleY); 15 | 16 | OP_API void scaleKeypoints2d(Array& keypoints, const float scaleX, const float scaleY, const float offsetX, 17 | const float offsetY); 18 | 19 | OP_API void renderKeypointsCpu(Array& frameArray, const Array& keypoints, 20 | const std::vector& pairs, const std::vector colors, 21 | const float thicknessCircleRatio, const float thicknessLineRatioWRTCircle, 22 | const std::vector& poseScales, const float threshold); 23 | 24 | OP_API Rectangle getKeypointsRectangle(const Array& keypoints, const int person, 25 | const float threshold); 26 | 27 | OP_API float getAverageScore(const Array& keypoints, const int person); 28 | 29 | OP_API float getKeypointsArea(const Array& keypoints, const int person, const float threshold); 30 | 31 | OP_API int getBiggestPerson(const Array& keypoints, const float threshold); 32 | } 33 | 34 | #endif // OPENPOSE_UTILITIES_KEYPOINT_HPP 35 | -------------------------------------------------------------------------------- /include/openpose/utilities/openCv.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_UTILITIES_OPEN_CV_HPP 2 | #define OPENPOSE_UTILITIES_OPEN_CV_HPP 3 | 4 | #include // cv::Mat 5 | #include // cv::warpAffine, cv::BORDER_CONSTANT 6 | #include 7 | 8 | namespace op 9 | { 10 | OP_API void putTextOnCvMat(cv::Mat& cvMat, const std::string& textToDisplay, const Point& position, 11 | const cv::Scalar& color, const bool normalizeWidth, const int imageWidth); 12 | 13 | OP_API void unrollArrayToUCharCvMat(cv::Mat& cvMatResult, const Array& array); 14 | 15 | OP_API void uCharCvMatToFloatPtr(float* floatPtrImage, const cv::Mat& cvImage, const int normalize); 16 | 17 | OP_API double resizeGetScaleFactor(const Point& initialSize, const Point& targetSize); 18 | 19 | OP_API cv::Mat resizeFixedAspectRatio(const cv::Mat& cvMat, const double scaleFactor, const Point& targetSize, 20 | const int borderMode = cv::BORDER_CONSTANT, 21 | const cv::Scalar& borderValue = cv::Scalar{0,0,0}); 22 | } 23 | 24 | #endif // OPENPOSE_UTILITIES_OPEN_CV_HPP 25 | -------------------------------------------------------------------------------- /include/openpose/utilities/pointerContainer.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_UTILITIES_POINTER_CONTAINER_HPP 2 | #define OPENPOSE_UTILITIES_POINTER_CONTAINER_HPP 3 | 4 | namespace op 5 | { 6 | template 7 | inline bool checkNoNullNorEmpty(const TPointerContainer& tPointerContainer) 8 | { 9 | return (tPointerContainer != nullptr && tPointerContainer->size() > 0); 10 | } 11 | 12 | template 13 | class PointerContainerGreater 14 | { 15 | public: 16 | bool operator() (TDatums& a, TDatums& b) 17 | { 18 | if (!b || b->empty()) 19 | return true; 20 | else if (!a || a->empty()) 21 | return false; 22 | else 23 | return (*a)[0] > (*b)[0]; 24 | } 25 | }; 26 | 27 | template 28 | class PointerContainerLess 29 | { 30 | public: 31 | bool operator() (TDatums& a, TDatums& b) 32 | { 33 | if (!b || b->empty()) 34 | return false; 35 | else if (!a || a->empty()) 36 | return true; 37 | else 38 | return (*a)[0] < (*b)[0]; 39 | } 40 | }; 41 | } 42 | 43 | #endif // OPENPOSE_UTILITIES_POINTER_CONTAINER_HPP 44 | -------------------------------------------------------------------------------- /include/openpose/utilities/string.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_UTILITIES_STRING_HPP 2 | #define OPENPOSE_UTILITIES_STRING_HPP 3 | 4 | #include 5 | 6 | namespace op 7 | { 8 | OP_API unsigned long long getLastNumber(const std::string& string); 9 | 10 | /** 11 | * This template function turns an integer number into a fixed-length std::string. 12 | * @param number T integer corresponding to the integer to be formatted. 13 | * @param stringLength unsigned long long indicating the final length. If 0, the 14 | * final length is the original number length. 15 | * @return std::string with the formatted value. 16 | */ 17 | template 18 | OP_API std::string toFixedLengthString(const T number, const unsigned long long stringLength = 0); 19 | 20 | OP_API std::vector splitString(const std::string& stringToSplit, const std::string& delimiter); 21 | 22 | OP_API std::string toLower(const std::string& string); 23 | 24 | OP_API std::string toUpper(const std::string& string); 25 | } 26 | 27 | #endif // OPENPOSE_UTILITIES_STRING_HPP 28 | -------------------------------------------------------------------------------- /include/openpose/wrapper/headers.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_WRAPPER_HEADERS_HPP 2 | #define OPENPOSE_WRAPPER_HEADERS_HPP 3 | 4 | // wrapper module 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | #endif // OPENPOSE_WRAPPER_HEADERS_HPP 14 | -------------------------------------------------------------------------------- /include/openpose/wrapper/wrapperAuxiliary.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OPENPOSE_WRAPPER_WRAPPER_AUXILIARY_HPP 2 | #define OPENPOSE_WRAPPER_WRAPPER_AUXILIARY_HPP 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | namespace op 12 | { 13 | /** 14 | * It checks that no wrong/contradictory flags are enabled for Wrapper 15 | * @param wrapperStructPose 16 | * @param wrapperStructFace 17 | * @param wrapperStructHand 18 | * @param wrapperStructExtra 19 | * @param wrapperStructInput 20 | * @param wrapperStructOutput 21 | * @param renderOutput 22 | * @param userOutputWsEmpty 23 | * @param threadManagerMode 24 | */ 25 | OP_API void wrapperConfigureSecurityChecks(WrapperStructPose& wrapperStructPose, 26 | const WrapperStructFace& wrapperStructFace, 27 | const WrapperStructHand& wrapperStructHand, 28 | const WrapperStructExtra& wrapperStructExtra, 29 | const WrapperStructInput& wrapperStructInput, 30 | const WrapperStructOutput& wrapperStructOutput, 31 | const bool renderOutput, 32 | const bool userOutputWsEmpty, 33 | const ThreadManagerMode threadManagerMode); 34 | } 35 | 36 | #endif // OPENPOSE_WRAPPER_WRAPPER_AUXILIARY_HPP 37 | -------------------------------------------------------------------------------- /models/cameraParameters/flir/17012332.xml.example: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 3 6 | 4 7 |
d
8 | 9 | 1. 0. 0. 0. 10 | 0. 1. 0. 0. 11 | 0. 0. 1. 0.
12 | 13 | 3 14 | 3 15 |
d
16 | 17 | 8.1793481631740565e+02 0. 6.0070689997785121e+02 0. 18 | 8.1651774059837908e+02 5.1784529566329593e+02 0. 0. 1.
19 | 20 | 8 21 | 1 22 |
d
23 | 24 | -1.8102158829399091e+00 9.1966147162623262e+00 25 | -4.4293900343777355e-04 1.3638377686816653e-03 26 | 1.3303863414979364e+00 -1.4189051636354870e+00 27 | 8.4725535468475819e+00 4.7911023525901033e+00
28 |
29 | -------------------------------------------------------------------------------- /models/getModels.bat: -------------------------------------------------------------------------------- 1 | :: Avoid printing all the comments in the Windows cmd 2 | @echo off 3 | 4 | echo ------------------------- BODY, FACE AND HAND MODELS ------------------------- 5 | echo ----- Downloading body pose (COCO and MPI), face and hand models ----- 6 | SET WGET_EXE=..\3rdparty\windows\wget\wget.exe 7 | SET OPENPOSE_URL=http://posefs1.perception.cs.cmu.edu/OpenPose/models/ 8 | SET POSE_FOLDER=pose/ 9 | SET FACE_FOLDER=face/ 10 | SET HAND_FOLDER=hand/ 11 | 12 | echo: 13 | echo ------------------------- POSE MODELS ------------------------- 14 | echo Body (COCO) 15 | SET COCO_FOLDER=%POSE_FOLDER%coco/ 16 | SET COCO_MODEL=%COCO_FOLDER%pose_iter_440000.caffemodel 17 | %WGET_EXE% -c http://posefs1.perception.cs.cmu.edu/OpenPose/models/%COCO_MODEL% -P %COCO_FOLDER% 18 | 19 | echo: 20 | echo Body (MPI) 21 | SET MPI_FOLDER=%POSE_FOLDER%mpi/ 22 | SET MPI_MODEL=%MPI_FOLDER%pose_iter_160000.caffemodel 23 | %WGET_EXE% -c http://posefs1.perception.cs.cmu.edu/OpenPose/models/%MPI_MODEL% -P %MPI_FOLDER% 24 | echo ----------------------- POSE DOWNLOADED ----------------------- 25 | 26 | echo: 27 | echo ------------------------- FACE MODELS ------------------------- 28 | echo Face 29 | SET FACE_MODEL=%FACE_FOLDER%pose_iter_116000.caffemodel 30 | %WGET_EXE% -c http://posefs1.perception.cs.cmu.edu/OpenPose/models/%FACE_MODEL% -P %FACE_FOLDER% 31 | echo ----------------------- FACE DOWNLOADED ----------------------- 32 | 33 | echo: 34 | echo ------------------------- HAND MODELS ------------------------- 35 | echo Hand 36 | SET HAND_MODEL=%HAND_FOLDER%pose_iter_102000.caffemodel 37 | %WGET_EXE% -c http://posefs1.perception.cs.cmu.edu/OpenPose/models/%HAND_MODEL% -P %HAND_FOLDER% 38 | echo ----------------------- HAND DOWNLOADED ----------------------- 39 | -------------------------------------------------------------------------------- /models/getModels.sh: -------------------------------------------------------------------------------- 1 | # ------------------------- BODY, FACE AND HAND MODELS ------------------------- 2 | # Downloading body pose (COCO and MPI), face and hand models 3 | OPENPOSE_URL="http://posefs1.perception.cs.cmu.edu/OpenPose/models/" 4 | POSE_FOLDER="pose/" 5 | FACE_FOLDER="face/" 6 | HAND_FOLDER="hand/" 7 | 8 | # ------------------------- POSE MODELS ------------------------- 9 | # Body (BODY_25) 10 | BODY_25_FOLDER=${POSE_FOLDER}"body_25/" 11 | BODY_25_MODEL=${BODY_25_FOLDER}"pose_iter_584000.caffemodel" 12 | wget -c ${OPENPOSE_URL}${BODY_25_MODEL} -P ${BODY_25_FOLDER} 13 | 14 | # Body (COCO) 15 | COCO_FOLDER=${POSE_FOLDER}"coco/" 16 | COCO_MODEL=${COCO_FOLDER}"pose_iter_440000.caffemodel" 17 | wget -c ${OPENPOSE_URL}${COCO_MODEL} -P ${COCO_FOLDER} 18 | # Alternative: it will not check whether file was fully downloaded 19 | # if [ ! -f $COCO_MODEL ]; then 20 | # wget ${OPENPOSE_URL}$COCO_MODEL -P $COCO_FOLDER 21 | # fi 22 | 23 | # Body (MPI) 24 | MPI_FOLDER=${POSE_FOLDER}"mpi/" 25 | MPI_MODEL=${MPI_FOLDER}"pose_iter_160000.caffemodel" 26 | wget -c ${OPENPOSE_URL}${MPI_MODEL} -P ${MPI_FOLDER} 27 | 28 | # "------------------------- FACE MODELS -------------------------" 29 | # Face 30 | FACE_MODEL=${FACE_FOLDER}"pose_iter_116000.caffemodel" 31 | wget -c ${OPENPOSE_URL}${FACE_MODEL} -P ${FACE_FOLDER} 32 | 33 | # "------------------------- HAND MODELS -------------------------" 34 | # Hand 35 | HAND_MODEL=$HAND_FOLDER"pose_iter_102000.caffemodel" 36 | wget -c ${OPENPOSE_URL}${HAND_MODEL} -P ${HAND_FOLDER} 37 | -------------------------------------------------------------------------------- /python/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_subdirectory(openpose) 2 | 3 | -------------------------------------------------------------------------------- /python/openpose/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(PYTHON_FILES 2 | openpose.py 3 | __init__.py 4 | _openpose.cpp) 5 | 6 | add_library(_openpose SHARED ${PYTHON_FILES}) 7 | target_link_libraries(_openpose openpose ${OpenPose_3rdparty_libraries}) 8 | SET_TARGET_PROPERTIES(_openpose PROPERTIES PREFIX "") 9 | configure_file(openpose.py openpose.py) 10 | configure_file(__init__.py __init__.py) 11 | 12 | #install(TARGETS _openpose DESTINATION python) 13 | install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/ DESTINATION python/openpose FILES_MATCHING PATTERN "*.so") 14 | install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/ DESTINATION python/openpose FILES_MATCHING PATTERN "*.py") -------------------------------------------------------------------------------- /python/openpose/__init__.py: -------------------------------------------------------------------------------- 1 | from openpose import * 2 | -------------------------------------------------------------------------------- /src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_subdirectory(openpose) -------------------------------------------------------------------------------- /src/openpose/3d/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(SOURCES_OP_3D 2 | cameraParameterReader.cpp 3 | defineTemplates.cpp 4 | jointAngleEstimation.cpp 5 | poseTriangulation.cpp) 6 | 7 | include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake) 8 | prepend(SOURCES_OP_3D_WITH_CP ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCES_OP_3D}) 9 | set(SOURCES_OP_3D_WITH_CP ${SOURCES_OP_3D_WITH_CP} PARENT_SCOPE) 10 | set(SOURCES_OPENPOSE ${SOURCES_OPENPOSE} ${SOURCES_OP_3D_WITH_CP} PARENT_SCOPE) 11 | 12 | if (UNIX OR APPLE) 13 | if (${GPU_MODE} MATCHES "CUDA") 14 | cuda_add_library(openpose_3d ${SOURCES_OP_3D}) 15 | else () 16 | add_library(openpose_3d ${SOURCES_OP_3D}) 17 | endif () 18 | 19 | add_library(caffe SHARED IMPORTED) 20 | set_property(TARGET caffe PROPERTY IMPORTED_LOCATION ${Caffe_LIBS}) 21 | target_link_libraries(openpose_3d caffe openpose_core ${MKL_LIBS}) 22 | 23 | if (BUILD_CAFFE) 24 | add_dependencies(openpose_3d openpose_caffe) 25 | endif (BUILD_CAFFE) 26 | 27 | install(TARGETS openpose_3d 28 | EXPORT OpenPose 29 | RUNTIME DESTINATION bin 30 | LIBRARY DESTINATION lib 31 | ARCHIVE DESTINATION lib/openpose) 32 | endif (UNIX OR APPLE) 33 | -------------------------------------------------------------------------------- /src/openpose/3d/defineTemplates.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | namespace op 4 | { 5 | #ifdef USE_3D_ADAM_MODEL 6 | DEFINE_TEMPLATE_DATUM(WJointAngleEstimation); 7 | #endif 8 | DEFINE_TEMPLATE_DATUM(WPoseTriangulation); 9 | } 10 | -------------------------------------------------------------------------------- /src/openpose/calibration/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP;cl) 2 | set(SOURCES_OP_CALIBRATION 3 | cameraParameterEstimation.cpp 4 | gridPatternFunctions.cpp) 5 | 6 | include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake) 7 | prepend(SOURCES_OP_CALIBRATION_WITH_CP ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCES_OP_CALIBRATION}) 8 | set(SOURCES_OP_CALIBRATION_WITH_CP ${SOURCES_OP_CALIBRATION_WITH_CP} PARENT_SCOPE) 9 | set(SOURCES_OPENPOSE ${SOURCES_OPENPOSE} ${SOURCES_OP_CALIBRATION_WITH_CP} PARENT_SCOPE) 10 | 11 | if (UNIX OR APPLE) 12 | if (${GPU_MODE} MATCHES "CUDA") 13 | cuda_add_library(openpose_calibration ${SOURCES_OP_CALIBRATION}) 14 | else () 15 | add_library(openpose_calibration ${SOURCES_OP_CALIBRATION}) 16 | endif () 17 | 18 | target_link_libraries(openpose_calibration openpose_core) 19 | 20 | if (BUILD_CAFFE) 21 | add_dependencies(openpose_calibration openpose_caffe) 22 | endif (BUILD_CAFFE) 23 | 24 | install(TARGETS openpose_calibration 25 | EXPORT OpenPose 26 | RUNTIME DESTINATION bin 27 | LIBRARY DESTINATION lib 28 | ARCHIVE DESTINATION lib/openpose) 29 | endif (UNIX OR APPLE) 30 | -------------------------------------------------------------------------------- /src/openpose/core/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP;cl) 2 | set(SOURCES_OP_CORE 3 | array.cpp 4 | cvMatToOpInput.cpp 5 | cvMatToOpOutput.cpp 6 | datum.cpp 7 | defineTemplates.cpp 8 | gpuRenderer.cpp 9 | keepTopNPeople.cpp 10 | keypointScaler.cpp 11 | opOutputToCvMat.cpp 12 | point.cpp 13 | rectangle.cpp 14 | renderer.cpp 15 | scaleAndSizeExtractor.cpp) 16 | 17 | include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake) 18 | prepend(SOURCES_OP_CORE_WITH_CP ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCES_OP_CORE}) 19 | set(SOURCES_OP_CORE_WITH_CP ${SOURCES_OP_CORE_WITH_CP} PARENT_SCOPE) 20 | set(SOURCES_OPENPOSE ${SOURCES_OPENPOSE} ${SOURCES_OP_CORE_WITH_CP} PARENT_SCOPE) 21 | 22 | if (UNIX OR APPLE) 23 | if (${GPU_MODE} MATCHES "CUDA") 24 | cuda_add_library(openpose_core ${SOURCES_OP_CORE}) 25 | else () 26 | add_library(openpose_core ${SOURCES_OP_CORE}) 27 | endif () 28 | 29 | if (APPLE) 30 | target_link_libraries(openpose_core openpose caffe ${OpenCV_LIBS} ${Caffe_LIBS} ${GLUT_LIBRARY} ${SPINNAKER_LIB} ${OpenCL_LIBRARIES} 31 | ${GLOG_LIBRARY} ${OpenCV_LIBS} ${Caffe_LIBS} ${GFLAGS_LIBRARY} ${GLOG_LIBRARY} ${MKL_LIBS} ${GLUT_LIBRARY} ${SPINNAKER_LIB}) 32 | add_library(caffe SHARED IMPORTED) 33 | set_property(TARGET caffe PROPERTY IMPORTED_LOCATION ${Caffe_LIBS}) 34 | endif (APPLE) 35 | 36 | if (BUILD_CAFFE) 37 | add_dependencies(openpose_core openpose_caffe) 38 | endif (BUILD_CAFFE) 39 | 40 | install(TARGETS openpose_core 41 | EXPORT OpenPose 42 | RUNTIME DESTINATION bin 43 | LIBRARY DESTINATION lib 44 | ARCHIVE DESTINATION lib/openpose) 45 | endif (UNIX OR APPLE) 46 | -------------------------------------------------------------------------------- /src/openpose/core/cvMatToOpOutput.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | namespace op 5 | { 6 | Array CvMatToOpOutput::createArray(const cv::Mat& cvInputData, const double scaleInputToOutput, 7 | const Point& outputResolution) const 8 | { 9 | try 10 | { 11 | // Security checks 12 | if (cvInputData.empty()) 13 | error("Wrong input element (empty cvInputData).", __LINE__, __FUNCTION__, __FILE__); 14 | if (cvInputData.channels() != 3) 15 | error("Input images must be 3-channel BGR.", __LINE__, __FUNCTION__, __FILE__); 16 | if (cvInputData.cols <= 0 || cvInputData.rows <= 0) 17 | error("Input images has 0 area.", __LINE__, __FUNCTION__, __FILE__); 18 | if (outputResolution.x <= 0 || outputResolution.y <= 0) 19 | error("Output resolution has 0 area.", __LINE__, __FUNCTION__, __FILE__); 20 | // outputData - Reescale keeping aspect ratio and transform to float the output image 21 | const cv::Mat frameWithOutputSize = resizeFixedAspectRatio(cvInputData, scaleInputToOutput, 22 | outputResolution); 23 | Array outputData({outputResolution.y, outputResolution.x, 3}); 24 | frameWithOutputSize.convertTo(outputData.getCvMat(), CV_32FC3); 25 | // Return result 26 | return outputData; 27 | } 28 | catch (const std::exception& e) 29 | { 30 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 31 | return Array{}; 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/openpose/core/defineTemplates.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | namespace op 4 | { 5 | DEFINE_TEMPLATE_DATUM(WCvMatToOpInput); 6 | DEFINE_TEMPLATE_DATUM(WCvMatToOpOutput); 7 | DEFINE_TEMPLATE_DATUM(WKeepTopNPeople); 8 | DEFINE_TEMPLATE_DATUM(WKeypointScaler); 9 | DEFINE_TEMPLATE_DATUM(WOpOutputToCvMat); 10 | DEFINE_TEMPLATE_DATUM(WScaleAndSizeExtractor); 11 | } 12 | -------------------------------------------------------------------------------- /src/openpose/core/opOutputToCvMat.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | namespace op 5 | { 6 | cv::Mat OpOutputToCvMat::formatToCvMat(const Array& outputData) const 7 | { 8 | try 9 | { 10 | // Security checks 11 | if (outputData.empty()) 12 | error("Wrong input element (empty outputData).", __LINE__, __FUNCTION__, __FILE__); 13 | // outputData to cvMat 14 | cv::Mat cvMat; 15 | outputData.getConstCvMat().convertTo(cvMat, CV_8UC3); 16 | // Return cvMat 17 | return cvMat; 18 | } 19 | catch (const std::exception& e) 20 | { 21 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 22 | return cv::Mat(); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/openpose/face/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(SOURCES_OP_FACE 2 | defineTemplates.cpp 3 | faceDetector.cpp 4 | faceDetectorOpenCV.cpp 5 | faceExtractorCaffe.cpp 6 | faceExtractorNet.cpp 7 | faceCpuRenderer.cpp 8 | faceGpuRenderer.cpp 9 | faceRenderer.cpp 10 | renderFace.cpp 11 | renderFace.cu) 12 | 13 | include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake) 14 | prepend(SOURCES_OP_FACE_WITH_CP ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCES_OP_FACE}) 15 | set(SOURCES_OP_FACE_WITH_CP ${SOURCES_OP_FACE_WITH_CP} PARENT_SCOPE) 16 | set(SOURCES_OPENPOSE ${SOURCES_OPENPOSE} ${SOURCES_OP_FACE_WITH_CP} PARENT_SCOPE) 17 | 18 | if (UNIX OR APPLE) 19 | if (${GPU_MODE} MATCHES "CUDA") 20 | cuda_add_library(openpose_face ${SOURCES_OP_FACE}) 21 | else () 22 | add_library(openpose_face ${SOURCES_OP_FACE}) 23 | endif () 24 | 25 | target_link_libraries(openpose_face openpose_core) 26 | 27 | if (BUILD_CAFFE) 28 | add_dependencies(openpose_face openpose_caffe) 29 | endif (BUILD_CAFFE) 30 | 31 | install(TARGETS openpose_face 32 | EXPORT OpenPose 33 | RUNTIME DESTINATION bin 34 | LIBRARY DESTINATION lib 35 | ARCHIVE DESTINATION lib/openpose) 36 | endif (UNIX OR APPLE) 37 | -------------------------------------------------------------------------------- /src/openpose/face/defineTemplates.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | namespace op 4 | { 5 | DEFINE_TEMPLATE_DATUM(WFaceDetector); 6 | DEFINE_TEMPLATE_DATUM(WFaceExtractorNet); 7 | DEFINE_TEMPLATE_DATUM(WFaceRenderer); 8 | DEFINE_TEMPLATE_DATUM(WFaceDetectorOpenCV); 9 | } 10 | -------------------------------------------------------------------------------- /src/openpose/face/faceCpuRenderer.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | namespace op 5 | { 6 | FaceCpuRenderer::FaceCpuRenderer(const float renderThreshold, const float alphaKeypoint, 7 | const float alphaHeatMap) : 8 | Renderer{renderThreshold, alphaKeypoint, alphaHeatMap} 9 | { 10 | } 11 | 12 | void FaceCpuRenderer::renderFaceInherited(Array& outputData, const Array& faceKeypoints) 13 | { 14 | try 15 | { 16 | // CPU rendering 17 | renderFaceKeypointsCpu(outputData, faceKeypoints, mRenderThreshold); 18 | } 19 | catch (const std::exception& e) 20 | { 21 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/openpose/face/faceRenderer.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | namespace op 6 | { 7 | void FaceRenderer::renderFace(Array& outputData, const Array& faceKeypoints, 8 | const float scaleInputToOutput) 9 | { 10 | try 11 | { 12 | // Security checks 13 | if (outputData.empty()) 14 | error("Empty Array outputData.", __LINE__, __FUNCTION__, __FILE__); 15 | // Rescale keypoints to output size 16 | auto faceKeypointsRescaled = faceKeypoints.clone(); 17 | scaleKeypoints(faceKeypointsRescaled, scaleInputToOutput); 18 | // CPU/GPU rendering 19 | renderFaceInherited(outputData, faceKeypointsRescaled); 20 | } 21 | catch (const std::exception& e) 22 | { 23 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/openpose/face/renderFace.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | namespace op 7 | { 8 | void renderFaceKeypointsCpu(Array& frameArray, const Array& faceKeypoints, 9 | const float renderThreshold) 10 | { 11 | try 12 | { 13 | if (!frameArray.empty()) 14 | { 15 | // Parameters 16 | const auto thicknessCircleRatio = 1.f/75.f; 17 | const auto thicknessLineRatioWRTCircle = 0.334f; 18 | const auto& pairs = FACE_PAIRS_RENDER; 19 | const auto& scales = FACE_SCALES_RENDER; 20 | 21 | // Render keypoints 22 | renderKeypointsCpu(frameArray, faceKeypoints, pairs, FACE_COLORS_RENDER, thicknessCircleRatio, 23 | thicknessLineRatioWRTCircle, scales, renderThreshold); 24 | } 25 | } 26 | catch (const std::exception& e) 27 | { 28 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/openpose/filestream/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(SOURCES_OP_FILESTREAM bvhSaver.cpp 2 | cocoJsonSaver.cpp 3 | defineTemplates.cpp 4 | fileSaver.cpp 5 | fileStream.cpp 6 | heatMapSaver.cpp 7 | imageSaver.cpp 8 | jsonOfstream.cpp 9 | keypointSaver.cpp 10 | peopleJsonSaver.cpp 11 | udpSender.cpp 12 | videoSaver.cpp) 13 | 14 | include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake) 15 | prepend(SOURCES_OP_FILESTREAM_WITH_CP ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCES_OP_FILESTREAM}) 16 | set(SOURCES_OP_FILESTREAM_WITH_CP ${SOURCES_OP_FILESTREAM_WITH_CP} PARENT_SCOPE) 17 | set(SOURCES_OPENPOSE ${SOURCES_OPENPOSE} ${SOURCES_OP_FILESTREAM_WITH_CP} PARENT_SCOPE) 18 | 19 | if (UNIX OR APPLE) 20 | add_library(openpose_filestream ${SOURCES_OP_FILESTREAM}) 21 | 22 | target_link_libraries(openpose_filestream openpose_core) 23 | 24 | install(TARGETS openpose_filestream 25 | EXPORT OpenPose 26 | RUNTIME DESTINATION bin 27 | LIBRARY DESTINATION lib 28 | ARCHIVE DESTINATION lib/openpose) 29 | endif (UNIX OR APPLE) 30 | -------------------------------------------------------------------------------- /src/openpose/filestream/defineTemplates.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | namespace op 4 | { 5 | #ifdef USE_3D_ADAM_MODEL 6 | DEFINE_TEMPLATE_DATUM(WBvhSaver); 7 | #endif 8 | DEFINE_TEMPLATE_DATUM(WCocoJsonSaver); 9 | DEFINE_TEMPLATE_DATUM(WFaceSaver); 10 | DEFINE_TEMPLATE_DATUM(WHandSaver); 11 | DEFINE_TEMPLATE_DATUM(WHeatMapSaver); 12 | DEFINE_TEMPLATE_DATUM(WImageSaver); 13 | DEFINE_TEMPLATE_DATUM(WPeopleJsonSaver); 14 | DEFINE_TEMPLATE_DATUM(WPoseSaver); 15 | DEFINE_TEMPLATE_DATUM(WUdpSender); 16 | DEFINE_TEMPLATE_DATUM(WVideoSaver); 17 | } 18 | -------------------------------------------------------------------------------- /src/openpose/filestream/fileSaver.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | namespace op 5 | { 6 | FileSaver::FileSaver(const std::string& directoryPath) : 7 | mDirectoryPath{formatAsDirectory(directoryPath)} 8 | { 9 | try 10 | { 11 | makeDirectory(mDirectoryPath); 12 | } 13 | catch (const std::exception& e) 14 | { 15 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 16 | } 17 | } 18 | 19 | std::string FileSaver::getNextFileName(const unsigned long long index) const 20 | { 21 | try 22 | { 23 | const auto stringLength = 12u; 24 | return mDirectoryPath + toFixedLengthString(index, stringLength); 25 | } 26 | catch (const std::exception& e) 27 | { 28 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 29 | return ""; 30 | } 31 | } 32 | 33 | std::string FileSaver::getNextFileName(const std::string& fileName) const 34 | { 35 | try 36 | { 37 | return mDirectoryPath + fileName; 38 | } 39 | catch (const std::exception& e) 40 | { 41 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 42 | return ""; 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/openpose/filestream/imageSaver.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | namespace op 5 | { 6 | ImageSaver::ImageSaver(const std::string& directoryPath, const std::string& imageFormat) : 7 | FileSaver{directoryPath}, 8 | mImageFormat{imageFormat} 9 | { 10 | try 11 | { 12 | if (mImageFormat.empty()) 13 | error("The string imageFormat should not be empty.", __LINE__, __FUNCTION__, __FILE__); 14 | } 15 | catch (const std::exception& e) 16 | { 17 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 18 | } 19 | } 20 | 21 | void ImageSaver::saveImages(const std::vector& cvOutputDatas, const std::string& fileName) const 22 | { 23 | try 24 | { 25 | // Record cv::mat 26 | if (!cvOutputDatas.empty()) 27 | { 28 | // File path (no extension) 29 | const auto fileNameNoExtension = getNextFileName(fileName) + "_rendered"; 30 | 31 | // Get names for each image 32 | std::vector fileNames(cvOutputDatas.size()); 33 | for (auto i = 0u; i < fileNames.size(); i++) 34 | fileNames[i] = {fileNameNoExtension + (i != 0 ? "_" + std::to_string(i) : "") + "." + mImageFormat}; 35 | 36 | // Save each image 37 | for (auto i = 0u; i < cvOutputDatas.size(); i++) 38 | saveImage(cvOutputDatas[i], fileNames[i]); 39 | } 40 | } 41 | catch (const std::exception& e) 42 | { 43 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/openpose/filestream/keypointSaver.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | namespace op 5 | { 6 | KeypointSaver::KeypointSaver(const std::string& directoryPath, const DataFormat format) : 7 | FileSaver{directoryPath}, 8 | mFormat{format} 9 | { 10 | } 11 | 12 | void KeypointSaver::saveKeypoints(const std::vector>& keypointVector, const std::string& fileName, const std::string& keypointName) const 13 | { 14 | try 15 | { 16 | if (!keypointVector.empty()) 17 | { 18 | // File path (no extension) 19 | const auto fileNameNoExtension = getNextFileName(fileName) + "_" + keypointName; 20 | 21 | // Get vector of people poses 22 | std::vector cvMatPoses(keypointVector.size()); 23 | for (auto i = 0u; i < keypointVector.size(); i++) 24 | cvMatPoses[i] = keypointVector[i].getConstCvMat(); 25 | 26 | // Get names inside file 27 | std::vector keypointVectorNames(cvMatPoses.size()); 28 | for (auto i = 0u; i < cvMatPoses.size(); i++) 29 | keypointVectorNames[i] = {keypointName + "_" + std::to_string(i)}; 30 | 31 | // Record people poses in desired format 32 | saveData(cvMatPoses, keypointVectorNames, fileNameNoExtension, mFormat); 33 | } 34 | } 35 | catch (const std::exception& e) 36 | { 37 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/openpose/filestream/peopleJsonSaver.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | namespace op 5 | { 6 | PeopleJsonSaver::PeopleJsonSaver(const std::string& directoryPath) : 7 | FileSaver{directoryPath} 8 | { 9 | } 10 | 11 | void PeopleJsonSaver::save(const std::vector, std::string>>& keypointVector, 12 | const std::vector>>& candidates, 13 | const std::string& fileName, const bool humanReadable) const 14 | { 15 | try 16 | { 17 | // Record json 18 | const auto finalFileName = getNextFileName(fileName) + ".json"; 19 | savePeopleJson(keypointVector, candidates, finalFileName, humanReadable); 20 | } 21 | catch (const std::exception& e) 22 | { 23 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/openpose/gpu/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(SOURCES_OP_GPU 2 | cuda.cpp 3 | gpu.cpp 4 | opencl.cpp) 5 | 6 | include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake) 7 | prepend(SOURCES_OP_GPU_WITH_CP ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCES_OP_GPU}) 8 | set(SOURCES_OP_GPU_WITH_CP ${SOURCES_OP_GPU_WITH_CP} PARENT_SCOPE) 9 | set(SOURCES_OPENPOSE ${SOURCES_OPENPOSE} ${SOURCES_OP_GPU_WITH_CP} PARENT_SCOPE) 10 | 11 | if (UNIX OR APPLE) 12 | if (${GPU_MODE} MATCHES "CUDA") 13 | cuda_add_library(openpose_gpu ${SOURCES_OP_GPU}) 14 | else () 15 | add_library(openpose_gpu ${SOURCES_OP_GPU}) 16 | endif () 17 | 18 | target_link_libraries(openpose_gpu openpose_core) 19 | 20 | install(TARGETS openpose_gpu 21 | EXPORT OpenPose 22 | RUNTIME DESTINATION bin 23 | LIBRARY DESTINATION lib 24 | ARCHIVE DESTINATION lib/openpose) 25 | endif (UNIX OR APPLE) 26 | -------------------------------------------------------------------------------- /src/openpose/gpu/gpu.cpp: -------------------------------------------------------------------------------- 1 | #ifdef USE_CUDA 2 | #include 3 | #endif 4 | #ifdef USE_OPENCL 5 | #include 6 | #endif 7 | #include 8 | 9 | namespace op 10 | { 11 | int getGpuNumber() 12 | { 13 | try 14 | { 15 | #ifdef USE_CUDA 16 | return getCudaGpuNumber(); 17 | #elif defined USE_OPENCL 18 | return OpenCL::getTotalGPU(); 19 | #else 20 | error("OpenPose must be compiled with the `USE_CUDA` or `USE_OPENCL` macro definition in order to use" 21 | " this functionality.", __LINE__, __FUNCTION__, __FILE__); 22 | return -1; 23 | #endif 24 | } 25 | catch (const std::exception& e) 26 | { 27 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 28 | return -1; 29 | } 30 | } 31 | 32 | GpuMode getGpuMode() 33 | { 34 | try 35 | { 36 | #ifdef USE_CUDA 37 | return GpuMode::Cuda; 38 | #elif defined USE_OPENCL 39 | return GpuMode::OpenCL; 40 | #else 41 | return GpuMode::NoGpu; 42 | #endif 43 | } 44 | catch (const std::exception& e) 45 | { 46 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 47 | return GpuMode::NoGpu; 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/openpose/gui/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(SOURCES_OP_GUI 2 | defineTemplates.cpp 3 | frameDisplayer.cpp 4 | gui.cpp 5 | guiAdam.cpp 6 | gui3D.cpp 7 | guiInfoAdder.cpp 8 | ) 9 | 10 | include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake) 11 | set(SOURCES_OP_GUI_WITH_CP "" PARENT_SCOPE) 12 | prepend(SOURCES_OP_GUI_WITH_CP ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCES_OP_GUI}) 13 | set(SOURCES_OP_GUI_WITH_CP ${SOURCES_OP_GUI_WITH_CP} PARENT_SCOPE) 14 | set(SOURCES_OP_FILESTREAM_WITH_CP ${SOURCES_OP_FILESTREAM_WITH_CP} PARENT_SCOPE) 15 | set(SOURCES_OPENPOSE ${SOURCES_OPENPOSE} ${SOURCES_OP_GUI_WITH_CP} PARENT_SCOPE) 16 | 17 | if (UNIX OR APPLE) 18 | add_library(openpose_gui ${SOURCES_OP_GUI}) 19 | target_link_libraries(openpose_gui openpose_pose ${OpenCV_LIBS}) 20 | 21 | install(TARGETS openpose_gui 22 | EXPORT OpenPose 23 | RUNTIME DESTINATION bin 24 | LIBRARY DESTINATION lib 25 | ARCHIVE DESTINATION lib/openpose) 26 | endif (UNIX OR APPLE) 27 | 28 | -------------------------------------------------------------------------------- /src/openpose/gui/defineTemplates.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | namespace op 4 | { 5 | DEFINE_TEMPLATE_DATUM(WGui); 6 | #ifdef USE_3D_ADAM_MODEL 7 | DEFINE_TEMPLATE_DATUM(WGuiAdam); 8 | #endif 9 | DEFINE_TEMPLATE_DATUM(WGui3D); 10 | DEFINE_TEMPLATE_DATUM(WGuiInfoAdder); 11 | } 12 | -------------------------------------------------------------------------------- /src/openpose/hand/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(SOURCES_OP_HAND 2 | defineTemplates.cpp 3 | handDetector.cpp 4 | handDetectorFromTxt.cpp 5 | handExtractorCaffe.cpp 6 | handExtractorNet.cpp 7 | handCpuRenderer.cpp 8 | handGpuRenderer.cpp 9 | handRenderer.cpp 10 | renderHand.cpp 11 | renderHand.cu) 12 | 13 | include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake) 14 | prepend(SOURCES_OP_HAND_WITH_CP ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCES_OP_HAND}) 15 | set(SOURCES_OP_HAND_WITH_CP ${SOURCES_OP_HAND_WITH_CP} PARENT_SCOPE) 16 | set(SOURCES_OPENPOSE ${SOURCES_OPENPOSE} ${SOURCES_OP_HAND_WITH_CP} PARENT_SCOPE) 17 | 18 | if (UNIX OR APPLE) 19 | if (${GPU_MODE} MATCHES "CUDA") 20 | cuda_add_library(openpose_hand ${SOURCES_OP_HAND}) 21 | else () 22 | add_library(openpose_hand ${SOURCES_OP_HAND}) 23 | endif () 24 | 25 | target_link_libraries(openpose_hand openpose_core) 26 | 27 | if (BUILD_CAFFE) 28 | add_dependencies(openpose_hand openpose_caffe) 29 | endif (BUILD_CAFFE) 30 | 31 | install(TARGETS openpose_hand 32 | EXPORT OpenPose 33 | RUNTIME DESTINATION bin 34 | LIBRARY DESTINATION lib 35 | ARCHIVE DESTINATION lib/openpose) 36 | endif (UNIX OR APPLE) 37 | -------------------------------------------------------------------------------- /src/openpose/hand/defineTemplates.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | namespace op 4 | { 5 | DEFINE_TEMPLATE_DATUM(WHandDetector); 6 | DEFINE_TEMPLATE_DATUM(WHandDetectorFromTxt); 7 | DEFINE_TEMPLATE_DATUM(WHandDetectorTracking); 8 | DEFINE_TEMPLATE_DATUM(WHandDetectorUpdate); 9 | DEFINE_TEMPLATE_DATUM(WHandExtractorNet); 10 | DEFINE_TEMPLATE_DATUM(WHandRenderer); 11 | } 12 | -------------------------------------------------------------------------------- /src/openpose/hand/handCpuRenderer.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | namespace op 5 | { 6 | HandCpuRenderer::HandCpuRenderer(const float renderThreshold, const float alphaKeypoint, 7 | const float alphaHeatMap) : 8 | Renderer{renderThreshold, alphaKeypoint, alphaHeatMap} 9 | { 10 | } 11 | 12 | void HandCpuRenderer::renderHandInherited(Array& outputData, 13 | const std::array, 2>& handKeypoints) 14 | { 15 | try 16 | { 17 | // CPU rendering 18 | renderHandKeypointsCpu( 19 | outputData, 20 | handKeypoints, 21 | mRenderThreshold 22 | ); 23 | } 24 | catch (const std::exception& e) 25 | { 26 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/openpose/hand/handDetectorFromTxt.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | namespace op 6 | { 7 | std::vector getTxtPathsOnDirectory(const std::string& txtDirectoryPath) 8 | { 9 | try 10 | { 11 | // Get files on directory with JSON extension 12 | const auto txtPaths = getFilesOnDirectory(txtDirectoryPath, ".txt"); 13 | // Check #files > 0 14 | if (txtPaths.empty()) 15 | error("No txt files were found on " + txtDirectoryPath, __LINE__, __FUNCTION__, __FILE__); 16 | // Return file names 17 | return txtPaths; 18 | } 19 | catch (const std::exception& e) 20 | { 21 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 22 | return {}; 23 | } 24 | } 25 | 26 | HandDetectorFromTxt::HandDetectorFromTxt(const std::string& txtDirectoryPath) : 27 | mTxtDirectoryPath{txtDirectoryPath}, 28 | mFilePaths{getTxtPathsOnDirectory(txtDirectoryPath)}, 29 | mFrameNameCounter{0} 30 | { 31 | } 32 | 33 | std::vector, 2>> HandDetectorFromTxt::detectHands() 34 | { 35 | try 36 | { 37 | return loadHandDetectorTxt(mFilePaths.at(mFrameNameCounter++)); 38 | } 39 | catch (const std::exception& e) 40 | { 41 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 42 | return std::vector, 2>>{}; 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/openpose/hand/handRenderer.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | namespace op 5 | { 6 | void HandRenderer::renderHand(Array& outputData, 7 | const std::array, 2>& handKeypoints, 8 | const float scaleInputToOutput) 9 | { 10 | try 11 | { 12 | // Security checks 13 | if (outputData.empty()) 14 | error("Empty Array outputData.", __LINE__, __FUNCTION__, __FILE__); 15 | if (handKeypoints[0].getSize(0) != handKeypoints[1].getSize(0)) 16 | error("Wrong hand format: handKeypoints.getSize(0) != handKeypoints.getSize(1).", 17 | __LINE__, __FUNCTION__, __FILE__); 18 | // Rescale keypoints to output size 19 | auto leftHandKeypointsRescaled = handKeypoints[0].clone(); 20 | scaleKeypoints(leftHandKeypointsRescaled, scaleInputToOutput); 21 | auto rightHandKeypointsRescaled = handKeypoints[1].clone(); 22 | scaleKeypoints(rightHandKeypointsRescaled, scaleInputToOutput); 23 | // CPU/GPU rendering 24 | renderHandInherited( 25 | outputData, 26 | std::array, 2>{leftHandKeypointsRescaled, rightHandKeypointsRescaled} 27 | ); 28 | } 29 | catch (const std::exception& e) 30 | { 31 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/openpose/hand/renderHand.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | namespace op 7 | { 8 | void renderHandKeypointsCpu(Array& frameArray, const std::array, 2>& handKeypoints, 9 | const float renderThreshold) 10 | { 11 | try 12 | { 13 | // Parameters 14 | const auto thicknessCircleRatio = 1.f/50.f; 15 | const auto thicknessLineRatioWRTCircle = 0.75f; 16 | const auto& pairs = HAND_PAIRS_RENDER; 17 | const auto& scales = HAND_SCALES_RENDER; 18 | // Render keypoints 19 | if (!frameArray.empty()) 20 | renderKeypointsCpu(frameArray, handKeypoints[0], pairs, HAND_COLORS_RENDER, thicknessCircleRatio, 21 | thicknessLineRatioWRTCircle, scales, renderThreshold); 22 | if (!frameArray.empty()) 23 | renderKeypointsCpu(frameArray, handKeypoints[1], pairs, HAND_COLORS_RENDER, thicknessCircleRatio, 24 | thicknessLineRatioWRTCircle, scales, renderThreshold); 25 | } 26 | catch (const std::exception& e) 27 | { 28 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/openpose/net/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP;cl) 2 | set(SOURCES_OP_NET 3 | maximumBase.cpp 4 | maximumBase.cu 5 | maximumCaffe.cpp 6 | netCaffe.cpp 7 | nmsBase.cpp 8 | nmsBase.cu 9 | nmsBaseCL.cpp 10 | nmsCaffe.cpp 11 | resizeAndMergeBase.cpp 12 | resizeAndMergeBase.cu 13 | resizeAndMergeBaseCL.cpp 14 | resizeAndMergeCaffe.cpp) 15 | 16 | include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake) 17 | prepend(SOURCES_OP_NET_WITH_CP ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCES_OP_NET}) 18 | set(SOURCES_OP_NET_WITH_CP ${SOURCES_OP_NET_WITH_CP} PARENT_SCOPE) 19 | set(SOURCES_OPENPOSE ${SOURCES_OPENPOSE} ${SOURCES_OP_NET_WITH_CP} PARENT_SCOPE) 20 | 21 | if (UNIX OR APPLE) 22 | if (${GPU_MODE} MATCHES "CUDA") 23 | cuda_add_library(openpose_net ${SOURCES_OP_NET}) 24 | else () 25 | add_library(openpose_net ${SOURCES_OP_NET}) 26 | endif () 27 | 28 | add_library(caffe SHARED IMPORTED) 29 | set_property(TARGET caffe PROPERTY IMPORTED_LOCATION ${Caffe_LIBS}) 30 | target_link_libraries(openpose_net caffe ${MKL_LIBS} openpose_core) 31 | 32 | if (BUILD_CAFFE) 33 | add_dependencies(openpose_net openpose_caffe) 34 | endif (BUILD_CAFFE) 35 | 36 | install(TARGETS openpose_net 37 | EXPORT OpenPose 38 | RUNTIME DESTINATION bin 39 | LIBRARY DESTINATION lib 40 | ARCHIVE DESTINATION lib/openpose) 41 | endif (UNIX OR APPLE) 42 | -------------------------------------------------------------------------------- /src/openpose/pose/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(SOURCES_OP_POSE 2 | bodyPartConnectorBase.cpp 3 | bodyPartConnectorBase.cu 4 | bodyPartConnectorCaffe.cpp 5 | defineTemplates.cpp 6 | poseCpuRenderer.cpp 7 | poseExtractor.cpp 8 | poseExtractorCaffe.cpp 9 | poseExtractorNet.cpp 10 | poseGpuRenderer.cpp 11 | poseParameters.cpp 12 | poseParametersRender.cpp 13 | poseRenderer.cpp 14 | renderPose.cpp 15 | renderPose.cu) 16 | 17 | include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake) 18 | prepend(SOURCES_OP_POSE_WITH_CP ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCES_OP_POSE}) 19 | set(SOURCES_OP_POSE_WITH_CP ${SOURCES_OP_POSE_WITH_CP} PARENT_SCOPE) 20 | set(SOURCES_OPENPOSE ${SOURCES_OPENPOSE} ${SOURCES_OP_POSE_WITH_CP} PARENT_SCOPE) 21 | 22 | if (UNIX OR APPLE) 23 | if (${GPU_MODE} MATCHES "CUDA") 24 | cuda_add_library(openpose_pose ${SOURCES_OP_POSE}) 25 | else () 26 | add_library(openpose_pose ${SOURCES_OP_POSE}) 27 | endif () 28 | 29 | target_link_libraries(openpose_pose openpose_core) 30 | 31 | if (BUILD_CAFFE) 32 | add_dependencies(openpose_pose openpose_caffe) 33 | endif (BUILD_CAFFE) 34 | 35 | install(TARGETS openpose_pose 36 | EXPORT OpenPose 37 | RUNTIME DESTINATION bin 38 | LIBRARY DESTINATION lib 39 | ARCHIVE DESTINATION lib/openpose) 40 | endif (UNIX OR APPLE) 41 | -------------------------------------------------------------------------------- /src/openpose/pose/defineTemplates.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | namespace op 4 | { 5 | DEFINE_TEMPLATE_DATUM(WPoseExtractor); 6 | DEFINE_TEMPLATE_DATUM(WPoseExtractorNet); 7 | DEFINE_TEMPLATE_DATUM(WPoseRenderer); 8 | } 9 | -------------------------------------------------------------------------------- /src/openpose/pose/poseRenderer.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | namespace op 7 | { 8 | std::map createPartToName(const PoseModel poseModel) 9 | { 10 | try 11 | { 12 | auto partToName = getPoseBodyPartMapping(poseModel); 13 | const auto& bodyPartPairs = getPosePartPairs(poseModel); 14 | const auto& mapIdx = getPoseMapIndex(poseModel); 15 | const auto numberBodyPartsPlusBkg = getPoseNumberBodyParts(poseModel)+1; 16 | 17 | for (auto bodyPart = 0u; bodyPart < bodyPartPairs.size(); bodyPart+=2) 18 | { 19 | const auto bodyPartPairsA = bodyPartPairs.at(bodyPart); 20 | const auto bodyPartPairsB = bodyPartPairs.at(bodyPart+1); 21 | const auto mapIdxA = numberBodyPartsPlusBkg + mapIdx.at(bodyPart); 22 | const auto mapIdxB = numberBodyPartsPlusBkg + mapIdx.at(bodyPart+1); 23 | partToName[mapIdxA] = partToName.at(bodyPartPairsA) + "->" + partToName.at(bodyPartPairsB) + "(X)"; 24 | partToName[mapIdxB] = partToName.at(bodyPartPairsA) + "->" + partToName.at(bodyPartPairsB) + "(Y)"; 25 | } 26 | 27 | return partToName; 28 | } 29 | catch (const std::exception& e) 30 | { 31 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 32 | return std::map(); 33 | } 34 | } 35 | 36 | PoseRenderer::PoseRenderer(const PoseModel poseModel) : 37 | mPoseModel{poseModel}, 38 | mPartIndexToName{createPartToName(poseModel)} 39 | { 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/openpose/pose/renderPose.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | namespace op 7 | { 8 | void renderPoseKeypointsCpu(Array& frameArray, const Array& poseKeypoints, const PoseModel poseModel, 9 | const float renderThreshold, const bool blendOriginalFrame) 10 | { 11 | try 12 | { 13 | if (!frameArray.empty()) 14 | { 15 | // Background 16 | if (!blendOriginalFrame) 17 | frameArray.getCvMat().setTo(0.f); // [0-255] 18 | 19 | // Parameters 20 | const auto thicknessCircleRatio = 1.f/75.f; 21 | const auto thicknessLineRatioWRTCircle = 0.75f; 22 | const auto& pairs = getPoseBodyPartPairsRender(poseModel); 23 | const auto& poseScales = getPoseScales(poseModel); 24 | 25 | // Render keypoints 26 | renderKeypointsCpu(frameArray, poseKeypoints, pairs, getPoseColors(poseModel), thicknessCircleRatio, 27 | thicknessLineRatioWRTCircle, poseScales, renderThreshold); 28 | } 29 | } 30 | catch (const std::exception& e) 31 | { 32 | error(e.what(), __LINE__, __FUNCTION__, __FILE__); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/openpose/producer/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(SOURCES_OP_PRODUCER 2 | defineTemplates.cpp 3 | flirReader.cpp 4 | imageDirectoryReader.cpp 5 | ipCameraReader.cpp 6 | producer.cpp 7 | spinnakerWrapper.cpp 8 | videoCaptureReader.cpp 9 | videoReader.cpp 10 | webcamReader.cpp) 11 | 12 | include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake) 13 | prepend(SOURCES_OP_PRODUCER_WITH_CP ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCES_OP_PRODUCER}) 14 | set(SOURCES_OP_PRODUCER_WITH_CP ${SOURCES_OP_PRODUCER_WITH_CP} PARENT_SCOPE) 15 | set(SOURCES_OPENPOSE ${SOURCES_OPENPOSE} ${SOURCES_OP_PRODUCER_WITH_CP} PARENT_SCOPE) 16 | 17 | if (UNIX OR APPLE) 18 | add_library(openpose_producer ${SOURCES_OP_PRODUCER}) 19 | target_link_libraries(openpose_producer ${OpenCV_LIBS} openpose_core 20 | openpose_thread openpose_filestream) 21 | 22 | install(TARGETS openpose_producer 23 | EXPORT OpenPose 24 | RUNTIME DESTINATION bin 25 | LIBRARY DESTINATION lib 26 | ARCHIVE DESTINATION lib/openpose) 27 | endif (UNIX OR APPLE) 28 | -------------------------------------------------------------------------------- /src/openpose/producer/defineTemplates.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | namespace op 4 | { 5 | template class OP_API DatumProducer; 6 | template class OP_API WDatumProducer; 7 | } 8 | -------------------------------------------------------------------------------- /src/openpose/thread/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(SOURCES_OP_THREAD 2 | defineTemplates.cpp) 3 | 4 | include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake) 5 | prepend(SOURCES_OP_THREAD_WITH_CP ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCES_OP_THREAD}) 6 | set(SOURCES_OP_THREAD_WITH_CP ${SOURCES_OP_THREAD_WITH_CP} PARENT_SCOPE) 7 | set(SOURCES_OPENPOSE ${SOURCES_OPENPOSE} ${SOURCES_OP_THREAD_WITH_CP} PARENT_SCOPE) 8 | 9 | if (UNIX OR APPLE) 10 | add_library(openpose_thread ${SOURCES_OP_THREAD}) 11 | 12 | target_link_libraries(openpose_thread openpose_core) 13 | 14 | install(TARGETS openpose_thread 15 | EXPORT OpenPose 16 | RUNTIME DESTINATION bin 17 | LIBRARY DESTINATION lib 18 | ARCHIVE DESTINATION lib/openpose) 19 | endif (UNIX OR APPLE) 20 | -------------------------------------------------------------------------------- /src/openpose/thread/defineTemplates.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | namespace op 4 | { 5 | DEFINE_TEMPLATE_DATUM(PriorityQueue); 6 | DEFINE_TEMPLATE_DATUM(Queue); 7 | template class OP_API QueueBase>; 8 | template class OP_API QueueBase, std::greater>>; 9 | DEFINE_TEMPLATE_DATUM(SubThread); 10 | DEFINE_TEMPLATE_DATUM(SubThreadNoQueue); 11 | DEFINE_TEMPLATE_DATUM(SubThreadQueueIn); 12 | DEFINE_TEMPLATE_DATUM(SubThreadQueueInOut); 13 | DEFINE_TEMPLATE_DATUM(SubThreadQueueOut); 14 | DEFINE_TEMPLATE_DATUM(Thread); 15 | DEFINE_TEMPLATE_DATUM(ThreadManager); 16 | DEFINE_TEMPLATE_DATUM(Worker); 17 | DEFINE_TEMPLATE_DATUM(WorkerConsumer); 18 | DEFINE_TEMPLATE_DATUM(WorkerProducer); 19 | DEFINE_TEMPLATE_DATUM(WIdGenerator); 20 | template class OP_API WQueueAssembler; 21 | DEFINE_TEMPLATE_DATUM(WQueueOrderer); 22 | } 23 | -------------------------------------------------------------------------------- /src/openpose/tracking/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(SOURCES_OP_TRACKING 2 | defineTemplates.cpp 3 | personIdExtractor.cpp 4 | personTracker.cpp 5 | pyramidalLK.cpp 6 | pyramidalLK.cu) 7 | 8 | include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake) 9 | prepend(SOURCES_OP_TRACKING_WITH_CP ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCES_OP_TRACKING}) 10 | set(SOURCES_OP_TRACKING_WITH_CP ${SOURCES_OP_TRACKING_WITH_CP} PARENT_SCOPE) 11 | set(SOURCES_OPENPOSE ${SOURCES_OPENPOSE} ${SOURCES_OP_TRACKING_WITH_CP} PARENT_SCOPE) 12 | 13 | if (UNIX OR APPLE) 14 | add_library(openpose_tracking ${SOURCES_OP_TRACKING}) 15 | 16 | target_link_libraries(openpose_tracking openpose_core) 17 | 18 | install(TARGETS openpose_tracking 19 | EXPORT OpenPose 20 | RUNTIME DESTINATION bin 21 | LIBRARY DESTINATION lib 22 | ARCHIVE DESTINATION lib/openpose) 23 | endif (UNIX OR APPLE) 24 | -------------------------------------------------------------------------------- /src/openpose/tracking/defineTemplates.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | namespace op 4 | { 5 | DEFINE_TEMPLATE_DATUM(WPersonIdExtractor); 6 | } 7 | -------------------------------------------------------------------------------- /src/openpose/utilities/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(SOURCES_OP_UTILITIES 2 | errorAndLog.cpp 3 | fileSystem.cpp 4 | flagsToOpenPose.cpp 5 | keypoint.cpp 6 | openCv.cpp 7 | profiler.cpp 8 | string.cpp) 9 | 10 | include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake) 11 | prepend(SOURCES_OP_UTILITIES_WITH_CP ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCES_OP_UTILITIES}) 12 | set(SOURCES_OP_UTILITIES_WITH_CP ${SOURCES_OP_UTILITIES_WITH_CP} PARENT_SCOPE) 13 | set(SOURCES_OPENPOSE ${SOURCES_OPENPOSE} ${SOURCES_OP_UTILITIES_WITH_CP} PARENT_SCOPE) 14 | 15 | if (UNIX OR APPLE) 16 | if (${GPU_MODE} MATCHES "CUDA") 17 | cuda_add_library(openpose_utilities ${SOURCES_OP_UTILITIES}) 18 | else () 19 | add_library(openpose_utilities ${SOURCES_OP_UTILITIES}) 20 | endif () 21 | 22 | target_link_libraries(openpose_utilities openpose_producer openpose_filestream) 23 | 24 | install(TARGETS openpose_utilities 25 | EXPORT OpenPose 26 | RUNTIME DESTINATION bin 27 | LIBRARY DESTINATION lib 28 | ARCHIVE DESTINATION lib/openpose) 29 | endif (UNIX OR APPLE) 30 | -------------------------------------------------------------------------------- /src/openpose/wrapper/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(SOURCES_OP_WRAPPER 2 | defineTemplates.cpp 3 | wrapperAuxiliary.cpp 4 | wrapperStructExtra.cpp 5 | wrapperStructFace.cpp 6 | wrapperStructHand.cpp 7 | wrapperStructInput.cpp 8 | wrapperStructOutput.cpp 9 | wrapperStructPose.cpp) 10 | 11 | include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake) 12 | prepend(SOURCES_OP_WRAPPER_WITH_CP ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCES_OP_WRAPPER}) 13 | set(SOURCES_OP_WRAPPER_WITH_CP ${SOURCES_OP_WRAPPER_WITH_CP} PARENT_SCOPE) 14 | set(SOURCES_OPENPOSE ${SOURCES_OPENPOSE} ${SOURCES_OP_WRAPPER_WITH_CP} PARENT_SCOPE) 15 | 16 | if (UNIX OR APPLE) 17 | add_library(openpose_wrapper ${SOURCES_OP_WRAPPER}) 18 | target_link_libraries(openpose_wrapper openpose_thread openpose_pose openpose_hand 19 | openpose_core openpose_face openpose_filestream openpose_gui openpose_producer 20 | openpose_utilities) 21 | 22 | install(TARGETS openpose_wrapper 23 | EXPORT OpenPose 24 | RUNTIME DESTINATION bin 25 | LIBRARY DESTINATION lib 26 | ARCHIVE DESTINATION lib/openpose) 27 | endif (UNIX OR APPLE) 28 | -------------------------------------------------------------------------------- /src/openpose/wrapper/defineTemplates.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | namespace op 4 | { 5 | template class OP_API Wrapper; 6 | } 7 | -------------------------------------------------------------------------------- /src/openpose/wrapper/wrapperStructExtra.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | namespace op 4 | { 5 | WrapperStructExtra::WrapperStructExtra(const bool reconstruct3d_, const int minViews3d_, 6 | const bool identification_, const int tracking_, 7 | const int ikThreads_) : 8 | reconstruct3d{reconstruct3d_}, 9 | minViews3d{minViews3d_}, 10 | identification{identification_}, 11 | tracking{tracking_}, 12 | ikThreads{ikThreads_} 13 | { 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/openpose/wrapper/wrapperStructFace.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | namespace op 4 | { 5 | WrapperStructFace::WrapperStructFace(const bool enable_, const Point& netInputSize_, const RenderMode renderMode_, 6 | const float alphaKeypoint_, const float alphaHeatMap_, 7 | const float renderThreshold_) : 8 | enable{enable_}, 9 | netInputSize{netInputSize_}, 10 | renderMode{renderMode_}, 11 | alphaKeypoint{alphaKeypoint_}, 12 | alphaHeatMap{alphaHeatMap_}, 13 | renderThreshold{renderThreshold_} 14 | { 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/openpose/wrapper/wrapperStructHand.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | namespace op 4 | { 5 | WrapperStructHand::WrapperStructHand(const bool enable_, const Point& netInputSize_, const int scalesNumber_, 6 | const float scaleRange_, const bool tracking_, const RenderMode renderMode_, 7 | const float alphaKeypoint_, const float alphaHeatMap_, 8 | const float renderThreshold_) : 9 | enable{enable_}, 10 | netInputSize{netInputSize_}, 11 | scalesNumber{scalesNumber_}, 12 | scaleRange{scaleRange_}, 13 | tracking{tracking_}, 14 | renderMode{renderMode_}, 15 | alphaKeypoint{alphaKeypoint_}, 16 | alphaHeatMap{alphaHeatMap_}, 17 | renderThreshold{renderThreshold_} 18 | { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/openpose/wrapper/wrapperStructInput.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | namespace op 4 | { 5 | WrapperStructInput::WrapperStructInput(const std::shared_ptr producerSharedPtr_, 6 | const unsigned long long frameFirst_, const unsigned long long frameLast_, 7 | const bool realTimeProcessing_, const bool frameFlip_, 8 | const int frameRotate_, const bool framesRepeat_) : 9 | producerSharedPtr{producerSharedPtr_}, 10 | frameFirst{frameFirst_}, 11 | frameLast{frameLast_}, 12 | realTimeProcessing{realTimeProcessing_}, 13 | frameFlip{frameFlip_}, 14 | frameRotate{frameRotate_}, 15 | framesRepeat{framesRepeat_} 16 | { 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /ubuntu/install_caffe_and_openpose_JetsonTX2_JetPack3.1.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | 4 | 5 | echo "------------------------- Installing Caffe and OpenPose -------------------------" 6 | echo "NOTE: This script assumes that just flashed JetPack 3.1 : Ubuntu 16, CUDA 8, cuDNN 6 and OpenCV are already installed on your machine. Otherwise, it might fail." 7 | 8 | 9 | 10 | function exitIfError { 11 | if [[ $? -ne 0 ]] ; then 12 | echo "" 13 | echo "------------------------- -------------------------" 14 | echo "Errors detected. Exiting script. The software might have not been successfully installed." 15 | echo "------------------------- -------------------------" 16 | exit 1 17 | fi 18 | } 19 | 20 | 21 | 22 | function executeShInItsFolder { 23 | # $1 = sh file name 24 | # $2 = folder where the sh file is 25 | # $3 = folder to go back 26 | cd $2 27 | exitIfError 28 | sudo chmod +x $1 29 | exitIfError 30 | bash ./$1 31 | exitIfError 32 | cd $3 33 | exitIfError 34 | } 35 | 36 | 37 | 38 | git submodule update --init --recursive 39 | executeShInItsFolder "install_caffe_JetsonTX2_JetPack3.1.sh" "./3rdparty/caffe" "../.." 40 | exitIfError 41 | 42 | 43 | 44 | executeShInItsFolder "install_openpose_JetsonTX2_JetPack3.1.sh" "./ubuntu" "./" 45 | exitIfError 46 | 47 | 48 | 49 | echo "------------------------- Caffe and OpenPose Installed -------------------------" 50 | echo "" 51 | -------------------------------------------------------------------------------- /ubuntu/install_cmake.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ### INSTALL PREREQUISITES 4 | 5 | ubuntu_version="$(lsb_release -r)" 6 | sudo apt-get update && sudo apt-get install wget -y --no-install-recommends 7 | if [[ $ubuntu_version == *"14."* ]]; then 8 | wget -c "https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda-repo-ubuntu1404-8-0-local-ga2_8.0.61-1_amd64-deb" 9 | sudo dpkg --install cuda-repo-ubuntu1404-8-0-local-ga2_8.0.61-1_amd64-deb 10 | elif [[ $ubuntu_version == *"16."* ]]; then 11 | wget -c "https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64-deb" 12 | sudo dpkg --install cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64-deb 13 | fi 14 | sudo apt-get update 15 | sudo apt-get install cuda-8-0 16 | 17 | # Install cuDNN 5.1 18 | CUDNN_URL="http://developer.download.nvidia.com/compute/redist/cudnn/v5.1/cudnn-8.0-linux-x64-v5.1.tgz" 19 | wget -c ${CUDNN_URL} 20 | sudo tar -xzf cudnn-8.0-linux-x64-v5.1.tgz -C /usr/local 21 | rm cudnn-8.0-linux-x64-v5.1.tgz && sudo ldconfig 22 | 23 | # Basic 24 | sudo apt-get --assume-yes update 25 | sudo apt-get --assume-yes install build-essential 26 | # General dependencies 27 | sudo apt-get --assume-yes install libatlas-base-dev libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev protobuf-compiler 28 | sudo apt-get --assume-yes install --no-install-recommends libboost-all-dev 29 | # Remaining dependencies, 14.04 30 | sudo apt-get --assume-yes install libgflags-dev libgoogle-glog-dev liblmdb-dev 31 | # Python libs 32 | sudo -H pip install --upgrade numpy protobuf 33 | # OpenCV 2.4 -> Added as option 34 | # sudo apt-get --assume-yes install libopencv-dev 35 | -------------------------------------------------------------------------------- /ubuntu/install_cuda.sh: -------------------------------------------------------------------------------- 1 | ubuntu_version="$(lsb_release -r)" 2 | sudo apt-get update && sudo apt-get install wget -y --no-install-recommends 3 | if [[ $ubuntu_version == *"14."* ]]; then 4 | wget -c "https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda-repo-ubuntu1404-8-0-local-ga2_8.0.61-1_amd64-deb" 5 | sudo dpkg --install cuda-repo-ubuntu1404-8-0-local-ga2_8.0.61-1_amd64-deb 6 | elif [[ $ubuntu_version == *"16."* ]]; then 7 | wget -c "https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64-deb" 8 | sudo dpkg --install cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64-deb 9 | fi 10 | sudo apt-get update 11 | sudo apt-get install cuda 12 | -------------------------------------------------------------------------------- /ubuntu/install_cudnn.sh: -------------------------------------------------------------------------------- 1 | # Install cuDNN 5.1 2 | ubuntu_version="$(lsb_release -r)" 3 | CUDNN_URL="http://developer.download.nvidia.com/compute/redist/cudnn/v5.1/cudnn-8.0-linux-x64-v5.1.tgz" 4 | wget -c ${CUDNN_URL} 5 | sudo tar -xzf cudnn-8.0-linux-x64-v5.1.tgz -C /usr/local 6 | rm cudnn-8.0-linux-x64-v5.1.tgz && sudo ldconfig 7 | -------------------------------------------------------------------------------- /ubuntu_deprecated/install_caffe_and_openpose_if_cuda8.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | 4 | 5 | echo "------------------------- Installing Caffe and OpenPose -------------------------" 6 | echo "NOTE: This script assumes that CUDA and cuDNN are already installed on your machine. Otherwise, it might fail." 7 | 8 | 9 | 10 | function exitIfError { 11 | if [[ $? -ne 0 ]] ; then 12 | echo "" 13 | echo "------------------------- -------------------------" 14 | echo "Errors detected. Exiting script. The software might have not been successfully installed." 15 | echo "------------------------- -------------------------" 16 | exit 1 17 | fi 18 | } 19 | 20 | 21 | 22 | function executeShInItsFolder { 23 | # $1 = sh file name 24 | # $2 = folder where the sh file is 25 | # $3 = folder to go back 26 | cd $2 27 | exitIfError 28 | sudo chmod +x $1 29 | exitIfError 30 | bash ./$1 31 | exitIfError 32 | cd $3 33 | exitIfError 34 | } 35 | 36 | 37 | 38 | git submodule update --init --recursive 39 | executeShInItsFolder "install_caffe_if_cuda8.sh" "./3rdparty/caffe" "../.." 40 | exitIfError 41 | 42 | 43 | 44 | executeShInItsFolder "install_openpose_if_cuda8.sh" "./ubuntu" "./" 45 | exitIfError 46 | 47 | 48 | 49 | echo "------------------------- Caffe and OpenPose Installed -------------------------" 50 | echo "" 51 | --------------------------------------------------------------------------------