From b064a4836e38180688f3e484b01d55f3c156251e Mon Sep 17 00:00:00 2001 From: Raaj Date: Mon, 21 Jan 2019 19:18:22 -0500 Subject: [PATCH] New examples for PyOpenPose (#1039) --- doc/modules/python_module.md | 95 +++++++++++++++- .../08_heatmaps_from_image.cpp | 2 +- .../tutorial_api_python/1_body_from_image.py | 5 +- .../2_whole_body_from_image.py | 5 +- .../3_heatmaps_from_image.py | 10 +- .../4_keypoints_from_images.py | 79 ++++++++++++++ .../5_keypoints_from_images_multi_gpu.py | 103 ++++++++++++++++++ .../tutorial_api_python/6_face_from_image.py | 79 ++++++++++++++ .../tutorial_api_python/7_hand_from_image.py | 92 ++++++++++++++++ examples/tutorial_api_python/CMakeLists.txt | 4 + python/openpose/openpose_python.cpp | 21 ++++ 11 files changed, 480 insertions(+), 15 deletions(-) create mode 100644 examples/tutorial_api_python/4_keypoints_from_images.py create mode 100644 examples/tutorial_api_python/5_keypoints_from_images_multi_gpu.py create mode 100644 examples/tutorial_api_python/6_face_from_image.py create mode 100644 examples/tutorial_api_python/7_hand_from_image.py diff --git a/doc/modules/python_module.md b/doc/modules/python_module.md index 556cf4ad..e0dc8a20 100644 --- a/doc/modules/python_module.md +++ b/doc/modules/python_module.md @@ -1,5 +1,4 @@ -OpenPose Python Module and Demo -============================================= +# OpenPose Python Module and Demo ## Contents 1. [Introduction](#introduction) @@ -18,7 +17,29 @@ This module exposes a Python API for OpenPose. It is effectively a wrapper that ## Compatibility The OpenPose Python module is compatible with both Python 2 and Python 3. In addition, it will also run in all OpenPose compatible operating systems. It uses [Pybind11](https://github.com/pybind/pybind11) for mapping between C++ and Python datatypes. -To compile, enable `BUILD_PYTHON` in cmake. Pybind selects the latest version of Python by default (Python 3). To use Python 2, change `PYTHON_EXECUTABLE` and `PYTHON_LIBRARY` flags in cmake to your desired python version. +To compile, enable `BUILD_PYTHON` in cmake. Pybind selects the latest version of Python by default (Python 3). To use Python 2, change `PYTHON_EXECUTABLE` and `PYTHON_LIBRARY` flags in cmake-gui to your desired python version. + +Ubuntu Eg: + +``` +PYTHON_EXECUTABLE=/usr/bin/python2.7 +PYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7m.so +``` + +Mac OSX Eg: + +``` +PYTHON_EXECUTABLE=/usr/local/bin/python2.7 +PYTHON_LIBRARY=/usr/local/opt/python/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7m.dylib +``` + +Windows Eg: + +``` +PYTHON_EXECUTABLE=C:/Users/user/AppData/Local/Programs/Python/Python27/python.exe +``` + +If run via the command line, you may need to run cmake twice in order for this change to take effect. @@ -61,5 +82,69 @@ python3 2_whole_body_from_image.py ## Exporting Python OpenPose Note: This step is only required if you are moving the `*.py` files outside their original location, or writting new `*.py` scripts outside `build/examples/tutorial_api_python`. -- Option a, installing OpenPose: On an Ubuntu or OSX based system, you could install OpenPose by running `sudo make install`, you could then set the OpenPose path in your python scripts to the OpenPose installation path (default: `/usr/local/python`) and start using OpenPose at any location. Take a look at `build/examples/tutorial_pose/1_body_from_image.py` for an example. -- Option b, not installing OpenPose: To move the OpenPose Python API demos to a different folder, ensure that the line `sys.path.append('{OpenPose_path}/python')` is properly set in your `*.py` files, where `{OpenPose_path}` points to your build folder of OpenPose. Take a look at `build/examples/tutorial_pose/1_body_from_image.py` for an example. +Ubuntu/OSX: + +- Option a, installing OpenPose: On an Ubuntu or OSX based system, you could install OpenPose by running `sudo make install`, you could then set the OpenPose path in your python scripts to the OpenPose installation path (default: `/usr/local/python`) and start using OpenPose at any location. Take a look at `build/examples/tutorial_api_python/1_body_from_image.py` for an example. +- Option b, not installing OpenPose: To move the OpenPose Python API demos to a different folder, ensure that the line `sys.path.append('{OpenPose_path}/python')` is properly set in your `*.py` files, where `{OpenPose_path}` points to your build folder of OpenPose. Take a look at `build/examples/tutorial_api_python/1_body_from_image.py` for an example. + +Windows: + +- Ensure that the folder `build/x{86/64}/Release`and `build/bin` are copied along with `build/python` As noted in the example, the path for these can be changed in the following two variables: + + ``` + sys.path.append(dir_path + '/../../python/openpose/Release); + os.environ['PATH'] = os.environ['PATH'] + ';' + dir_path + '/../../{x86/x64}/Release;' + dir_path + '/../../bin;' + ``` + + + +#### Common Issues +The error in general is that openpose cannot be found. Ensure first that `BUILD_PYTHON` flag is set to ON. If the error persists, check the following: + +In the script you are running, check for the following line, and run the following command in the same location as where the file is + +**Ubuntu/OSX:** + +`sys.path.append('../../python');` + +``` +ls ../../python/openpose +``` + +Check the contents of this location. It should contain one of the following files: + +``` +pyopenpose.cpython-35m-x86_64-linux-gnu.so +pyopenpose.so +``` + +If you do not have any one of those, you may not have compiled openpose successfully, or you may be running the examples, not from the build folder but the source folder. If you have the first one, you have compiled pyopenpose for python 3, and have to run the scripts with python3, and vice versa for the 2nd one. Follow the testing examples above for exact commands. + +**Windows:** + +Python for Openpose needs to be compiled in Release mode for now. This can be done in [Visual Studio](https://cdn.stereolabs.com/docs/getting-started/images/release_mode.png). Once that is done check this line: + +`sys.path.append(dir_path + '/../../python/openpose/Release');` + +``` +dir ../../python/openpose/Release +``` + +Check the contents of this location. It should contain one of the following files: + +``` +pyopenpose.cp36-win_amd64.pyd +pyopenpose.pyd +``` + +If such a folder does not exist, you need to compile in Release mode as seen above. If you have the first one, you have compiled pyopenpose for python 3, and have to run the scripts with python3, and vice versa for the 2nd one. Follow the testing examples above for exact commands. If that still does not work, check this line: + +`os.environ['PATH'] = os.environ['PATH'] + ';' + dir_path + '/../../x64/Release;' + dir_path + '/../../bin;'` + +``` +dir ../../x64/Release +dir ../../bin +``` + +Ensure that both of these paths exist, as pyopenpose needs to reference those libraries. If they don't exist, change the path so that they point to the correct location in your build folder + diff --git a/examples/tutorial_api_cpp/08_heatmaps_from_image.cpp b/examples/tutorial_api_cpp/08_heatmaps_from_image.cpp index 0b5eee0f..4bc280ed 100644 --- a/examples/tutorial_api_cpp/08_heatmaps_from_image.cpp +++ b/examples/tutorial_api_cpp/08_heatmaps_from_image.cpp @@ -43,7 +43,7 @@ bool display( const cv::Mat inputNetDataR( height, width, CV_32F, &inputNetData.getPtr()[2*height*width]); cv::Mat netInputImage; - cv::merge({inputNetDataB, inputNetDataG, inputNetDataR}, netInputImage); + cv::merge(std::vector{inputNetDataB, inputNetDataG, inputNetDataR}, netInputImage); netInputImage = (netInputImage+0.5)*255; // Turn into uint8 cv::Mat cv::Mat netInputImageUint8; diff --git a/examples/tutorial_api_python/1_body_from_image.py b/examples/tutorial_api_python/1_body_from_image.py index f89225f4..d284ffc4 100644 --- a/examples/tutorial_api_python/1_body_from_image.py +++ b/examples/tutorial_api_python/1_body_from_image.py @@ -63,6 +63,5 @@ opWrapper.emplaceAndPop([datum]) # Display Image print("Body keypoints: \n" + str(datum.poseKeypoints)) -while 1: - cv2.imshow("win", datum.cvOutputData) - cv2.waitKey(15) +cv2.imshow("OpenPose 1.4.0 - Tutorial Python API", datum.cvOutputData) +cv2.waitKey(0) diff --git a/examples/tutorial_api_python/2_whole_body_from_image.py b/examples/tutorial_api_python/2_whole_body_from_image.py index fbf7f8a6..f71a193c 100644 --- a/examples/tutorial_api_python/2_whole_body_from_image.py +++ b/examples/tutorial_api_python/2_whole_body_from_image.py @@ -68,6 +68,5 @@ print("Body keypoints: \n" + str(datum.poseKeypoints)) print("Face keypoints: \n" + str(datum.faceKeypoints)) print("Left hand keypoints: \n" + str(datum.handKeypoints[0])) print("Right hand keypoints: \n" + str(datum.handKeypoints[1])) -while 1: - cv2.imshow("win", datum.cvOutputData) - cv2.waitKey(15) +cv2.imshow("OpenPose 1.4.0 - Tutorial Python API", datum.cvOutputData) +cv2.waitKey(0) diff --git a/examples/tutorial_api_python/3_heatmaps_from_image.py b/examples/tutorial_api_python/3_heatmaps_from_image.py index 0d16812d..7a47331e 100644 --- a/examples/tutorial_api_python/3_heatmaps_from_image.py +++ b/examples/tutorial_api_python/3_heatmaps_from_image.py @@ -35,7 +35,9 @@ args = parser.parse_known_args() params = dict() params["model_folder"] = "../../../models/" params["heatmaps_add_parts"] = True +params["heatmaps_add_bkg"] = True params["heatmaps_add_PAFs"] = True +params["heatmaps_scale"] = 2 # Add others in path? for i in range(0, len(args[1])): @@ -69,7 +71,7 @@ outputImageF = (datum.inputNetData[0].copy())[0,:,:,:] + 0.5 outputImageF = cv2.merge([outputImageF[0,:,:], outputImageF[1,:,:], outputImageF[2,:,:]]) outputImageF = (outputImageF*255.).astype(dtype='uint8') heatmaps = datum.poseHeatMaps.copy() -heatmaps = (heatmaps*255.).astype(dtype='uint8') +heatmaps = (heatmaps).astype(dtype='uint8') # Display Image counter = 0 @@ -78,7 +80,9 @@ while 1: heatmap = heatmaps[counter, :, :].copy() heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET) combined = cv2.addWeighted(outputImageF, 0.5, heatmap, 0.5, 0) - cv2.imshow("win", combined) - cv2.waitKey(-1) + cv2.imshow("OpenPose 1.4.0 - Tutorial Python API", combined) + key = cv2.waitKey(-1) + if key == 27: + break counter += 1 counter = counter % num_maps diff --git a/examples/tutorial_api_python/4_keypoints_from_images.py b/examples/tutorial_api_python/4_keypoints_from_images.py new file mode 100644 index 00000000..b2c4573b --- /dev/null +++ b/examples/tutorial_api_python/4_keypoints_from_images.py @@ -0,0 +1,79 @@ +# From Python +# It requires OpenCV installed for Python +import sys +import cv2 +import os +from sys import platform +import argparse +import time + +# Import Openpose (Windows/Ubuntu/OSX) +dir_path = os.path.dirname(os.path.realpath(__file__)) +try: + # Windows Import + if platform == "win32": + # Change these variables to point to the correct folder (Release/x64 etc.) + sys.path.append(dir_path + '/../../python/openpose/Release'); + os.environ['PATH'] = os.environ['PATH'] + ';' + dir_path + '/../../x64/Release;' + dir_path + '/../../bin;' + import pyopenpose as op + else: + # Change these variables to point to the correct folder (Release/x64 etc.) + sys.path.append('../../python'); + # If you run `make install` (default path is `/usr/local/python` for Ubuntu), you can also access the OpenPose/python module from there. This will install OpenPose and the python library at your desired installation path. Ensure that this is in your python path in order to use it. + # sys.path.append('/usr/local/python') + from openpose import pyopenpose as op +except ImportError as e: + print('Error: OpenPose library could not be found. Did you enable `BUILD_PYTHON` in CMake and have this Python script in the right folder?') + raise e + +# Flags +parser = argparse.ArgumentParser() +parser.add_argument("--image_dir", default="../../../examples/media/", help="Process a directory of images. Read all standard formats (jpg, png, bmp, etc.).") +parser.add_argument("--no_display", default=False, help="Enable to disable the visual display.") +args = parser.parse_known_args() + +# Custom Params (refer to include/openpose/flags.hpp for more parameters) +params = dict() +params["model_folder"] = "../../../models/" + +# Add others in path? +for i in range(0, len(args[1])): + curr_item = args[1][i] + if i != len(args[1])-1: next_item = args[1][i+1] + else: next_item = "1" + if "--" in curr_item and "--" in next_item: + key = curr_item.replace('-','') + if key not in params: params[key] = "1" + elif "--" in curr_item and "--" not in next_item: + key = curr_item.replace('-','') + if key not in params: params[key] = next_item + +# Construct it from system arguments +# op.init_argv(args[1]) +# oppython = op.OpenposePython() + +# Starting OpenPose +opWrapper = op.WrapperPython() +opWrapper.configure(params) +opWrapper.start() + +# Read frames on directory +imagePaths = op.get_images_on_directory(args[0].image_dir); +start = time.time() + +# Process and display images +for imagePath in imagePaths: + datum = op.Datum() + imageToProcess = cv2.imread(imagePath) + datum.cvInputData = imageToProcess + opWrapper.emplaceAndPop([datum]) + + print("Body keypoints: \n" + str(datum.poseKeypoints)) + + if not args[0].no_display: + cv2.imshow("OpenPose 1.4.0 - Tutorial Python API", datum.cvOutputData) + key = cv2.waitKey(15) + if key == 27: break + +end = time.time() +print("OpenPose demo successfully finished. Total time: " + str(end - start) + " seconds") diff --git a/examples/tutorial_api_python/5_keypoints_from_images_multi_gpu.py b/examples/tutorial_api_python/5_keypoints_from_images_multi_gpu.py new file mode 100644 index 00000000..43defed0 --- /dev/null +++ b/examples/tutorial_api_python/5_keypoints_from_images_multi_gpu.py @@ -0,0 +1,103 @@ +# From Python +# It requires OpenCV installed for Python +import sys +import cv2 +import os +from sys import platform +import argparse +import time + +# Import Openpose (Windows/Ubuntu/OSX) +dir_path = os.path.dirname(os.path.realpath(__file__)) +try: + # Windows Import + if platform == "win32": + # Change these variables to point to the correct folder (Release/x64 etc.) + sys.path.append(dir_path + '/../../python/openpose/Release'); + os.environ['PATH'] = os.environ['PATH'] + ';' + dir_path + '/../../x64/Release;' + dir_path + '/../../bin;' + import pyopenpose as op + else: + # Change these variables to point to the correct folder (Release/x64 etc.) + sys.path.append('../../python'); + # If you run `make install` (default path is `/usr/local/python` for Ubuntu), you can also access the OpenPose/python module from there. This will install OpenPose and the python library at your desired installation path. Ensure that this is in your python path in order to use it. + # sys.path.append('/usr/local/python') + from openpose import pyopenpose as op +except ImportError as e: + print('Error: OpenPose library could not be found. Did you enable `BUILD_PYTHON` in CMake and have this Python script in the right folder?') + raise e + +# Flags +parser = argparse.ArgumentParser() +parser.add_argument("--image_dir", default="../../../examples/media/", help="Process a directory of images. Read all standard formats (jpg, png, bmp, etc.).") +parser.add_argument("--no_display", default=False, help="Enable to disable the visual display.") +args = parser.parse_known_args() + +# Custom Params (refer to include/openpose/flags.hpp for more parameters) +params = dict() +params["model_folder"] = "../../../models/" + +# Add others in path? +for i in range(0, len(args[1])): + curr_item = args[1][i] + if i != len(args[1])-1: next_item = args[1][i+1] + else: next_item = "1" + if "--" in curr_item and "--" in next_item: + key = curr_item.replace('-','') + if key not in params: params[key] = "1" + elif "--" in curr_item and "--" not in next_item: + key = curr_item.replace('-','') + if key not in params: params[key] = next_item + +# Construct it from system arguments +# op.init_argv(args[1]) +# oppython = op.OpenposePython() + +# Starting OpenPose +opWrapper = op.WrapperPython() +opWrapper.configure(params) +opWrapper.start() + +# Read frames on directory +imagePaths = op.get_images_on_directory(args[0].image_dir); + +# Read number of GPUs in your system +numberGPUs = op.get_gpu_number() +start = time.time() + +# Process and display images +for imageBaseId in range(0, len(imagePaths), numberGPUs): + + # Create datums + datums = [] + + # Read and push images into OpenPose wrapper + for gpuId in range(0, numberGPUs): + + imageId = imageBaseId+gpuId + if imageId < len(imagePaths): + + imagePath = imagePaths[imageBaseId+gpuId] + datum = op.Datum() + imageToProcess = cv2.imread(imagePath) + datum.cvInputData = imageToProcess + datums.append(datum) + opWrapper.waitAndEmplace([datums[-1]]) + + # Retrieve processed results from OpenPose wrapper + for gpuId in range(0, numberGPUs): + + imageId = imageBaseId+gpuId + if imageId < len(imagePaths): + + datum = datums[gpuId] + opWrapper.waitAndPop([datum]) + + print("Body keypoints: \n" + str(datum.poseKeypoints)) + + if not args[0].no_display: + cv2.imshow("OpenPose 1.4.0 - Tutorial Python API", datum.cvOutputData) + key = cv2.waitKey(15) + if key == 27: break + +end = time.time() +print("OpenPose demo successfully finished. Total time: " + str(end - start) + " seconds") diff --git a/examples/tutorial_api_python/6_face_from_image.py b/examples/tutorial_api_python/6_face_from_image.py new file mode 100644 index 00000000..659f3acf --- /dev/null +++ b/examples/tutorial_api_python/6_face_from_image.py @@ -0,0 +1,79 @@ +# From Python +# It requires OpenCV installed for Python +import sys +import cv2 +import os +from sys import platform +import argparse +import time + +# Import Openpose (Windows/Ubuntu/OSX) +dir_path = os.path.dirname(os.path.realpath(__file__)) +try: + # Windows Import + if platform == "win32": + # Change these variables to point to the correct folder (Release/x64 etc.) + sys.path.append(dir_path + '/../../python/openpose/Release'); + os.environ['PATH'] = os.environ['PATH'] + ';' + dir_path + '/../../x64/Release;' + dir_path + '/../../bin;' + import pyopenpose as op + else: + # Change these variables to point to the correct folder (Release/x64 etc.) + sys.path.append('../../python'); + # If you run `make install` (default path is `/usr/local/python` for Ubuntu), you can also access the OpenPose/python module from there. This will install OpenPose and the python library at your desired installation path. Ensure that this is in your python path in order to use it. + # sys.path.append('/usr/local/python') + from openpose import pyopenpose as op +except ImportError as e: + print('Error: OpenPose library could not be found. Did you enable `BUILD_PYTHON` in CMake and have this Python script in the right folder?') + raise e + +# Flags +parser = argparse.ArgumentParser() +parser.add_argument("--image_path", default="../../../examples/media/COCO_val2014_000000000241.jpg", help="Process an image. Read all standard formats (jpg, png, bmp, etc.).") +args = parser.parse_known_args() + +# Custom Params (refer to include/openpose/flags.hpp for more parameters) +params = dict() +params["model_folder"] = "../../../models/" +params["face"] = True +params["face_detector"] = 2 +params["body_disable"] = True + +# Add others in path? +for i in range(0, len(args[1])): + curr_item = args[1][i] + if i != len(args[1])-1: next_item = args[1][i+1] + else: next_item = "1" + if "--" in curr_item and "--" in next_item: + key = curr_item.replace('-','') + if key not in params: params[key] = "1" + elif "--" in curr_item and "--" not in next_item: + key = curr_item.replace('-','') + if key not in params: params[key] = next_item + +# Construct it from system arguments +# op.init_argv(args[1]) +# oppython = op.OpenposePython() + +# Starting OpenPose +opWrapper = op.WrapperPython() +opWrapper.configure(params) +opWrapper.start() + +# Read image and face rectangle locations +imageToProcess = cv2.imread(args[0].image_path) +faceRectangles = [ + op.Rectangle(330.119385, 277.532715, 48.717274, 48.717274), + op.Rectangle(24.036991, 267.918793, 65.175171, 65.175171), + op.Rectangle(151.803436, 32.477852, 108.295761, 108.295761), +] + +# Create new datum +datum = op.Datum() +datum.cvInputData = imageToProcess +datum.faceRectangles = faceRectangles + +# Process and display image +opWrapper.emplaceAndPop([datum]) +print("Face keypoints: \n" + str(datum.faceKeypoints)) +cv2.imshow("OpenPose 1.4.0 - Tutorial Python API", datum.cvOutputData) +cv2.waitKey(0) diff --git a/examples/tutorial_api_python/7_hand_from_image.py b/examples/tutorial_api_python/7_hand_from_image.py new file mode 100644 index 00000000..2cba900d --- /dev/null +++ b/examples/tutorial_api_python/7_hand_from_image.py @@ -0,0 +1,92 @@ +# From Python +# It requires OpenCV installed for Python +import sys +import cv2 +import os +from sys import platform +import argparse +import time + +# Import Openpose (Windows/Ubuntu/OSX) +dir_path = os.path.dirname(os.path.realpath(__file__)) +try: + # Windows Import + if platform == "win32": + # Change these variables to point to the correct folder (Release/x64 etc.) + sys.path.append(dir_path + '/../../python/openpose/Release'); + os.environ['PATH'] = os.environ['PATH'] + ';' + dir_path + '/../../x64/Release;' + dir_path + '/../../bin;' + import pyopenpose as op + else: + # Change these variables to point to the correct folder (Release/x64 etc.) + sys.path.append('../../python'); + # If you run `make install` (default path is `/usr/local/python` for Ubuntu), you can also access the OpenPose/python module from there. This will install OpenPose and the python library at your desired installation path. Ensure that this is in your python path in order to use it. + # sys.path.append('/usr/local/python') + from openpose import pyopenpose as op +except ImportError as e: + print('Error: OpenPose library could not be found. Did you enable `BUILD_PYTHON` in CMake and have this Python script in the right folder?') + raise e + +# Flags +parser = argparse.ArgumentParser() +parser.add_argument("--image_path", default="../../../examples/media/COCO_val2014_000000000241.jpg", help="Process an image. Read all standard formats (jpg, png, bmp, etc.).") +args = parser.parse_known_args() + +# Custom Params (refer to include/openpose/flags.hpp for more parameters) +params = dict() +params["model_folder"] = "../../../models/" +params["hand"] = True +params["hand_detector"] = 2 +params["body_disable"] = True + +# Add others in path? +for i in range(0, len(args[1])): + curr_item = args[1][i] + if i != len(args[1])-1: next_item = args[1][i+1] + else: next_item = "1" + if "--" in curr_item and "--" in next_item: + key = curr_item.replace('-','') + if key not in params: params[key] = "1" + elif "--" in curr_item and "--" not in next_item: + key = curr_item.replace('-','') + if key not in params: params[key] = next_item + +# Construct it from system arguments +# op.init_argv(args[1]) +# oppython = op.OpenposePython() + +# Starting OpenPose +opWrapper = op.WrapperPython() +opWrapper.configure(params) +opWrapper.start() + +# Read image and face rectangle locations +imageToProcess = cv2.imread(args[0].image_path) +handRectangles = [ + # Left/Right hands person 0 + [ + op.Rectangle(320.035889, 377.675049, 69.300949, 69.300949), + op.Rectangle(0., 0., 0., 0.), + ], + # Left/Right hands person 1 + [ + op.Rectangle(80.155792, 407.673492, 80.812706, 80.812706), + op.Rectangle(46.449715, 404.559753, 98.898178, 98.898178), + ], + # Left/Right hands person 2 + [ + op.Rectangle(185.692673, 303.112244, 157.587555, 157.587555), + op.Rectangle(88.984360, 268.866547, 117.818230, 117.818230), + ] +] + +# Create new datum +datum = op.Datum() +datum.cvInputData = imageToProcess +datum.handRectangles = handRectangles + +# Process and display image +opWrapper.emplaceAndPop([datum]) +print("Left hand keypoints: \n" + str(datum.handKeypoints[0])) +print("Right hand keypoints: \n" + str(datum.handKeypoints[1])) +cv2.imshow("OpenPose 1.4.0 - Tutorial Python API", datum.cvOutputData) +cv2.waitKey(0) diff --git a/examples/tutorial_api_python/CMakeLists.txt b/examples/tutorial_api_python/CMakeLists.txt index 0ee5be18..3a60581b 100644 --- a/examples/tutorial_api_python/CMakeLists.txt +++ b/examples/tutorial_api_python/CMakeLists.txt @@ -3,3 +3,7 @@ configure_file(openpose_python.py openpose_python.py) configure_file(1_body_from_image.py 1_body_from_image.py) configure_file(2_whole_body_from_image.py 2_whole_body_from_image.py) configure_file(3_heatmaps_from_image.py 3_heatmaps_from_image.py) +configure_file(4_keypoints_from_images.py 4_keypoints_from_images.py) +configure_file(5_keypoints_from_images_multi_gpu.py 5_keypoints_from_images_multi_gpu.py) +configure_file(6_face_from_image.py 6_face_from_image.py) +configure_file(7_hand_from_image.py 7_hand_from_image.py) diff --git a/python/openpose/openpose_python.cpp b/python/openpose/openpose_python.cpp index 67e664f1..a2e7d2fb 100644 --- a/python/openpose/openpose_python.cpp +++ b/python/openpose/openpose_python.cpp @@ -170,13 +170,32 @@ public: auto datumsPtr = std::make_shared>>(l); opWrapper->emplaceAndPop(datumsPtr); } + + void waitAndEmplace(std::vector>& l) + { + auto datumsPtr = std::make_shared>>(l); + opWrapper->waitAndEmplace(datumsPtr); + } + + bool waitAndPop(std::vector>& l) + { + auto datumsPtr = std::make_shared>>(l); + return opWrapper->waitAndPop(datumsPtr); + } }; +std::vector getImagesFromDirectory(const std::string& directoryPath) +{ + return op::getFilesOnDirectory(directoryPath, op::Extensions::Images); +} + PYBIND11_MODULE(pyopenpose, m) { // Functions for Init Params m.def("init_int", &init_int, "Init Function"); m.def("init_argv", &init_argv, "Init Function"); + m.def("get_gpu_number", &op::getGpuNumber, "Get Total GPU"); + m.def("get_images_on_directory", &op::getImagesFromDirectory, "Get Images On Directory"); // OpenposePython py::class_(m, "WrapperPython") @@ -187,6 +206,8 @@ PYBIND11_MODULE(pyopenpose, m) { .def("stop", &WrapperPython::stop) .def("execute", &WrapperPython::exec) .def("emplaceAndPop", &WrapperPython::emplaceAndPop) + .def("waitAndEmplace", &WrapperPython::waitAndEmplace) + .def("waitAndPop", &WrapperPython::waitAndPop) ; // Datum Object