From f9a886a1b42d3b090ff496fed93ab0558cf99a81 Mon Sep 17 00:00:00 2001 From: Kostia Date: Thu, 5 Nov 2015 16:19:18 +0100 Subject: [PATCH 1/8] python interface mac os --- cmake/Modules/FindCLANDMARK.cmake | 29 ++++++------- cmake/Modules/FindFLANDMARK.cmake | 63 +++++++++++++++++++++++++++++ python_interface/CMakeLists.txt | 7 +++- python_interface/bin/CMakeLists.txt | 2 +- python_interface/src/CMakeLists.txt | 7 ++-- 5 files changed, 88 insertions(+), 20 deletions(-) create mode 100644 cmake/Modules/FindFLANDMARK.cmake diff --git a/cmake/Modules/FindCLANDMARK.cmake b/cmake/Modules/FindCLANDMARK.cmake index 7c66470..a55c4d6 100644 --- a/cmake/Modules/FindCLANDMARK.cmake +++ b/cmake/Modules/FindCLANDMARK.cmake @@ -26,27 +26,28 @@ find_path(CLANDMARK_INCLUDE_DIR CLandmark.h) -set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".dll") +set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".dll" ".dylib") find_library(CLANDMARK_LIBRARY_STATIC NAMES clandmark) set(CMAKE_FIND_LIBRARY_PREFIXES "lib") set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".lib") find_library(CLANDMARK_LIBRARY_SHARED NAMES clandmark) -if(CLANDMARK_LIBRARY_STATIC and CLANDMARK_LIBRARY_SHARED) - if(CLANDMARK_PREFER_STATIC) - set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC}) - else() - set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_SHARED}) - endif() -elseif(CLANDMARK_LIBRARY_STATIC) - set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC}) -elseif(CLANDMARK_LIBRARY_SHARED) - set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_SHARED}) -else() - set(CLANDMARK_LIBRARY "CLANDMARK_LIBRARY-NOTFOUND") -endif() +#if(CLANDMARK_LIBRARY_STATIC and CLANDMARK_LIBRARY_SHARED) +# if(CLANDMARK_PREFER_STATIC) +# set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC}) +# else() +# set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_SHARED}) +# endif() +#elseif(CLANDMARK_LIBRARY_STATIC) +# set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC}) +#elseif(CLANDMARK_LIBRARY_SHARED) +# set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_SHARED}) +#else() +# set(CLANDMARK_LIBRARY "CLANDMARK_LIBRARY-NOTFOUND") +#endif() +set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC}) set(CLANDMARK_LIBRARIES ${CLANDMARK_LIBRARY}) set(CLANDMARK_INCLUDE_DIRS ${CLANDMARK_INCLUDE_DIR}) diff --git a/cmake/Modules/FindFLANDMARK.cmake b/cmake/Modules/FindFLANDMARK.cmake new file mode 100644 index 0000000..730b5ba --- /dev/null +++ b/cmake/Modules/FindFLANDMARK.cmake @@ -0,0 +1,63 @@ +# - Try to find the flandmark landmark detector library +# +# ============================================================================= +# Once done this will define: +# +# FLANDMARK_FOUND TRUE if found; FALSE otherwise +# FLANDMARK_INCLUDE_DIRS where to find flandmark_detector.h +# FLANDMARK_LIBRARIES the libraries to link against +# +# ============================================================================= +# Variables used by this module: +# +# FLANDMARK_PREFER_STATIC If TRUE and available, link against the static +# flandmark library. Otherwise select the shared +# version +# +# ============================================================================= +# To use this from another project: +# +# create a directory named cmake/Modules under the project root, copy this file +# (FindFLANDMARK.cmake) there, and in the top-level CMakeLists.txt include: +# set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} +# "${CMAKE_SOURCE_DIR}/cmake/Modules/") +# +# ============================================================================= + +find_path(FLANDMARK_INCLUDE_DIR Flandmark.h) + +set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".dll" ".dylib") +find_library(FLANDMARK_LIBRARY_STATIC NAMES flandmark) + +set(CMAKE_FIND_LIBRARY_PREFIXES "lib") +set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".lib") +find_library(FLANDMARK_LIBRARY_SHARED NAMES flandmark) + +#if(FLANDMARK_LIBRARY_STATIC and FLANDMARK_LIBRARY_SHARED) +# if(FLANDMARK_PREFER_STATIC) +# set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_STATIC}) +# else() +# set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_SHARED}) +# endif() +#elseif(FLANDMARK_LIBRARY_STATIC) +# set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_STATIC}) +#elseif(FLANDMARK_LIBRARY_SHARED) +# set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_SHARED}) +#else() +# set(FLANDMARK_LIBRARY "FLANDMARK_LIBRARY-NOTFOUND") +#endif() + +set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_STATIC}) +set(FLANDMARK_LIBRARIES ${FLANDMARK_LIBRARY}) +set(FLANDMARK_INCLUDE_DIRS ${FLANDMARK_INCLUDE_DIR}) + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set FLANDMARK_FOUND to TRUE +# if all listed variables are TRUE +find_package_handle_standard_args( + FLANDMARK + DEFAULT_MSG + FLANDMARK_LIBRARY FLANDMARK_INCLUDE_DIR +) + +mark_as_advanced(FLANDMARK_INCLUDE_DIR FLANDMARK_LIBRARY) diff --git a/python_interface/CMakeLists.txt b/python_interface/CMakeLists.txt index d0eefa6..3cf0df5 100644 --- a/python_interface/CMakeLists.txt +++ b/python_interface/CMakeLists.txt @@ -9,8 +9,11 @@ include_directories( include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) #include_directories( ${PROJECT_SOURCE_DIR}/libclandmark ) -#include_directories( ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13 ) -#include_directories( ${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6 ) +include_directories( ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13 ) +include_directories( ${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6 ) +execute_process(COMMAND python -c "import numpy as np; print np.get_include()" OUTPUT_VARIABLE NUMPY_INCLUDE) +include_directories(${NUMPY_INCLUDE}) + set(PY_NAME_interface python_interface) diff --git a/python_interface/bin/CMakeLists.txt b/python_interface/bin/CMakeLists.txt index 6ad45a9..fa91de2 100644 --- a/python_interface/bin/CMakeLists.txt +++ b/python_interface/bin/CMakeLists.txt @@ -3,7 +3,7 @@ # If the pyx file is a C++ file, we should specify that here. set_source_files_properties( ${PROJECT_SOURCE_DIR}/python_interface/src/py_flandmark.pyx PROPERTIES CYTHON_IS_CXX TRUE ) -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-undefined,-rpath,'$ORIGIN/' " ) +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath,'$ORIGIN/' " ) cython_add_standalone_executable( flandmark-demo MAIN_MODULE flandmark_demo.py diff --git a/python_interface/src/CMakeLists.txt b/python_interface/src/CMakeLists.txt index f5cd888..9df0d70 100644 --- a/python_interface/src/CMakeLists.txt +++ b/python_interface/src/CMakeLists.txt @@ -16,14 +16,15 @@ target_link_libraries( py_flandmark ${FLANDMARK_LIBRARIES} ${CLANDMARK_LIBRARIES add_custom_target(${PY_NAME_interface} ALL DEPENDS py_flandmark) #TODO: copy libclandmark and libflandmark + add_custom_command( TARGET ${PY_NAME_interface} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/py_flandmark.so ${PROJECT_BINARY_DIR}/python_interface/bin - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/py_featurePool.so ${PROJECT_BINARY_DIR}/python_interface/bin +# COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/py_featurePool.so ${PROJECT_BINARY_DIR}/python_interface/bin # COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/libclandmark/libclandmark${CMAKE_SHARED_LIBRARY_SUFFIX}.${clandmark_VERSION_MAJOR} ${PROJECT_BINARY_DIR}/python_interface/bin # COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/libclandmark/libflandmark${CMAKE_SHARED_LIBRARY_SUFFIX}.${clandmark_VERSION_MAJOR} ${PROJECT_BINARY_DIR}/python_interface/bin - COMMAND ${CMAKE_COMMAND} -E copy ${FLANDMARK_LIBRARIES} ${PROJECT_BINARY_DIR}/python_interface/bin - COMMAND ${CMAKE_COMMAND} -E copy ${CLANDMARK_LIBRARIES} ${PROJECT_BINARY_DIR}/python_interface/bin +# COMMAND ${CMAKE_COMMAND} -E copy ${FLANDMARK_LIBRARIES} ${PROJECT_BINARY_DIR}/python_interface/bin +# COMMAND ${CMAKE_COMMAND} -E copy ${CLANDMARK_LIBRARIES} ${PROJECT_BINARY_DIR}/python_interface/bin COMMENT "Copying python_interface/src/py_flandmark${CMAKE_SHARED_LIBRARY_SUFFIX}" ) From db38c9c0dda989b19de94aa25df3117d5cf7143a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20U=C5=99i=C4=8D=C3=A1=C5=99?= Date: Mon, 25 Jul 2016 09:11:22 +0200 Subject: [PATCH 2/8] Update README.md Paper2cite changed to more relevant IMAVIS paper. --- README.md | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d533200..139f557 100644 --- a/README.md +++ b/README.md @@ -23,14 +23,24 @@ Otherwise, the internal version will be used and its files will be installed alo In case you use clandmark in an academic work, please cite the following paper: ```tex -@InProceedings{ - author = {U{\v{r}}i{\v{c}}{\'{a}}{\v{r}}, Michal and Franc, Vojt{\v{e}}ch and Thomas, Diego and Sugimoto, Akihiro and Hlav{\'{a}}{\v{c}}, V{\'{a}}clav}, - title = {{Real-time Multi-view Facial Landmark Detector Learned by the Structured Output SVM}}, - year = {2015}, - booktitle = {BWILD '15: Biometrics in the Wild 2015 (IEEE FG 2015 Workshop)}, - venue = {Ljubljana, Slovenia} - www = {http://luks.fe.uni-lj.si/bwild15}, +@article{Uricar-IMAVIS-2016, + author = {U{\v{r}}i{\v{c}}{\'{a}}{\v{r}}, Michal and + Franc, Vojt{\v{e}}ch and Thomas, Diego and Sugimoto, Akihiro and Hlav{\'{a}}{\v{c}}, V{\'{a}}clav }, + title = {Multi-view facial landmark detector learned by the Structured Output {SVM}}, + journal = {Image and Vision Computing}, + volume = {47}, + pages = {45--59}, + year = {2016}, + month = {March}, + note = {300-W, the First Automatic Facial Landmark Detection in-the-Wild Challenge}, + issn = {0262-8856}, + doi = {http://dx.doi.org/10.1016/j.imavis.2016.02.004}, + url = {http://www.sciencedirect.com/science/article/pii/S0262885616300105}, + publisher = {Elsevier}, + address = {Amsterdam, Netherlands}, + keywords = {Deformable Part Models, Structured output SVM, Facial landmarks detection }, } + ``` Visit http://cmp.felk.cvut.cz/~uricamic/clandmark for further information. From ecc0f7b44579ec605b67769e452e1c09c4900da1 Mon Sep 17 00:00:00 2001 From: jiapei100 Date: Wed, 10 Aug 2016 22:38:32 -0700 Subject: [PATCH 3/8] python2 to python3 --- python_interface/bin/flandmark_demo.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/python_interface/bin/flandmark_demo.py b/python_interface/bin/flandmark_demo.py index 3fa3b27..0fcd03a 100644 --- a/python_interface/bin/flandmark_demo.py +++ b/python_interface/bin/flandmark_demo.py @@ -25,7 +25,7 @@ def read_bbox_from_txt(file_name): f = open(file_name) str = f.read().replace(',', ' ') f.close() - ret = np.array(map(int,str.split()) ,dtype=np.int32) + ret = np.array(list(map(int,str.split())) ,dtype=np.int32) ret = ret.reshape((2,2), order='F') return ret @@ -45,13 +45,13 @@ def read_bbox_from_txt(file_name): d_landmarks = flmrk.detect(arr, bbox) n = d_landmarks.shape[1] - print "test detect method" + print("test detect method") im = Image.fromarray(arr) img_dr = ImageDraw.Draw(im) img_dr.rectangle([tuple(bbox[:,0]), tuple(bbox[:,1])], outline="#FF00FF") r = 2. - for i in xrange(n): + for i in range(n): x = d_landmarks[0,i] y = d_landmarks[1,i] img_dr.ellipse((x-r, y-r, x+r, y+r), fill=0.) @@ -59,7 +59,7 @@ def read_bbox_from_txt(file_name): plt.imshow(np.asarray(im), cmap = plt.get_cmap('gray')) plt.show() - print "test get_normalized_frame method" + print("test get_normalized_frame method") frame = flmrk.get_normalized_frame(arr, bbox)[0] frame = frame.astype(np.double) @@ -67,7 +67,7 @@ def read_bbox_from_txt(file_name): plt.imshow(np.asarray(im), cmap = plt.get_cmap('gray')) plt.show() - print "test detect_base method" + print("test detect_base method") landmarks = flmrk.detect_base(frame) @@ -75,7 +75,7 @@ def read_bbox_from_txt(file_name): img_dr = ImageDraw.Draw(im) r = 2. - for i in xrange(n): + for i in range(n): x = landmarks[0, i] y = landmarks[1, i] img_dr.ellipse((x-r, y-r, x+r, y+r), fill=0.) @@ -83,7 +83,7 @@ def read_bbox_from_txt(file_name): plt.imshow(np.asarray(im), cmap = plt.get_cmap('gray')) plt.show() - print "test psi method" + print("test psi method") # psi = flmrk.get_psi(frame, landmarks.astype(np.int32), bbox) psi = flmrk.get_psi(landmarks, frame, bbox) From d88842a8c2d824586a88abaca07f3516184933d2 Mon Sep 17 00:00:00 2001 From: jiapei100 Date: Thu, 11 Aug 2016 00:42:50 -0700 Subject: [PATCH 4/8] Remove all 'using namespace' --- examples/video_input.cpp | 82 ++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/examples/video_input.cpp b/examples/video_input.cpp index b21c6d5..c47ea31 100644 --- a/examples/video_input.cpp +++ b/examples/video_input.cpp @@ -21,15 +21,13 @@ #include "Flandmark.h" #include "helpers.h" -using namespace std; -using namespace cv; -using namespace clandmark; + /** Global variables */ -String face_cascade_name = "haarcascade_frontalface_alt.xml"; -CascadeClassifier face_cascade; -string window_name = "flandmark - video input"; -RNG rng(12345); +cv::String face_cascade_name = "haarcascade_frontalface_alt.xml"; +cv::CascadeClassifier face_cascade; +std::string window_name = "flandmark - video input"; +cv::RNG rng(12345); cimg_library::CImg * cvImgToCImg(cv::Mat &cvImg) @@ -45,7 +43,7 @@ cimg_library::CImg * cvImgToCImg(cv::Mat &cvImg) cv::Mat & CImgtoCvImg(cv::Mat &result, cimg_library::CImg *img) { - result = cv::Mat(img->height(), img->width(), CV_8U); + result = cv::Mat(img->height(), img->width(), CV_8U); for (int x=0; x < result.cols; ++x) for (int y=0; y < result.rows; ++y) @@ -55,20 +53,20 @@ cv::Mat & CImgtoCvImg(cv::Mat &result, cimg_library::CImg *img) } /** @function detectAndDisplay */ -void detectAndDisplay( Mat &frame, Flandmark *flandmark) +void detectAndDisplay( cv::Mat &frame, clandmark::Flandmark *flandmark) { - std::vector faces; - Mat frame_gray; + std::vector faces; + cv::Mat frame_gray; // int bbox[4]; int bbox[8]; - fl_double_t *landmarks; + clandmark::fl_double_t *landmarks; - cvtColor( frame, frame_gray, CV_BGR2GRAY ); + cv::cvtColor( frame, frame_gray, CV_BGR2GRAY ); // cvtColor( frame, frame_gray, COLOR_BGR2GRAY ); - equalizeHist( frame_gray, frame_gray ); + cv::equalizeHist( frame_gray, frame_gray ); //-- Detect faces - face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) ); + face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, cv::Size(30, 30) ); // face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30) ); // CImage *frm_gray = new CImage(); @@ -96,17 +94,17 @@ void detectAndDisplay( Mat &frame, Flandmark *flandmark) landmarks = flandmark->getLandmarks(); // Draw bounding box and detected landmarks -// rectangle(frame, Point(bbox[0], bbox[1]), Point(bbox[2], bbox[3]), Scalar(255, 0, 0)); - circle(frame, Point(int(landmarks[0]), int(landmarks[1])), 2, Scalar(255, 0, 0), -1); +// cv::Rectangle(frame, Point(bbox[0], bbox[1]), Point(bbox[2], bbox[3]), Scalar(255, 0, 0)); + cv::circle(frame, cv::Point(int(landmarks[0]), int(landmarks[1])), 2, cv::Scalar(255, 0, 0), -1); for (int i=2; i < 2*flandmark->getLandmarksCount(); i+=2) { - circle(frame, Point(int(landmarks[i]), int(landmarks[i+1])), 2, Scalar(0, 0, 255), -1); + cv::circle(frame, cv::Point(int(landmarks[i]), int(landmarks[i+1])), 2, cv::Scalar(0, 0, 255), -1); } // Textual output - printTimingStats(flandmark->timings); - printLandmarks(landmarks, flandmark->getLandmarksCount()); - printLandmarks(flandmark->getLandmarksNF(), flandmark->getLandmarksCount()); + clandmark::printTimingStats(flandmark->timings); + clandmark::printLandmarks(landmarks, flandmark->getLandmarksCount()); + clandmark::printLandmarks(flandmark->getLandmarksNF(), flandmark->getLandmarksCount()); } // delete frm_gray; @@ -117,36 +115,36 @@ int main( int argc, const char** argv ) { if (argc < 5) { - cerr << "Usage: video_input { cam | vid } [ filename | cam_id ] [ output_filename ]" << endl; + std::cerr << "Usage: video_input { cam | vid } [ filename | cam_id ] [ output_filename ]" << std::endl; return -1; } //CvCapture* capture = 0x0; //CvVideoWriter* writer = 0x0; - VideoCapture capture; - VideoWriter writer; + cv::VideoCapture capture; + cv::VideoWriter writer; - Mat frame; + cv::Mat frame; double tic; int camID = -1; - string str_type = argv[3]; + std::string str_type = argv[3]; int type = -1; bool saveoutput = false; - string out_fname; + std::string out_fname; - Flandmark *flandmark = Flandmark::getInstanceOf(argv[2]); + clandmark::Flandmark *flandmark = clandmark::Flandmark::getInstanceOf(argv[2]); if (!flandmark) { - cerr << "Usage: video_input { cam | vid } [ filename | cam_id ] [ output_filename ]" << endl; + std::cerr << "Usage: video_input { cam | vid } [ filename | cam_id ] [ output_filename ]" << std::endl; return -1; } //-- 1. Load the cascades if( !face_cascade.load( argv[1]+face_cascade_name ) ) { - cerr << "Couldn't load the haar cascade. Exiting..." << endl; + std::cerr << "Couldn't load the haar cascade. Exiting..." << std::endl; return -1; }; @@ -171,14 +169,14 @@ int main( int argc, const char** argv ) capture.open(argv[4]); break; default: - cerr << "Usage: video_input { cam | vid } [ filename | cam_id ] [ output_filename ]" << endl; + std::cerr << "Usage: video_input { cam | vid } [ filename | cam_id ] [ output_filename ]" << std::endl; return -1; break; } if (!capture.isOpened()) { - cerr << "Could not open the video input. Exiting..." << endl; + std::cerr << "Could not open the video input. Exiting..." << std::endl; return -1; } @@ -186,7 +184,7 @@ int main( int argc, const char** argv ) if (frame.empty()) { - cerr << "Unable to read frame. Exiting..." << endl; + std::cerr << "Unable to read frame. Exiting..." << std::endl; return -1; } @@ -203,14 +201,14 @@ int main( int argc, const char** argv ) //CV_FOURCC('M', 'J', 'P', 'G'), capture.get(CV_CAP_PROP_FPS), // capture.get(CAP_PROP_FPS), - Size(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT)) + cv::Size(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT)) // Size(capture.get(CAP_PROP_FRAME_WIDTH), capture.get(CAP_PROP_FRAME_HEIGHT)) ); } } // window - namedWindow(window_name, CV_WINDOW_KEEPRATIO); + cv::namedWindow(window_name, CV_WINDOW_KEEPRATIO); // namedWindow(window_name, WINDOW_KEEPRATIO); //-- 2. Read the video stream @@ -218,7 +216,7 @@ int main( int argc, const char** argv ) { while( true ) { - tic = (double)getTickCount(); + tic = (double)cv::getTickCount(); capture >> frame; @@ -227,17 +225,17 @@ int main( int argc, const char** argv ) { detectAndDisplay( frame, flandmark ); - tic = ((double)getTickCount() - tic)/getTickFrequency() * 1000; + tic = ((double)cv::getTickCount() - tic)/cv::getTickFrequency() * 1000; - stringstream fps; - fps << "fps: " << setprecision(4) << setw(4) << 1000.0 / tic << " "; - putText(frame, fps.str(), Point(10, 25), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 0)); + std::stringstream fps; + fps << "fps: " << std::setprecision(4) << std::setw(4) << 1000.0 / tic << " "; + cv::putText(frame, fps.str(), cv::Point(10, 25), CV_FONT_HERSHEY_COMPLEX, 1, cv::Scalar(255, 255, 0)); // putText(frame, fps.str(), Point(10, 25), FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 0)); imshow( window_name, frame ); } else { - cerr << "No frame --- break." << endl; + std::cerr << "No frame --- break." << std::endl; break; } @@ -246,7 +244,7 @@ int main( int argc, const char** argv ) writer << frame; } - int c = waitKey(10); + int c = cv::waitKey(10); if( (char)c == 'c' ) { break; From dd9260b9c5aa6a72090e46e3cb69144773b912ef Mon Sep 17 00:00:00 2001 From: jiapei100 Date: Thu, 11 Aug 2016 00:52:49 -0700 Subject: [PATCH 5/8] Remove all 'using namespace' --- examples/static_input.cpp | 63 +++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 33 deletions(-) diff --git a/examples/static_input.cpp b/examples/static_input.cpp index 6a9c3cc..d33e71c 100644 --- a/examples/static_input.cpp +++ b/examples/static_input.cpp @@ -23,16 +23,13 @@ #define SHOW_WINDOWS -using namespace std; -using namespace cv; -using namespace clandmark; /** Global variables */ //String face_cascade_name = "lbpcascade_frontalface.xml"; -String face_cascade_name = "haarcascade_frontalface_alt.xml"; -CascadeClassifier face_cascade; -string window_name = "flandmark - static input demo"; -RNG rng(12345); +cv::String face_cascade_name = "haarcascade_frontalface_alt.xml"; +cv::CascadeClassifier face_cascade; +std::string window_name = "flandmark - static input demo"; +cv::RNG rng(12345); cimg_library::CImg * cvImgToCImg(cv::Mat &cvImg) { @@ -57,19 +54,19 @@ cv::Mat & CImgtoCvImg(cv::Mat &result, cimg_library::CImg *img) } /** @function detectAndDisplay */ -void detectAndDisplay( Mat &frame, Flandmark *flandmark, CFeaturePool *featurePool) +void detectAndDisplay( cv::Mat &frame, clandmark::Flandmark *flandmark, clandmark::CFeaturePool *featurePool) { - std::vector faces; - Mat frame_gray; + std::vector faces; + cv::Mat frame_gray; int bbox[8]; - fl_double_t *landmarks; + clandmark::fl_double_t *landmarks; - cvtColor( frame, frame_gray, CV_BGR2GRAY ); + cv::cvtColor( frame, frame_gray, CV_BGR2GRAY ); // cvtColor( frame, frame_gray, COLOR_BGR2GRAY ); // <- OpenCV 3.0 //equalizeHist( frame_gray, frame_gray ); //-- Detect faces - face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) ); + face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, cv::Size(30, 30) ); // face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30) ); for( uint32_t i = 0; i < faces.size(); i++ ) @@ -97,21 +94,21 @@ void detectAndDisplay( Mat &frame, Flandmark *flandmark, CFeaturePool *featurePo // Draw bounding box and detected landmarks // rectangle(frame, Point(bbox[0], bbox[1]), Point(bbox[2], bbox[3]), Scalar(255, 0, 0)); - circle(frame, Point(int(landmarks[0]), int(landmarks[1])), 2, Scalar(255, 0, 0), -1); + cv::circle(frame, cv::Point(int(landmarks[0]), int(landmarks[1])), 2, cv::Scalar(255, 0, 0), -1); for (int i=2; i < 2*flandmark->getLandmarksCount(); i+=2) { - circle(frame, Point(int(landmarks[i]), int(landmarks[i+1])), 2, Scalar(0, 0, 255), -1); + cv::circle(frame, cv::Point(int(landmarks[i]), int(landmarks[i+1])), 2, cv::Scalar(0, 0, 255), -1); } // Textual output - printTimingStats(flandmark->timings); - printLandmarks(landmarks, flandmark->getLandmarksCount()); - printLandmarks(flandmark->getLandmarksNF(), flandmark->getLandmarksCount()); + clandmark::printTimingStats(flandmark->timings); + clandmark::printLandmarks(landmarks, flandmark->getLandmarksCount()); + clandmark::printLandmarks(flandmark->getLandmarksNF(), flandmark->getLandmarksCount()); } //-- Show what you got #ifdef SHOW_WINDOWS - imshow( window_name, frame ); + cv::imshow( window_name, frame ); #endif } @@ -120,27 +117,27 @@ int main( int argc, const char** argv ) { if (argc < 4) { - cerr << "Usage: static_input []" << endl; + std::cerr << "Usage: static_input []" << std::endl; return -1; } double tim; - Mat image; + cv::Mat image; //Flandmark *flandmark = new Flandmark(); - tim = (double)getTickCount(); + tim = (double)cv::getTickCount(); - Flandmark *flandmark = Flandmark::getInstanceOf(argv[2]); + clandmark::Flandmark *flandmark = clandmark::Flandmark::getInstanceOf(argv[2]); if (!flandmark) { - cerr << "Usage: static_input []" << endl; + std::cerr << "Usage: static_input []" << std::endl; return -1; } - CFeaturePool *featurePool = new CFeaturePool(flandmark->getBaseWindowSize()[0], flandmark->getBaseWindowSize()[1]); + clandmark::CFeaturePool *featurePool = new clandmark::CFeaturePool(flandmark->getBaseWindowSize()[0], flandmark->getBaseWindowSize()[1]); featurePool->addFeaturesToPool( - new CSparseLBPFeatures( + new clandmark::CSparseLBPFeatures( featurePool->getWidth(), featurePool->getHeight(), featurePool->getPyramidLevels(), @@ -150,9 +147,9 @@ int main( int argc, const char** argv ) flandmark->setNFfeaturesPool(featurePool); - tim = ((double)getTickCount() - tim)/getTickFrequency() * 1000; + tim = ((double)cv::getTickCount() - tim)/cv::getTickFrequency() * 1000; - cout << "Flandmark model loaded in " << tim << " ms" << endl; + std::cout << "Flandmark model loaded in " << tim << " ms" << std::endl; //-- 1. Load the cascades if( !face_cascade.load( argv[1]+face_cascade_name ) ) @@ -162,27 +159,27 @@ int main( int argc, const char** argv ) }; #ifdef SHOW_WINDOWS - namedWindow(window_name, CV_WINDOW_KEEPRATIO); + cv::namedWindow(window_name, CV_WINDOW_KEEPRATIO); // //namedWindow(window_name, WINDOW_KEEPRATIO); #endif // Read input image - image = imread(argv[3]); + image = cv::imread(argv[3]); if (!image.empty()) { detectAndDisplay( image, flandmark, featurePool ); } else { - cout << "Wrong input." << endl; + std::cout << "Wrong input." << std::endl; } if (argc > 4) { - imwrite(argv[4], image); + cv::imwrite(argv[4], image); } #ifdef SHOW_WINDOWS - waitKey(); + cv::waitKey(); #endif delete featurePool; From 73b694da245e136d0b09d43a0b17fe8677c9e55e Mon Sep 17 00:00:00 2001 From: Michal Uricar Date: Mon, 22 Aug 2016 15:51:42 +0200 Subject: [PATCH 6/8] Python Interface & CMake fixes --- ...indCLANDMARK.cmake => Findclandmark.cmake} | 13 ++++---- ...indFLANDMARK.cmake => Findflandmark.cmake} | 13 ++++---- libclandmark/CMakeLists.txt | 31 ++++++++++--------- libclandmark/clandmarkConfig.cmake.in | 5 --- libclandmark/flandmarkConfig.cmake.in | 5 --- python_interface/CMakeLists.txt | 5 +-- python_interface/src/CMakeLists.txt | 4 +-- 7 files changed, 35 insertions(+), 41 deletions(-) rename cmake/Modules/{FindCLANDMARK.cmake => Findclandmark.cmake} (92%) rename cmake/Modules/{FindFLANDMARK.cmake => Findflandmark.cmake} (92%) delete mode 100644 libclandmark/clandmarkConfig.cmake.in delete mode 100644 libclandmark/flandmarkConfig.cmake.in diff --git a/cmake/Modules/FindCLANDMARK.cmake b/cmake/Modules/Findclandmark.cmake similarity index 92% rename from cmake/Modules/FindCLANDMARK.cmake rename to cmake/Modules/Findclandmark.cmake index a55c4d6..e423c5a 100644 --- a/cmake/Modules/FindCLANDMARK.cmake +++ b/cmake/Modules/Findclandmark.cmake @@ -27,11 +27,11 @@ find_path(CLANDMARK_INCLUDE_DIR CLandmark.h) set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".dll" ".dylib") -find_library(CLANDMARK_LIBRARY_STATIC NAMES clandmark) +find_library(CLANDMARK_LIBRARY_SHARED NAMES clandmark) set(CMAKE_FIND_LIBRARY_PREFIXES "lib") set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".lib") -find_library(CLANDMARK_LIBRARY_SHARED NAMES clandmark) +find_library(CLANDMARK_LIBRARY_STATIC NAMES clandmark) #if(CLANDMARK_LIBRARY_STATIC and CLANDMARK_LIBRARY_SHARED) # if(CLANDMARK_PREFER_STATIC) @@ -47,7 +47,8 @@ find_library(CLANDMARK_LIBRARY_SHARED NAMES clandmark) # set(CLANDMARK_LIBRARY "CLANDMARK_LIBRARY-NOTFOUND") #endif() -set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC}) +# set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC}) +set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_SHARED}) set(CLANDMARK_LIBRARIES ${CLANDMARK_LIBRARY}) set(CLANDMARK_INCLUDE_DIRS ${CLANDMARK_INCLUDE_DIR}) @@ -55,9 +56,9 @@ include(FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set CLANDMARK_FOUND to TRUE # if all listed variables are TRUE find_package_handle_standard_args( - CLANDMARK - DEFAULT_MSG - CLANDMARK_LIBRARY CLANDMARK_INCLUDE_DIR + CLANDMARK + DEFAULT_MSG + CLANDMARK_LIBRARY CLANDMARK_INCLUDE_DIR ) mark_as_advanced(CLANDMARK_INCLUDE_DIR CLANDMARK_LIBRARY) diff --git a/cmake/Modules/FindFLANDMARK.cmake b/cmake/Modules/Findflandmark.cmake similarity index 92% rename from cmake/Modules/FindFLANDMARK.cmake rename to cmake/Modules/Findflandmark.cmake index 730b5ba..8f3adb9 100644 --- a/cmake/Modules/FindFLANDMARK.cmake +++ b/cmake/Modules/Findflandmark.cmake @@ -27,11 +27,11 @@ find_path(FLANDMARK_INCLUDE_DIR Flandmark.h) set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".dll" ".dylib") -find_library(FLANDMARK_LIBRARY_STATIC NAMES flandmark) +find_library(FLANDMARK_LIBRARY_SHARED NAMES flandmark) set(CMAKE_FIND_LIBRARY_PREFIXES "lib") set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".lib") -find_library(FLANDMARK_LIBRARY_SHARED NAMES flandmark) +find_library(FLANDMARK_LIBRARY_STATIC NAMES flandmark) #if(FLANDMARK_LIBRARY_STATIC and FLANDMARK_LIBRARY_SHARED) # if(FLANDMARK_PREFER_STATIC) @@ -47,7 +47,8 @@ find_library(FLANDMARK_LIBRARY_SHARED NAMES flandmark) # set(FLANDMARK_LIBRARY "FLANDMARK_LIBRARY-NOTFOUND") #endif() -set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_STATIC}) +# set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_STATIC}) +set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_SHARED}) set(FLANDMARK_LIBRARIES ${FLANDMARK_LIBRARY}) set(FLANDMARK_INCLUDE_DIRS ${FLANDMARK_INCLUDE_DIR}) @@ -55,9 +56,9 @@ include(FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set FLANDMARK_FOUND to TRUE # if all listed variables are TRUE find_package_handle_standard_args( - FLANDMARK - DEFAULT_MSG - FLANDMARK_LIBRARY FLANDMARK_INCLUDE_DIR + FLANDMARK + DEFAULT_MSG + FLANDMARK_LIBRARY FLANDMARK_INCLUDE_DIR ) mark_as_advanced(FLANDMARK_INCLUDE_DIR FLANDMARK_LIBRARY) diff --git a/libclandmark/CMakeLists.txt b/libclandmark/CMakeLists.txt index b66a601..46746e3 100644 --- a/libclandmark/CMakeLists.txt +++ b/libclandmark/CMakeLists.txt @@ -44,6 +44,7 @@ configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/CLandmarkConfig.h.in ${PROJECT_BINARY_DIR}/CLandmarkConfig.h ) + set(clandmark_headers msvc-compat.h base64.h @@ -113,12 +114,12 @@ endif(USE_OPENMP) # CLANDMARK add_library(clandmark ${clandmark_srcs}) if(NOT ${BUILD_SHARED_LIBS}) - if(NOT MSVC) - set_target_properties(clandmark PROPERTIES PREFIX "lib") - endif() + if(NOT MSVC) + set_target_properties(clandmark PROPERTIES PREFIX "lib") + endif() + set_target_properties(clandmark PROPERTIES POSITION_INDEPENDENT_CODE TRUE) # -fPIC endif() target_include_directories(clandmark PUBLIC ${CImg_INCLUDE_DIR} ${RapidXML_INCLUDE_DIR}) -set_target_properties(clandmark PROPERTIES POSITION_INDEPENDENT_CODE TRUE) # -fPIC set_target_properties(clandmark PROPERTIES SOVERSION "${clandmark_VERSION_MAJOR}" VERSION "${clandmark_VERSION}" @@ -127,12 +128,12 @@ set_target_properties(clandmark PROPERTIES # FLANDMARK add_library(flandmark ${flandmark_srcs}) if(NOT ${BUILD_SHARED_LIBS}) - if(NOT MSVC) - set_target_properties(flandmark PROPERTIES PREFIX "lib") - endif() + if(NOT MSVC) + set_target_properties(flandmark PROPERTIES PREFIX "lib") + endif() + set_target_properties(flandmark PROPERTIES POSITION_INDEPENDENT_CODE TRUE) # -fPIC endif() target_link_libraries(flandmark clandmark) -set_target_properties(flandmark PROPERTIES POSITION_INDEPENDENT_CODE TRUE) # -fPIC set_target_properties(flandmark PROPERTIES SOVERSION "${clandmark_VERSION_MAJOR}" VERSION "${clandmark_VERSION}" @@ -140,16 +141,16 @@ set_target_properties(flandmark PROPERTIES # Models learned distributed with CLandmark set(flandmark_models - ${CMAKE_SOURCE_DIR}/data/flandmark_model.xml - ${CMAKE_SOURCE_DIR}/data/haarcascade_frontalface_alt.xml + ${CMAKE_SOURCE_DIR}/data/flandmark_model.xml + ${CMAKE_SOURCE_DIR}/data/haarcascade_frontalface_alt.xml ) install(TARGETS clandmark flandmark - EXPORT CLandmarkTargets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin - INCLUDES DESTINATION include + EXPORT CLandmarkTargets + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + INCLUDES DESTINATION include ) install(FILES ${clandmark_headers} DESTINATION include COMPONENT Devel) install(FILES ${flandmark_headers} DESTINATION include COMPONENT Devel) diff --git a/libclandmark/clandmarkConfig.cmake.in b/libclandmark/clandmarkConfig.cmake.in deleted file mode 100644 index 7590162..0000000 --- a/libclandmark/clandmarkConfig.cmake.in +++ /dev/null @@ -1,5 +0,0 @@ -set(CLANDMARK_INCLUDE_DIRS "@CLANDMARK_INCLUDE_DIRS@") - -set(CLANDMARK_LIBRARIES "@CLANDMARK_LIBRARIES@") - -set(CLANDMARK_FOUND "TRUE") diff --git a/libclandmark/flandmarkConfig.cmake.in b/libclandmark/flandmarkConfig.cmake.in deleted file mode 100644 index 2a1f9df..0000000 --- a/libclandmark/flandmarkConfig.cmake.in +++ /dev/null @@ -1,5 +0,0 @@ -set(FLANDMARK_INCLUDE_DIRS "@FLANDMARK_INCLUDE_DIRS@") - -set(FLANDMARK_LIBRARIES "@FLANDMARK_LIBRARIES@") - -set(FLANDMARK_FOUND "TRUE") diff --git a/python_interface/CMakeLists.txt b/python_interface/CMakeLists.txt index 3cf0df5..d35f2b5 100644 --- a/python_interface/CMakeLists.txt +++ b/python_interface/CMakeLists.txt @@ -2,6 +2,7 @@ find_package(clandmark REQUIRED) find_package(flandmark REQUIRED) + include_directories( ${CLANDMARK_INCLUDE_DIRS} ${FLANDMARK_INCLUDE_DIRS} @@ -25,9 +26,9 @@ include( UseCython ) # propagate precision definition if(DOUBLE_PRECISION) - add_definitions( -DDOUBLE_PRECISION=1 ) + add_definitions( -DDOUBLE_PRECISION=1 ) else(DOUBLE_PRECISION) - add_definitions( -DDOUBLE_PRECISION=0 ) + add_definitions( -DDOUBLE_PRECISION=0 ) endif(DOUBLE_PRECISION) diff --git a/python_interface/src/CMakeLists.txt b/python_interface/src/CMakeLists.txt index 9df0d70..6791d6c 100644 --- a/python_interface/src/CMakeLists.txt +++ b/python_interface/src/CMakeLists.txt @@ -21,10 +21,10 @@ add_custom_command( TARGET ${PY_NAME_interface} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/py_flandmark.so ${PROJECT_BINARY_DIR}/python_interface/bin -# COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/py_featurePool.so ${PROJECT_BINARY_DIR}/python_interface/bin + COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/py_featurePool.so ${PROJECT_BINARY_DIR}/python_interface/bin # COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/libclandmark/libclandmark${CMAKE_SHARED_LIBRARY_SUFFIX}.${clandmark_VERSION_MAJOR} ${PROJECT_BINARY_DIR}/python_interface/bin # COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/libclandmark/libflandmark${CMAKE_SHARED_LIBRARY_SUFFIX}.${clandmark_VERSION_MAJOR} ${PROJECT_BINARY_DIR}/python_interface/bin # COMMAND ${CMAKE_COMMAND} -E copy ${FLANDMARK_LIBRARIES} ${PROJECT_BINARY_DIR}/python_interface/bin # COMMAND ${CMAKE_COMMAND} -E copy ${CLANDMARK_LIBRARIES} ${PROJECT_BINARY_DIR}/python_interface/bin - COMMENT "Copying python_interface/src/py_flandmark${CMAKE_SHARED_LIBRARY_SUFFIX}" + COMMENT "Copying python_interface/src/py_flandmark${CMAKE_SHARED_LIBRARY_SUFFIX} and python_interface/src/py_featurePool${CMAKE_SHARED_LIBRARY_SUFFIX}" ) From a29eb03c202c68f7ed67283aaf70d10b8d3d9827 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20U=C5=99i=C4=8D=C3=A1=C5=99?= Date: Sun, 5 Feb 2017 17:11:32 +0100 Subject: [PATCH 7/8] Windows build scripts Windows batch scripts added to make the compilation and installation easy on Windows platform. Tested on Windows 10 64bit, MATLAB interface with MATLAB 2015b, and Python interface with Python 2.7 from Anaconda 64bit --- .gitignore | 1 + CMakeLists.txt | 32 ++-- build_clandmark_libs.bat | 28 +++ build_examples.bat | 28 +++ build_matlab_interface.bat | 28 +++ build_python_interface.bat | 30 ++++ build_setup_variables.bat | 15 ++ cmake/Modules/Findclandmark.cmake | 40 +++-- cmake/Modules/UseCython.cmake | 51 +++++- examples/CMakeLists.txt | 40 ++++- examples/cmake/Modules/FindCImg.cmake | 19 ++ examples/cmake/Modules/FindRapidXML.cmake | 19 ++ .../cmake/Modules/Findclandmark.cmake | 54 +++--- examples/helpers.h | 108 ++++++++++++ examples/video_input.cpp | 3 + matlab_interface/CMakeLists.txt | 162 ++++++++---------- matlab_interface/simple_example.m | 4 +- python_interface/CMakeLists.txt | 37 ++-- python_interface/bin/CMakeLists.txt | 21 ++- python_interface/examples/webcam_input.py | 74 ++++++++ python_interface/src/CMakeLists.txt | 98 +++++++++-- python_interface/src/py_featurePool.pyx | 3 +- python_interface/src/py_flandmark.pyx | 2 +- 23 files changed, 700 insertions(+), 197 deletions(-) create mode 100644 .gitignore create mode 100644 build_clandmark_libs.bat create mode 100644 build_examples.bat create mode 100644 build_matlab_interface.bat create mode 100644 build_python_interface.bat create mode 100644 build_setup_variables.bat create mode 100644 examples/cmake/Modules/FindCImg.cmake create mode 100644 examples/cmake/Modules/FindRapidXML.cmake rename cmake/Modules/Findflandmark.cmake => examples/cmake/Modules/Findclandmark.cmake (51%) create mode 100644 examples/helpers.h create mode 100644 python_interface/examples/webcam_input.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..735f01f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.tlog \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d4da9e..4de8bf0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,22 +9,23 @@ set(clandmark_VERSION ${clandmark_VERSION_MAJOR}.${clandmark_VERSION_MINOR}) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules") -#option(BUILD_SHARED_LIBS "Check whether to build libraries dynamically or statically. On for dynamic, Off for static build." ON) mark_as_advanced(CMAKE_INSTALL_PREFIX) -set(BUILD_SHARED_LIBS "TRUE" CACHE BOOL "Global flag to cause add_library to create shared libraries if on.") -set(CMAKE_SKIP_BUILD_RPATH "FALSE" CACHE BOOL "Do not include RPATHs in the build tree.") + +# set(BUILD_SHARED_LIBS "TRUE" CACHE BOOL "Global flag to cause add_library to create shared libraries if on.") +# set(CMAKE_SKIP_BUILD_RPATH "FALSE" CACHE BOOL "Do not include RPATHs in the build tree.") if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE RELEASE CACHE STRING - "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." - FORCE + set(CMAKE_BUILD_TYPE Release CACHE STRING + "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." + FORCE ) endif(NOT CMAKE_BUILD_TYPE) +option(BUILD_SHARED_LIBS "Check whether to build libraries dynamically or statically. On for dynamic, Off for static build." OFF) option(DOUBLE_PRECISION "Set the default precision used in CLandmark." ON) option(BUILD_MATLAB_BINDINGS "Check whether to build MATLAB interface." OFF) option(BUILD_PYTHON_BINDINGS "Check whether to build Python interface." OFF) -option(BUILD_CPP_EXAMPLES "Check whether to build CPP examples." ON) +option(BUILD_CPP_EXAMPLES "Check whether to build CPP examples." OFF) option(USE_OPENMP "Enable/Disable OpenMP." OFF) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic") @@ -34,15 +35,12 @@ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -pedantic") # for configured header files: include_directories(${PROJECT_BINARY_DIR}) -# build clandmark +# build clandmark & flandmark add_subdirectory (libclandmark) -## build flandmark -#add_subdirectory (libflandmark) - # build examples if(BUILD_CPP_EXAMPLES) - add_subdirectory(examples) + add_subdirectory(examples) # copy important files needed to run examples (opencv haarcascade for facial detector, flandmark_model file, example images and videos) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/data/flandmark_model.xml ${CMAKE_CURRENT_BINARY_DIR}/examples/flandmark_model.xml COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/data/face.jpg ${CMAKE_CURRENT_BINARY_DIR}/examples/face.jpg COPYONLY) @@ -60,30 +58,36 @@ if(BUILD_PYTHON_BINDINGS) endif(BUILD_PYTHON_BINDINGS) include(CMakePackageConfigHelpers) + write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/clandmark/CLandmarkConfigVersion.cmake" VERSION ${clandmark_VERSION} COMPATIBILITY AnyNewerVersion ) + export(EXPORT CLandmarkTargets FILE "${CMAKE_CURRENT_BINARY_DIR}/clandmark/CLandmarkTargets.cmake" NAMESPACE CLandmark:: ) + configure_file(cmake/Templates/CLandmarkConfig.cmake "${CMAKE_CURRENT_BINARY_DIR}/clandmark/CLandmarkConfig.cmake" COPYONLY ) + install(EXPORT CLandmarkTargets FILE CLandmarkTargets.cmake NAMESPACE CLandmark:: DESTINATION lib/cmake/clandmark ) + install( FILES cmake/Templates/CLandmarkConfig.cmake "${CMAKE_CURRENT_BINARY_DIR}/clandmark/CLandmarkConfigVersion.cmake" DESTINATION lib/cmake/clandmark - COMPONENT Devel + COMPONENT + Devel ) - +#install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/Findclandmark.cmake" DESTINATION ./ COMPONENT Devel) diff --git a/build_clandmark_libs.bat b/build_clandmark_libs.bat new file mode 100644 index 0000000..718abc6 --- /dev/null +++ b/build_clandmark_libs.bat @@ -0,0 +1,28 @@ +:: Builds and installs CLandmark libraries (both static and dynamic version) + +call build_setup_variables.bat + +set OLDDIR=%CD% + +if NOT EXIST %BUILD_DIR% ( + mkdir %BUILD_DIR% +) + +cd %BUILD_DIR% + +:: build static version of the libraries +cmake -G %CMAKE_GENERATOR% -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=%INSTALL_PATH% -DBUILD_CPP_EXAMPLES=OFF -DBUILD_MATLAB_BINDINGS=OFF -DBUILD_PYTHON_BINDINGS=OFF ..\ +cmake --build . --target clandmark --config %CMAKE_CONFIGURATION% +cmake --build . --target flandmark --config %CMAKE_CONFIGURATION% + +:: build dynamic version of the libraries +cmake -G %CMAKE_GENERATOR% -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=%INSTALL_PATH% -DBUILD_CPP_EXAMPLES=OFF -DBUILD_MATLAB_BINDINGS=OFF -DBUILD_PYTHON_BINDINGS=OFF ..\ +cmake --build . --target clandmark --config %CMAKE_CONFIGURATION% +cmake --build . --target flandmark --config %CMAKE_CONFIGURATION% + +:: install +cmake --build . --target INSTALL --config %CMAKE_CONFIGURATION% + +cd %OLDDIR% + +pause diff --git a/build_examples.bat b/build_examples.bat new file mode 100644 index 0000000..e7c387e --- /dev/null +++ b/build_examples.bat @@ -0,0 +1,28 @@ +:: Builds and installs C++ examples + +call build_setup_variables.bat + +set OLDDIR=%CD% + +if NOT EXIST %BUILD_DIR% ( + mkdir %BUILD_DIR% +) + +cd %BUILD_DIR% + +:: check if the library was compiled +IF NOT EXIST %INSTALL_PATH%\bin\clandmark.dll ( + call %OLDDIR%\build_clandmark_libs.bat +) + +:: build examples +cmake -G %CMAKE_GENERATOR% -DOPENCV_DIR=%OpenCV_DIR% -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=%INSTALL_PATH% -DBUILD_CPP_EXAMPLES=ON -DBUILD_MATLAB_BINDINGS=OFF -DBUILD_PYTHON_BINDINGS=OFF ..\ +cmake --build . --target static_input --config %CMAKE_CONFIGURATION% +cmake --build . --target video_input --config %CMAKE_CONFIGURATION% + +:: install +cmake --build . --target INSTALL --config %CMAKE_CONFIGURATION% + +cd %OLDDIR% + +pause diff --git a/build_matlab_interface.bat b/build_matlab_interface.bat new file mode 100644 index 0000000..c1d53c6 --- /dev/null +++ b/build_matlab_interface.bat @@ -0,0 +1,28 @@ +:: Builds and installs MATLAB interface + +call build_setup_variables.bat + +set OLDDIR=%CD% + +if NOT EXIST %BUILD_DIR% ( + mkdir %BUILD_DIR% +) + +cd %BUILD_DIR% + +:: check if the library was compiled +IF NOT EXIST %INSTALL_PATH%\lib\clandmark.lib ( + call %OLDDIR%\build_clandmark_libs.bat +) + +:: build MATLAB interface +cmake -G%CMAKE_GENERATOR% -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=%INSTALL_PATH% -DBUILD_CPP_EXAMPLES=OFF -DBUILD_MATLAB_BINDINGS=ON -DBUILD_PYTHON_BINDINGS=OFF ..\ +cmake --build . --target flandmark_interface --config %CMAKE_CONFIGURATION% +cmake --build . --target featuresPool_interface --config %CMAKE_CONFIGURATION% + +:: install +cmake --build . --target INSTALL --config %CMAKE_CONFIGURATION% + +cd %OLDDIR% + +pause diff --git a/build_python_interface.bat b/build_python_interface.bat new file mode 100644 index 0000000..98b0758 --- /dev/null +++ b/build_python_interface.bat @@ -0,0 +1,30 @@ +:: Builds and installs Python interface + +call build_setup_variables.bat + +set OLDDIR=%CD% + +if NOT EXIST %BUILD_DIR% ( + mkdir %BUILD_DIR% +) + +cd %BUILD_DIR% + +:: check if the library was compiled +IF NOT EXIST %INSTALL_PATH%\bin\clandmark.dll ( + call %OLDDIR%\build_clandmark_libs.bat +) + +::python interface build +cmake -G %CMAKE_GENERATOR% -DPYTHON_EXECUTABLE=%PYTHON_EXECUTABLE% -DPYTHON_INCLUDE_DIR=%PYTHON_INCLUDE_DIR% -DCYTHON_EXECUTABLE=%CYTHON_EXECUTABLE% -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=%INSTALL_PATH% -DBUILD_CPP_EXAMPLES=OFF -DBUILD_MATLAB_BINDINGS=OFF -DBUILD_PYTHON_BINDINGS=ON ..\ + +cmake --build . --target ReplicatePythonSourceTree %CMAKE_CONFIGURATION% +cmake --build . --target py_featurePool --config %CMAKE_CONFIGURATION% +cmake --build . --target py_flndmark --config %CMAKE_CONFIGURATION% + +:: install +cmake --build . --target INSTALL --config %CMAKE_CONFIGURATION% + +cd %OLDDIR% + +pause diff --git a/build_setup_variables.bat b/build_setup_variables.bat new file mode 100644 index 0000000..ce5d169 --- /dev/null +++ b/build_setup_variables.bat @@ -0,0 +1,15 @@ +:: Change these variables to fit your settings + +set BUILD_DIR=D:\GitHub\clandmark\build +set CMAKE_GENERATOR="Visual Studio 14 2015 Win64" +set CMAKE_CONFIGURATION=Release + +set INSTALL_PATH=D:\GitHub\clandmark\install + +set OpenCV_DIR=D:\opencv\opencv-2.4.13\build\ + +set PYTHON_EXECUTABLE=D:\ProgramFiles\Anaconda2\python.exe +set PYTHON_INCLUDE_DIR=D:\ProgramFiles\Anaconda2\include +REM set PYTHON_LIBRARY=D:\ProgramFiles\Anaconda2\python27.dll +REM set PYTHON_LIBRARY=D:\ProgramFiles\Anaconda2\libs\python27.lib +set CYTHON_EXECUTABLE=D:\ProgramFiles\Anaconda2\Scripts\cython.exe diff --git a/cmake/Modules/Findclandmark.cmake b/cmake/Modules/Findclandmark.cmake index e423c5a..e7fa990 100644 --- a/cmake/Modules/Findclandmark.cmake +++ b/cmake/Modules/Findclandmark.cmake @@ -24,34 +24,37 @@ # # ============================================================================= -find_path(CLANDMARK_INCLUDE_DIR CLandmark.h) +find_path(CLANDMARK_INCLUDE_DIR CLandmark.h HINTS ${CLANDMARK_INSTALL_DIR} ${CLANDMARK_INSTALL_DIR}/include ) +find_path(FLANDMARK_INCLUDE_DIR Flandmark.h HINTS ${CLANDMARK_INSTALL_DIR} ${CLANDMARK_INSTALL_DIR}/include ) set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".dll" ".dylib") find_library(CLANDMARK_LIBRARY_SHARED NAMES clandmark) +find_library(FLANDMARK_LIBRARY_SHARED NAMES flandmark) -set(CMAKE_FIND_LIBRARY_PREFIXES "lib") +# +if (UNIX) + set(CMAKE_FIND_LIBRARY_PREFIXES "lib") +endif(UNIX) set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".lib") find_library(CLANDMARK_LIBRARY_STATIC NAMES clandmark) +find_library(FLANDMARK_LIBRARY_STATIC NAMES flandmark) -#if(CLANDMARK_LIBRARY_STATIC and CLANDMARK_LIBRARY_SHARED) -# if(CLANDMARK_PREFER_STATIC) -# set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC}) -# else() -# set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_SHARED}) -# endif() -#elseif(CLANDMARK_LIBRARY_STATIC) -# set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC}) -#elseif(CLANDMARK_LIBRARY_SHARED) -# set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_SHARED}) -#else() -# set(CLANDMARK_LIBRARY "CLANDMARK_LIBRARY-NOTFOUND") -#endif() # set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC}) set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_SHARED}) +# set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC} ${CLANDMARK_LIBRARY_SHARED}) set(CLANDMARK_LIBRARIES ${CLANDMARK_LIBRARY}) set(CLANDMARK_INCLUDE_DIRS ${CLANDMARK_INCLUDE_DIR}) +set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_SHARED}) +# set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_STATIC} ${FLANDMARK_LIBRARY_SHARED}) +set(FLANDMARK_LIBRARIES ${FLANDMARK_LIBRARY}) +set(FLANDMARK_INCLUDE_DIRS ${FLANDMARK_INCLUDE_DIR}) + +# Temporary DEBUG message +message(STATUS "CLANDMARK: ${CLANDMARK_INCLUDE_DIR}, ${CLANDMARK_LIBRARIES}") +message(STATUS "FLANDMARK: ${FLANDMARK_INCLUDE_DIR}, ${FLANDMARK_LIBRARIES}") + include(FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set CLANDMARK_FOUND to TRUE # if all listed variables are TRUE @@ -61,4 +64,11 @@ find_package_handle_standard_args( CLANDMARK_LIBRARY CLANDMARK_INCLUDE_DIR ) +find_package_handle_standard_args( + FLANDMARK + DEFAULT_MSG + FLANDMARK_LIBRARY FLANDMARK_INCLUDE_DIR +) + mark_as_advanced(CLANDMARK_INCLUDE_DIR CLANDMARK_LIBRARY) +mark_as_advanced(FLANDMARK_INCLUDE_DIR FLANDMARK_LIBRARY) diff --git a/cmake/Modules/UseCython.cmake b/cmake/Modules/UseCython.cmake index f432c89..19a3d04 100644 --- a/cmake/Modules/UseCython.cmake +++ b/cmake/Modules/UseCython.cmake @@ -242,13 +242,42 @@ function( cython_add_module _name ) compile_pyx( ${_name} generated_file ${pyx_module_sources} ) include_directories( ${PYTHON_INCLUDE_DIRS} ) python_add_module( ${_name} ${generated_file} ${other_module_sources} ) - if( APPLE ) + if(APPLE) set_target_properties( ${_name} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup" ) - else() - target_link_libraries( ${_name} ${PYTHON_LIBRARIES} ) - endif() + else(APPLE) + if (UNIX) + message( STATUS "Linking target ${_name} against libpython" ) + target_link_libraries( ${_name} ${PYTHON_LIBRARIES} ) + endif(UNIX) + if (MSVC) + message( STATUS "Not linking target ${_name} against libpython" ) + set_target_properties( ${_name} PROPERTIES LINK_FLAGS "/LTCG" ) + endif(MSVC) + endif(APPLE) endfunction() +# function( cython_add_module2 _name _dynamic_lookup ) + # set( pyx_module_sources "" ) + # set( other_module_sources "" ) + # foreach( _file ${ARGN} ) + # if( ${_file} MATCHES ".*\\.py[x]?$" ) + # list( APPEND pyx_module_sources ${_file} ) + # else() + # list( APPEND other_module_sources ${_file} ) + # endif() + # endforeach() + # compile_pyx( ${_name} generated_file ${pyx_module_sources} ) + # include_directories( ${PYTHON_INCLUDE_DIRS} ) + # python_add_module( ${_name} ${generated_file} ${other_module_sources} ) + ## Added here ## + # if( ${_dynamic_lookup} ) + # message( STATUS "Not linking target ${_name} against libpython" ) + # set_target_properties( ${_name} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") + # else() + # target_link_libraries( ${_name} ${PYTHON_LIBRARIES} ) + # endif() +# endfunction() + include( CMakeParseArguments ) # cython_add_standalone_executable( _name [MAIN_MODULE src3.py] src1 src2 ... srcN ) # Creates a standalone executable the given sources. @@ -267,6 +296,20 @@ function( cython_add_standalone_executable _name ) set( PYTHON_MODULE_${_file_we}_static_BUILD_SHARED OFF ) compile_pyx( "${_file_we}_static" generated_file "${_file}" ) list( APPEND pyx_module_sources "${generated_file}" ) + # TRY THIS + # if(APPLE) + # set_target_properties( ${_name} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup" ) + # else(APPLE) + # if (UNIX) + # message( STATUS "Linking target ${_name} against libpython" ) + # target_link_libraries( ${_name} ${PYTHON_LIBRARIES} ) + # endif(UNIX) + # if (MSVC) + # message( STATUS "Not linking target ${_name} against libpython" ) + # set_target_properties( ${_name} PROPERTIES LINK_FLAGS "/LTCG" ) + # endif(MSVC) + # endif(APPLE) + ########## endif() else() list( APPEND other_module_sources ${_file} ) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index ba3f2ca..439f537 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,17 +1,47 @@ +# cmake_minimum_required(VERSION 3.0) + +# set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") include_directories("${PROJECT_SOURCE_DIR}/libclandmark") +# message(STATUS "CMAKE_MODULE_PATH=${CMAKE_MODULE_PATH}") + +# find_package(clandmark REQUIRED) + +message(STATUS "CLANDMARK_INCLUDE_DIRS=${CLANDMARK_INCLUDE_DIRS}") +message(STATUS "CLANDMARK_LIBRARIES=${CLANDMARK_LIBRARIES}") + +# find_package(RapidXML) +# if(NOT RAPIDXML_FOUND) + # message(STATUS "RapidXML not found - using internal version.") + # set(RapidXML_INCLUDE_DIR "$" CACHE PATH "Include directory for RapidXML" FORCE) +# endif(NOT RAPIDXML_FOUND) + +# find_package(CImg) +# if(NOT CIMG_FOUND) + # message(STATUS "CImg not found - using internal version.") + # set(CImg_INCLUDE_DIR "$" CACHE PATH "Include directory for CImg" FORCE) +# endif(NOT CIMG_FOUND) + +include_directories( + # ${CImg_INCLUDE_DIR} + # ${RapidXML_INCLUDE_DIR} + ${CLANDMARK_INCLUDE_DIRS} + ${FLANDMARK_INCLUDE_DIRS} +) + find_package( OpenCV REQUIRED core imgproc objdetect highgui ) include_directories(${OpenCV_INCLUDE_DIR}) -include_directories(${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13) -include_directories(${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6) +# include_directories(${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13) +# include_directories(${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6) ## Several examples using flandmark set(EXAMPLES static_input video_input) foreach(var ${EXAMPLES}) add_executable(${var} ${var}.cpp) - target_link_libraries(${var} flandmark ${OpenCV_LIBS}) + # target_link_libraries(${var} ${FLANDMARK_LIBRARIES} ${CLANDMARK_LIBRARIES} ${OpenCV_LIBS}) + target_link_libraries(${var} flandmark clandmark ${OpenCV_LIBS}) endforeach() -install(TARGETS ${EXAMPLES} EXPORT CLandmarkTargets DESTINATION share/clandmark/examples COMPONENT Examples) - +#install(TARGETS ${EXAMPLES} EXPORT CLandmarkTargets DESTINATION share/clandmark/examples COMPONENT Examples) +install(TARGETS ${EXAMPLES} DESTINATION share/clandmark/examples COMPONENT Examples) diff --git a/examples/cmake/Modules/FindCImg.cmake b/examples/cmake/Modules/FindCImg.cmake new file mode 100644 index 0000000..90108ad --- /dev/null +++ b/examples/cmake/Modules/FindCImg.cmake @@ -0,0 +1,19 @@ +# - Try to find Cimg +# Once done this will define +# CIMG_FOUND - System has CImg +# CImg_INCLUDE_DIR - The CImg include directories + +find_path(CImg_INCLUDE_DIR CImg.h) + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set CIMG_FOUND to TRUE +# if all listed variables are TRUE +find_package_handle_standard_args(CImg DEFAULT_MSG CImg_INCLUDE_DIR) + +mark_as_advanced(CImg_INCLUDE_DIR) + +if(CIMG_FOUND) + # provide import target: + add_library(CImg::CImg INTERFACE IMPORTED) + set_target_properties(CImg::CImg PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CImg_INCLUDE_DIR}) +endif() diff --git a/examples/cmake/Modules/FindRapidXML.cmake b/examples/cmake/Modules/FindRapidXML.cmake new file mode 100644 index 0000000..c3bb095 --- /dev/null +++ b/examples/cmake/Modules/FindRapidXML.cmake @@ -0,0 +1,19 @@ +# - Try to find RapidXML +# Once done this will define +# RAPIDXML_FOUND - System has RapidXML +# RapidXML_INCLUDE_DIR - The RapidXML include directories + +find_path(RapidXML_INCLUDE_DIR rapidxml.hpp PATH_SUFFIXES rapidxml) + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set RAPIDXML_FOUND to TRUE +# if all listed variables are TRUE +find_package_handle_standard_args(RapidXML DEFAULT_MSG RapidXML_INCLUDE_DIR) + +mark_as_advanced(RapidXML_INCLUDE_DIR) + +if(RAPIDXML_FOUND) + # provide import target: + add_library(RapidXML::RapidXML INTERFACE IMPORTED) + set_target_properties(RapidXML::RapidXML PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${RapidXML_INCLUDE_DIR}) +endif() diff --git a/cmake/Modules/Findflandmark.cmake b/examples/cmake/Modules/Findclandmark.cmake similarity index 51% rename from cmake/Modules/Findflandmark.cmake rename to examples/cmake/Modules/Findclandmark.cmake index 8f3adb9..434b2ac 100644 --- a/cmake/Modules/Findflandmark.cmake +++ b/examples/cmake/Modules/Findclandmark.cmake @@ -1,16 +1,16 @@ -# - Try to find the flandmark landmark detector library +# - Try to find the clandmark landmark detector library # # ============================================================================= # Once done this will define: # -# FLANDMARK_FOUND TRUE if found; FALSE otherwise -# FLANDMARK_INCLUDE_DIRS where to find flandmark_detector.h -# FLANDMARK_LIBRARIES the libraries to link against +# CLANDMARK_FOUND TRUE if found; FALSE otherwise +# CLANDMARK_INCLUDE_DIRS where to find flandmark_detector.h +# CLANDMARK_LIBRARIES the libraries to link against # # ============================================================================= # Variables used by this module: # -# FLANDMARK_PREFER_STATIC If TRUE and available, link against the static +# CLANDMARK_PREFER_STATIC If TRUE and available, link against the static # flandmark library. Otherwise select the shared # version # @@ -18,47 +18,57 @@ # To use this from another project: # # create a directory named cmake/Modules under the project root, copy this file -# (FindFLANDMARK.cmake) there, and in the top-level CMakeLists.txt include: +# (FindCLANDMARK.cmake) there, and in the top-level CMakeLists.txt include: # set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} # "${CMAKE_SOURCE_DIR}/cmake/Modules/") # # ============================================================================= +find_path(CLANDMARK_INCLUDE_DIR CLandmark.h) find_path(FLANDMARK_INCLUDE_DIR Flandmark.h) set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".dll" ".dylib") +find_library(CLANDMARK_LIBRARY_SHARED NAMES clandmark) find_library(FLANDMARK_LIBRARY_SHARED NAMES flandmark) -set(CMAKE_FIND_LIBRARY_PREFIXES "lib") +# +if (UNIX) + set(CMAKE_FIND_LIBRARY_PREFIXES "lib") +endif(UNIX) set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".lib") +find_library(CLANDMARK_LIBRARY_STATIC NAMES clandmark) find_library(FLANDMARK_LIBRARY_STATIC NAMES flandmark) -#if(FLANDMARK_LIBRARY_STATIC and FLANDMARK_LIBRARY_SHARED) -# if(FLANDMARK_PREFER_STATIC) -# set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_STATIC}) -# else() -# set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_SHARED}) -# endif() -#elseif(FLANDMARK_LIBRARY_STATIC) -# set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_STATIC}) -#elseif(FLANDMARK_LIBRARY_SHARED) -# set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_SHARED}) -#else() -# set(FLANDMARK_LIBRARY "FLANDMARK_LIBRARY-NOTFOUND") -#endif() -# set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_STATIC}) +# set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC}) +set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_SHARED}) +# set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC} ${CLANDMARK_LIBRARY_SHARED}) +set(CLANDMARK_LIBRARIES ${CLANDMARK_LIBRARY}) +set(CLANDMARK_INCLUDE_DIRS ${CLANDMARK_INCLUDE_DIR}) + set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_SHARED}) +# set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_STATIC} ${FLANDMARK_LIBRARY_SHARED}) set(FLANDMARK_LIBRARIES ${FLANDMARK_LIBRARY}) set(FLANDMARK_INCLUDE_DIRS ${FLANDMARK_INCLUDE_DIR}) +# Temporary DEBUG message +message(STATUS "CLANDMARK: ${CLANDMARK_INCLUDE_DIR}, ${CLANDMARK_LIBRARIES}") +message(STATUS "FLANDMARK: ${FLANDMARK_INCLUDE_DIR}, ${FLANDMARK_LIBRARIES}") + include(FindPackageHandleStandardArgs) -# handle the QUIETLY and REQUIRED arguments and set FLANDMARK_FOUND to TRUE +# handle the QUIETLY and REQUIRED arguments and set CLANDMARK_FOUND to TRUE # if all listed variables are TRUE +find_package_handle_standard_args( + CLANDMARK + DEFAULT_MSG + CLANDMARK_LIBRARY CLANDMARK_INCLUDE_DIR +) + find_package_handle_standard_args( FLANDMARK DEFAULT_MSG FLANDMARK_LIBRARY FLANDMARK_INCLUDE_DIR ) +mark_as_advanced(CLANDMARK_INCLUDE_DIR CLANDMARK_LIBRARY) mark_as_advanced(FLANDMARK_INCLUDE_DIR FLANDMARK_LIBRARY) diff --git a/examples/helpers.h b/examples/helpers.h new file mode 100644 index 0000000..1c548f9 --- /dev/null +++ b/examples/helpers.h @@ -0,0 +1,108 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Written (W) 2014, 2015 Michal Uricar + * Copyright (C) 2014, 2015 Michal Uricar + */ + +#ifndef __HELPERS_H__ +#define __HELPERS_H__ + +namespace clandmark { + +// DOUBLE_PRECISION +#if DOUBLE_PRECISION==1 + typedef double DOUBLE; +#else + typedef float DOUBLE; +#endif + +/** + * @brief printQG + * @param Q + * @param G + * @param M + * @param N + */ +void printQG(DOUBLE *Q, DOUBLE *G, int M, int N) +{ + std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(2); // << setw(5) << endl; + std::cout << "Q: " << std::endl; + std::cout << "[ "; + for (int i=0; i < M; ++i) + { + std::cout << Q[i] << " "; + } + std::cout << "]" << std::endl; + std::cout << "G: " << std::endl; + std::cout << "[ "; + for (int i=0; i < N; ++i) + { + std::cout << G[i] << " "; + } + std::cout << "]" << std::endl; +} + +/** + * @brief printLandmarks + * @param landmarks + * @param M + */ +void printLandmarks(DOUBLE *landmarks, int M) +{ + std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(2) << std::setw(5) << std::endl << "Landmarks:" << std::endl; + std::cout << "[ "; + for (int i=0; i < 2*M; i+=2) + { + std::cout << landmarks[i] << " "; + } + std::cout << "]" << std::endl << "[ "; + for (int i=1; i < 2*M; i+=2) + { + std::cout << landmarks[i] << " "; + } + std::cout << "]" << std::endl; +} + +/** + * @brief printLandmarks + * @param landmarks + * @param M + */ +void printLandmarks(int *landmarks, int M) +{ + std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(4) << std::setw(5) << std::endl << "Landmarks:" << std::endl; + std::cout << "[ "; + for (int i=0; i < 2*M; i+=2) + { + std::cout << landmarks[i] << " "; + } + std::cout << "]" << std::endl << "[ "; + for (int i=1; i < 2*M; i+=2) + { + std::cout << landmarks[i] << " "; + } + std::cout << "]" << std::endl; +} + +/** + * @brief printTimingStats + * @param timings + */ +void printTimingStats(Timings &timings) +{ + std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(4) << std::setw(5) << std::endl + << "FLANDMARK Time statistics:" << std::endl + << "--------------------------" << std::endl + << "NF extraction: \t\t" << timings.normalizedFrame << " ms" << std::endl + << "Features comptation: \t\t" << timings.features << " ms" << std::endl + << "Maxsum solver: \t\t" << timings.maxsum << " ms" << std::endl + << "Overall time: \t\t\t" << timings.overall << " ms" << std::endl << std::endl; +} + +} + +#endif // __HELPERS_H__ diff --git a/examples/video_input.cpp b/examples/video_input.cpp index c47ea31..7c764ee 100644 --- a/examples/video_input.cpp +++ b/examples/video_input.cpp @@ -112,7 +112,10 @@ void detectAndDisplay( cv::Mat &frame, clandmark::Flandmark *flandmark) /** @function main */ int main( int argc, const char** argv ) + { + std::cout << "DEBUG" << std::endl; + if (argc < 5) { std::cerr << "Usage: video_input { cam | vid } [ filename | cam_id ] [ output_filename ]" << std::endl; diff --git a/matlab_interface/CMakeLists.txt b/matlab_interface/CMakeLists.txt index 54e0695..c8e7f0a 100644 --- a/matlab_interface/CMakeLists.txt +++ b/matlab_interface/CMakeLists.txt @@ -2,11 +2,7 @@ set(MEX_NAME_flandmark_interface flandmark_interface) set(MEX_NAME_featuresPool_interface featuresPool_interface) # create mex subdirectory -if(DOUBLE_PRECISION) - file(MAKE_DIRECTORY ${PROJECT_SOURCE_DIR}/matlab_interface/mex) -else(DOUBLE_PRECISION) - file(MAKE_DIRECTORY ${PROJECT_SOURCE_DIR}/matlab_interface/mex_single_precision) -endif(DOUBLE_PRECISION) +file(MAKE_DIRECTORY ${PROJECT_SOURCE_DIR}/matlab_interface/mex) if(WIN32) find_program(MEX_CMD mex.bat) @@ -16,15 +12,6 @@ else(WIN32) find_program(MEXEXT_CMD mexext) endif(WIN32) -# propagate precision definition -# if(DOUBLE_PRECISION) -# add_definitions( -DDOUBLE_PRECISION=1 ) -# set(MEX_DEFINES "-DDOUBLE_PRECISION=1") -# else(DOUBLE_PRECISION) -# add_definitions( -DDOUBLE_PRECISION=0 ) -# set(MEX_DEFINES "-DDOUBLE_PRECISION=0") -# endif(DOUBLE_PRECISION) - if(MEX_CMD AND MEXEXT_CMD) get_filename_component(MEX_REAL_CMD ${MEX_CMD} ABSOLUTE) @@ -35,87 +22,76 @@ if(MEX_CMD AND MEXEXT_CMD) if(MEX_PATH STREQUAL MEXEXT_PATH) - execute_process(COMMAND ${MEXEXT_REAL_CMD} OUTPUT_VARIABLE MEX_EXTENSION OUTPUT_STRIP_TRAILING_WHITESPACE) - - set(MEX_FILE_flandmark_interface ${CMAKE_CURRENT_BINARY_DIR}/${MEX_NAME_flandmark_interface}.${MEX_EXTENSION}) - set(MEX_FILE_featuresPool_interface ${CMAKE_CURRENT_BINARY_DIR}/${MEX_NAME_featuresPool_interface}.${MEX_EXTENSION}) - - add_custom_command( - OUTPUT ${MEX_FILE_flandmark_interface} - COMMAND ${MEX_REAL_CMD} - ARGS -v -largeArrayDims #${MEX_DEFINES} - ${CMAKE_CURRENT_SOURCE_DIR}/flandmark_interface_mex.cpp -# -I${PROJECT_BINARY_DIR}/CLandmarkConfig.h - -I${PROJECT_BINARY_DIR} # DOUBLE_PRECISION - -I${PROJECT_SOURCE_DIR}/libclandmark - -I${RapidXML_INCLUDE_DIR} -# -I${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13 - -I${CImg_INCLUDE_DIR} - -I${CImg_INCLUDE_DIR}/plugins -# -I${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6 -# -I${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6/plugins - ${PROJECT_BINARY_DIR}/libclandmark/libflandmark.a - ${PROJECT_BINARY_DIR}/libclandmark/libclandmark.a - -output ${MEX_NAME_flandmark_interface} - DEPENDS flandmark ${CMAKE_CURRENT_SOURCE_DIR}/flandmark_interface_mex.cpp - COMMENT "Building MEX extension ${MEX_FILE_flandmark_interface}" - ) - - add_custom_command( - OUTPUT ${MEX_FILE_featuresPool_interface} - COMMAND ${MEX_REAL_CMD} - ARGS -v -largeArrayDims #${MEX_DEFINES} - ${CMAKE_CURRENT_SOURCE_DIR}/featuresPool_interface_mex.cpp - ${PROJECT_BINARY_DIR}/libclandmark/libflandmark.a - ${PROJECT_BINARY_DIR}/libclandmark/libclandmark.a - -I${PROJECT_SOURCE_DIR}/libclandmark - -output ${MEX_NAME_featuresPool_interface} - DEPENDS flandmark ${CMAKE_CURRENT_SOURCE_DIR}/featuresPool_interface_mex.cpp - COMMENT "Building MEX extension ${MEX_FILE_featuresPool_interface}" - ) - - - add_custom_target(${MEX_NAME_flandmark_interface} ALL DEPENDS ${MEX_FILE_flandmark_interface}) - add_custom_target(${MEX_NAME_featuresPool_interface} ALL DEPENDS ${MEX_FILE_featuresPool_interface}) - -if(DOUBLE_PRECISION) - add_custom_command( - TARGET ${MEX_NAME_flandmark_interface} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${MEX_FILE_flandmark_interface} ${PROJECT_SOURCE_DIR}/matlab_interface/mex - COMMENT "Copying ${MEX_FILE_flandmark_interface}" - ) - - add_custom_command( - TARGET ${MEX_NAME_featuresPool_interface} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${MEX_FILE_featuresPool_interface} ${PROJECT_SOURCE_DIR}/matlab_interface/mex - COMMENT "Copying ${MEX_FILE_featuresPool_interface}" - ) -else(DOUBLE_PRECISION) - add_custom_command( - TARGET ${MEX_NAME_flandmark_interface} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${MEX_FILE_flandmark_interface} ${PROJECT_SOURCE_DIR}/matlab_interface/mex_single_precision - COMMENT "Copying ${MEX_FILE_flandmark_interface}" - ) - - add_custom_command( - TARGET ${MEX_NAME_featuresPool_interface} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${MEX_FILE_featuresPool_interface} ${PROJECT_SOURCE_DIR}/matlab_interface/mex_single_precision - COMMENT "Copying ${MEX_FILE_featuresPool_interface}" - ) -endif(DOUBLE_PRECISION) - -install(FILES ${MEX_FILE_flandmark_interface} DESTINATION share/clandmark/mex COMPONENT Matlab) -install(FILES ${MEX_FILE_featuresPool_interface} DESTINATION share/clandmark/mex COMPONENT Matlab) - - else() + execute_process(COMMAND ${MEXEXT_REAL_CMD} OUTPUT_VARIABLE MEX_EXTENSION OUTPUT_STRIP_TRAILING_WHITESPACE) + + set(MEX_FILE_flandmark_interface ${CMAKE_CURRENT_BINARY_DIR}/${MEX_NAME_flandmark_interface}.${MEX_EXTENSION}) + set(MEX_FILE_featuresPool_interface ${CMAKE_CURRENT_BINARY_DIR}/${MEX_NAME_featuresPool_interface}.${MEX_EXTENSION}) + + if (UNIX) + set(add_libclandmark "${PROJECT_BINARY_DIR}/libclandmark/libclandmark.a") + set(add_libflandmark "${PROJECT_BINARY_DIR}/libclandmark/libflandmark.a") + endif (UNIX) + + if (WIN32) + set(add_libclandmark "${PROJECT_BINARY_DIR}/libclandmark/Release/clandmark.lib") + set(add_libflandmark "${PROJECT_BINARY_DIR}/libclandmark/Release/flandmark.lib") + endif (WIN32) + + add_custom_command( + OUTPUT ${MEX_FILE_flandmark_interface} + COMMAND ${MEX_REAL_CMD} + ARGS -v -largeArrayDims #${MEX_DEFINES} + ${CMAKE_CURRENT_SOURCE_DIR}/flandmark_interface_mex.cpp + -I${PROJECT_BINARY_DIR} # DOUBLE_PRECISION + -I${PROJECT_SOURCE_DIR}/libclandmark + -I${RapidXML_INCLUDE_DIR} + -I${CImg_INCLUDE_DIR} + -I${CImg_INCLUDE_DIR}/plugins + ${add_libflandmark} + ${add_libclandmark} + -output ${MEX_NAME_flandmark_interface} + DEPENDS flandmark ${CMAKE_CURRENT_SOURCE_DIR}/flandmark_interface_mex.cpp + COMMENT "Building MEX extension ${MEX_FILE_flandmark_interface}" + ) + + add_custom_command( + OUTPUT ${MEX_FILE_featuresPool_interface} + COMMAND ${MEX_REAL_CMD} + ARGS -v -largeArrayDims #${MEX_DEFINES} + ${CMAKE_CURRENT_SOURCE_DIR}/featuresPool_interface_mex.cpp + ${add_libflandmark} + ${add_libclandmark} + -I${PROJECT_SOURCE_DIR}/libclandmark + -output ${MEX_NAME_featuresPool_interface} + DEPENDS flandmark ${CMAKE_CURRENT_SOURCE_DIR}/featuresPool_interface_mex.cpp + COMMENT "Building MEX extension ${MEX_FILE_featuresPool_interface}" + ) + + add_custom_target(${MEX_NAME_flandmark_interface} ALL DEPENDS ${MEX_FILE_flandmark_interface}) + add_custom_target(${MEX_NAME_featuresPool_interface} ALL DEPENDS ${MEX_FILE_featuresPool_interface}) + + add_custom_command( + TARGET ${MEX_NAME_flandmark_interface} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${MEX_FILE_flandmark_interface} ${PROJECT_SOURCE_DIR}/matlab_interface/mex + COMMENT "Copying ${MEX_FILE_flandmark_interface}" + ) + + add_custom_command( + TARGET ${MEX_NAME_featuresPool_interface} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${MEX_FILE_featuresPool_interface} ${PROJECT_SOURCE_DIR}/matlab_interface/mex + COMMENT "Copying ${MEX_FILE_featuresPool_interface}" + ) + + install(FILES ${MEX_FILE_flandmark_interface} DESTINATION share/clandmark/mex COMPONENT Matlab) + install(FILES ${MEX_FILE_featuresPool_interface} DESTINATION share/clandmark/mex COMPONENT Matlab) + + else(MEX_PATH STREQUAL MEXEXT_PATH) message(WARNING "The 'mex' and 'mexext' programs have been found in different locations. It's likely that one of them is not part of the MATLAB installation. Make sure that the 'bin' directory from the MATLAB installation is in PATH") set(BUILD_MATLAB_BINDINGS OFF) - endif() + endif(MEX_PATH STREQUAL MEXEXT_PATH) -endif() +endif(MEX_CMD AND MEXEXT_CMD) diff --git a/matlab_interface/simple_example.m b/matlab_interface/simple_example.m index 25ecbeb..1683b19 100644 --- a/matlab_interface/simple_example.m +++ b/matlab_interface/simple_example.m @@ -11,7 +11,7 @@ addpath('../learning/flandmark/code/functions/'); % DOUBLE PRECISION -rmpath('./mex_single_precision/'); +% rmpath('./mex_single_precision/'); addpath('./mex/'); % SINGLE PRECISION @@ -71,7 +71,7 @@ % show landmarks plot(P(1, :), P(2, :), 'rs', 'LineWidth', 1, 'MarkerSize', 5, 'MarkerFaceColor', 'r'); - text(P(1, :), P(2, :), landmark_names, 'color', 'r', 'FontSize', 12, 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'right'); +% text(P(1, :), P(2, :), landmark_names, 'color', 'r', 'FontSize', 12, 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'right'); for a = 1 : numel(edges(1, :)) line([P(1, edges(1, a)) P(1, edges(2, a))], [P(2, edges(1, a)) P(2, edges(2, a))], 'color', 'b'); end; diff --git a/python_interface/CMakeLists.txt b/python_interface/CMakeLists.txt index d35f2b5..b7180fa 100644 --- a/python_interface/CMakeLists.txt +++ b/python_interface/CMakeLists.txt @@ -1,7 +1,6 @@ # python_interface/CMakeLists.txt find_package(clandmark REQUIRED) -find_package(flandmark REQUIRED) include_directories( ${CLANDMARK_INCLUDE_DIRS} @@ -9,40 +8,42 @@ include_directories( ) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) -#include_directories( ${PROJECT_SOURCE_DIR}/libclandmark ) -include_directories( ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13 ) -include_directories( ${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6 ) +# include_directories(${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13) +# include_directories(${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6) + execute_process(COMMAND python -c "import numpy as np; print np.get_include()" OUTPUT_VARIABLE NUMPY_INCLUDE) +message(STATUS "numpy include directories found: ${NUMPY_INCLUDE}") include_directories(${NUMPY_INCLUDE}) - set(PY_NAME_interface python_interface) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wlong-long -Wl,-rpath,'$ORIGIN/'") +if(UNIX) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wlong-long -Wl,-rpath,'$ORIGIN/'") +endif(UNIX) + +# if (WIN32) + # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /link,/rpath,$ORIGIN/") +# endif(WIN32) + + +#message("CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}") # Include the CMake script UseCython.cmake. This defines add_cython_module(). # Instruction for use can be found at the top of cmake/UseCython.cmake. include( UseCython ) -# propagate precision definition -if(DOUBLE_PRECISION) - add_definitions( -DDOUBLE_PRECISION=1 ) -else(DOUBLE_PRECISION) - add_definitions( -DDOUBLE_PRECISION=0 ) -endif(DOUBLE_PRECISION) - - # With CMake, a clean separation can be made between the source tree and the # build tree. When all source is compiled, as with pure C/C++, the source is # no-longer needed in the build tree. However, with pure *.py source, the # source is processed directly. To handle this, we reproduce the availability # of the source files in the build tree. -add_custom_target( ReplicatePythonSourceTree ALL ${CMAKE_COMMAND} -P +add_custom_target(ReplicatePythonSourceTree ALL ${CMAKE_COMMAND} -P ${CMAKE_MODULE_PATH}/ReplicatePythonSourceTree.cmake ${CMAKE_CURRENT_BINARY_DIR} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) # Process the CMakeLists.txt in the 'src' and 'bin' directory. -add_subdirectory( src ) -add_subdirectory( bin ) +add_subdirectory(src) +add_subdirectory(bin) diff --git a/python_interface/bin/CMakeLists.txt b/python_interface/bin/CMakeLists.txt index fa91de2..36cef1d 100644 --- a/python_interface/bin/CMakeLists.txt +++ b/python_interface/bin/CMakeLists.txt @@ -1,9 +1,9 @@ # python_interface/bin/CMakeLists.txt # If the pyx file is a C++ file, we should specify that here. -set_source_files_properties( ${PROJECT_SOURCE_DIR}/python_interface/src/py_flandmark.pyx PROPERTIES CYTHON_IS_CXX TRUE ) +set_source_files_properties(${PROJECT_SOURCE_DIR}/python_interface/src/py_flandmark.pyx PROPERTIES CYTHON_IS_CXX TRUE) -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath,'$ORIGIN/' " ) +#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath,'$ORIGIN/' " ) cython_add_standalone_executable( flandmark-demo MAIN_MODULE flandmark_demo.py @@ -11,4 +11,19 @@ cython_add_standalone_executable( flandmark_demo.py ) -target_link_libraries(flandmark-demo ${FLANDMARK_LIBRARIES} ${CLANDMARK_LIBRARIES}) +# target_link_libraries(flandmark-demo ${FLANDMARK_LIBRARIES} ${CLANDMARK_LIBRARIES}) +target_link_libraries(flandmark-demo ${FLANDMARK_LIBRARY_STATIC} ${CLANDMARK_LIBRARY_STATIC}) +## TRY THIS +if(APPLE) + set_target_properties(flandmark-demo PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") +else(APPLE) + if (UNIX) + message(STATUS "Linking target flandmark-demo against libpython") + target_link_libraries(flandmark-demo ${PYTHON_LIBRARIES}) + endif(UNIX) + if (MSVC) + message(STATUS "Not linking target flandmark-demo against libpython") + set_target_properties(flandmark-demo PROPERTIES LINK_FLAGS "/LTCG") + endif(MSVC) +endif(APPLE) +######### diff --git a/python_interface/examples/webcam_input.py b/python_interface/examples/webcam_input.py new file mode 100644 index 0000000..37c3bd3 --- /dev/null +++ b/python_interface/examples/webcam_input.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +""" +Created on Sun Feb 05 16:26:55 2017 + +@author: uricar.michal +""" + +import sys +sys.path.append("D:/GitHub/clandmark/install/share/clandmark/python/") + +from py_flandmark import PyFlandmark +from py_featurePool import PyFeaturePool + +#flandmark = PyFlandmark("D:/GitHub/clandmark/matlab_interface/models/FDPM.xml", False) +flandmark = PyFlandmark("D:/GitHub/clandmark/matlab_interface/models/CDPM.xml", False) + +bw = flandmark.getBaseWindowSize() +featurePool = PyFeaturePool(bw[0], bw[1], None) +featurePool.addFeatuaddSparseLBPfeatures() + +flandmark.setFeaturePool(featurePool) + +import time +import numpy as np +import cv2 + +def rgb2gray(rgb): + """ + converts rgb array to grey scale variant + accordingly to fomula taken from wiki + (this function is missing in python) + """ + return np.dot(rgb[...,:3], [0.299, 0.587, 0.144]) + +cascPath = "D:/GitHub/clandmark/data/haarcascade_frontalface_alt.xml" +faceCascade = cv2.CascadeClassifier(cascPath) + +video_capture = cv2.VideoCapture(2) + +while True: + # Capture frame-by-frame + ret, frame = video_capture.read() + + gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + arr = rgb2gray(frame) + + faces = faceCascade.detectMultiScale( + gray, + scaleFactor=1.1, + minNeighbors=5, + minSize=(30, 30), + flags=cv2.cv.CV_HAAR_SCALE_IMAGE + ) + + # Draw a rectangle around the faces + for (x, y, w, h) in faces: + bbox = np.array([x, y, x+w, y+h], dtype=np.int32) + bbox = bbox.reshape((2,2), order='F') + start_time = time.time() + P = flandmark.detect_optimized(arr, bbox) + print "Elapsed time: %s ms" % ((time.time() - start_time) * 1000) + for i in xrange(0, len(P[0,:])-1): + cv2.circle(frame, (int(round(P[0,i])), int(round(P[1,i]))), 1, (0, 0, 255), 2) + cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) + + # Display the resulting frame + cv2.imshow('CLandmark - webcam input', frame) + + if cv2.waitKey(1) & 0xFF == ord('q'): + break + +# When everything is done, release the capture +video_capture.release() +cv2.destroyAllWindows() \ No newline at end of file diff --git a/python_interface/src/CMakeLists.txt b/python_interface/src/CMakeLists.txt index 6791d6c..01720c6 100644 --- a/python_interface/src/CMakeLists.txt +++ b/python_interface/src/CMakeLists.txt @@ -1,30 +1,90 @@ # python_interface/src/CMakeLists.txt # If the pyx file is a C++ file, we should specify that here. -set_source_files_properties( ${CMAKE_CURRENT_SOURCE_DIR}/py_flandmark.pyx PROPERTIES CYTHON_IS_CXX TRUE ) -set_source_files_properties( ${CMAKE_CURRENT_SOURCE_DIR}/py_featurePool.pyx PROPERTIES CYTHON_IS_CXX TRUE ) - -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wlong-long,-Wl,-rpath,'$ORIGIN/' " ) +set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/py_flandmark.pyx PROPERTIES CYTHON_IS_CXX TRUE) +set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/py_featurePool.pyx PROPERTIES CYTHON_IS_CXX TRUE) # Multi-file cython modules do not appear to be working at the moment. -cython_add_module( py_featurePool py_featurePool.pyx ) -target_link_libraries( py_featurePool ${FLANDMARK_LIBRARIES} ${CLANDMARK_LIBRARIES} ) +cython_add_module(py_featurePool py_featurePool.pyx) + +# message(STATUS "CLANDMARK_LIBRARIES=${CLANDMARK_LIBRARIES}") +# message(STATUS "FLANDMARK_LIBRARIES=${FLANDMARK_LIBRARIES}") +message(STATUS "PYTHON_LIBRARIES=${PYTHON_LIBRARIES}") + +#target_link_libraries(py_featurePool ${FLANDMARK_LIBRARIES} ${CLANDMARK_LIBRARIES}) +target_link_libraries(py_featurePool ${FLANDMARK_LIBRARY_STATIC} ${CLANDMARK_LIBRARY_STATIC}) # for MSVC now, change _LIBRARIES to contain .lib files also, to solve this + +## TRY THIS +if(APPLE) + set_target_properties(py_featurePool PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") +else(APPLE) + if (UNIX) + message(STATUS "Linking target py_featurePool against libpython") + target_link_libraries(py_featurePool ${PYTHON_LIBRARIES}) + endif(UNIX) + if (MSVC) + message(STATUS "Not linking target py_featurePool against libpython") + set_target_properties(py_featurePool PROPERTIES LINK_FLAGS "/LTCG") + target_link_libraries(py_featurePool ${PYTHON_LIBRARIES}) + endif(MSVC) +endif(APPLE) +######### + +cython_add_module(py_flandmark py_flandmark.pyx) +# cython_add_module2( py_flandmark py_flandmark.pyx TRUE ) +# target_link_libraries(py_flandmark ${FLANDMARK_LIBRARIES} ${CLANDMARK_LIBRARIES}) +target_link_libraries(py_flandmark ${FLANDMARK_LIBRARY_STATIC} ${CLANDMARK_LIBRARY_STATIC}) # for MSVC now, chanhe _LIBRARIES to contain .lib files also, to solve this s -cython_add_module( py_flandmark py_flandmark.pyx ) -target_link_libraries( py_flandmark ${FLANDMARK_LIBRARIES} ${CLANDMARK_LIBRARIES} ) +## TRY THIS +if(APPLE) + set_target_properties(py_flandmark PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") +else(APPLE) + if (UNIX) + message(STATUS "Linking target py_flandmark against libpython") + target_link_libraries(py_flandmark ${PYTHON_LIBRARIES}) + endif(UNIX) + if (MSVC) + message(STATUS "Not linking target py_flandmark against libpython") + set_target_properties(py_flandmark PROPERTIES LINK_FLAGS "/LTCG") + target_link_libraries(py_flandmark ${PYTHON_LIBRARIES}) + endif(MSVC) +endif(APPLE) +######### add_custom_target(${PY_NAME_interface} ALL DEPENDS py_flandmark) #TODO: copy libclandmark and libflandmark -add_custom_command( - TARGET ${PY_NAME_interface} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/py_flandmark.so ${PROJECT_BINARY_DIR}/python_interface/bin - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/py_featurePool.so ${PROJECT_BINARY_DIR}/python_interface/bin -# COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/libclandmark/libclandmark${CMAKE_SHARED_LIBRARY_SUFFIX}.${clandmark_VERSION_MAJOR} ${PROJECT_BINARY_DIR}/python_interface/bin -# COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/libclandmark/libflandmark${CMAKE_SHARED_LIBRARY_SUFFIX}.${clandmark_VERSION_MAJOR} ${PROJECT_BINARY_DIR}/python_interface/bin -# COMMAND ${CMAKE_COMMAND} -E copy ${FLANDMARK_LIBRARIES} ${PROJECT_BINARY_DIR}/python_interface/bin -# COMMAND ${CMAKE_COMMAND} -E copy ${CLANDMARK_LIBRARIES} ${PROJECT_BINARY_DIR}/python_interface/bin - COMMENT "Copying python_interface/src/py_flandmark${CMAKE_SHARED_LIBRARY_SUFFIX} and python_interface/src/py_featurePool${CMAKE_SHARED_LIBRARY_SUFFIX}" -) +if (UNIX) + set(copy_py_flandmark "${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/py_flandmark${CMAKE_SHARED_LIBRARY_SUFFIX} ${PROJECT_BINARY_DIR}/python_interface/bin") + set(copy_py_featurePool "${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/py_featurePool${CMAKE_SHARED_LIBRARY_SUFFIX} ${PROJECT_BINARY_DIR}/python_interface/bin") +endif (UNIX) + +# if (MSVC) + # set(copy_py_flandmark "${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/Release/py_flandmark${CMAKE_SHARED_LIBRARY_SUFFIX} ${PROJECT_BINARY_DIR}/python_interface/bin") + # set(copy_py_featurePool "${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/Release/py_featurePool${CMAKE_SHARED_LIBRARY_SUFFIX} ${PROJECT_BINARY_DIR}/python_interface/bin") + ## set(copy_py_flandmark "${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/Release/py_flandmark${CMAKE_STATIC_LIBRARY_SUFFIX} ${PROJECT_BINARY_DIR}/python_interface/bin") + ## set(copy_py_featurePool "${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/Release/py_featurePool${CMAKE_STATIC_LIBRARY_SUFFIX} ${PROJECT_BINARY_DIR}/python_interface/bin") +# endif(MSVC) + +# add_custom_command( + # TARGET ${PY_NAME_interface} + # POST_BUILD + ##COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/py_flandmark.so ${PROJECT_BINARY_DIR}/python_interface/bin + ##COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/py_featurePool.so ${PROJECT_BINARY_DIR}/python_interface/bin + + # COMMAND ${copy_py_flandmark} + # COMMAND ${copy_py_featurePool} + +## COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/libclandmark/libclandmark${CMAKE_SHARED_LIBRARY_SUFFIX}.${clandmark_VERSION_MAJOR} ${PROJECT_BINARY_DIR}/python_interface/bin +## COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/libclandmark/libflandmark${CMAKE_SHARED_LIBRARY_SUFFIX}.${clandmark_VERSION_MAJOR} ${PROJECT_BINARY_DIR}/python_interface/bin +## COMMAND ${CMAKE_COMMAND} -E copy ${FLANDMARK_LIBRARIES} ${PROJECT_BINARY_DIR}/python_interface/bin +## COMMAND ${CMAKE_COMMAND} -E copy ${CLANDMARK_LIBRARIES} ${PROJECT_BINARY_DIR}/python_interface/bin + # COMMENT "Copying python_interface/src/py_flandmark${CMAKE_SHARED_LIBRARY_SUFFIX} and python_interface/src/py_featurePool${CMAKE_SHARED_LIBRARY_SUFFIX}" + ## COMMENT "Copying python_interface/src/py_flandmark${CMAKE_SHARED_STATIC_SUFFIX} and python_interface/src/py_featurePool${CMAKE_STATIC_LIBRARY_SUFFIX}" +# ) + +if (MSVC) + install(FILES ${PROJECT_BINARY_DIR}/python_interface/src/Release/py_flandmark.pyd DESTINATION share/clandmark/python COMPONENT Python) + install(FILES ${PROJECT_BINARY_DIR}/python_interface/src/Release/py_featurePool.pyd DESTINATION share/clandmark/python COMPONENT Python) +endif (MSVC) \ No newline at end of file diff --git a/python_interface/src/py_featurePool.pyx b/python_interface/src/py_featurePool.pyx index 15161e4..509f72e 100644 --- a/python_interface/src/py_featurePool.pyx +++ b/python_interface/src/py_featurePool.pyx @@ -102,4 +102,5 @@ cdef class PyFeaturePool: """ # TODO: Check input # cdef unsigned char* nf = NF - self.thisptr.updateNFmipmap(self.thisptr.getWidth(), self.thisptr.getHeight(), numpy.PyArray_DATA(nf)) \ No newline at end of file + self.thisptr.updateNFmipmap(self.thisptr.getWidth(), self.thisptr.getHeight(), numpy.PyArray_DATA(nf)) + \ No newline at end of file diff --git a/python_interface/src/py_flandmark.pyx b/python_interface/src/py_flandmark.pyx index 51b1379..fdd76ec 100644 --- a/python_interface/src/py_flandmark.pyx +++ b/python_interface/src/py_flandmark.pyx @@ -2,7 +2,7 @@ cimport c_flandmark cimport c_cimg cimport c_featurePool -from hgext.largefiles import featuresetup +#from hgext.largefiles import featuresetup from libc.stdlib cimport calloc, malloc, free from cpython.version cimport PY_MAJOR_VERSION From 29ce0c9460f376cd6676e0821668b1e9bed38594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20U=C5=99i=C4=8D=C3=A1=C5=99?= Date: Wed, 7 Aug 2019 20:57:03 +0200 Subject: [PATCH 8/8] Python Interface update Minor changes in the C++ library (elimination of warnings for new compilers) Update of build scripts for successful build on Windows 10 + Visual Studio 2017 + Anaconda New Python example for jointmv models --- CMakeLists.txt | 2 +- build_python_interface.bat | 17 ++- build_setup_variables.bat | 26 ++-- libclandmark/CAppearanceModel.h | 12 +- libclandmark/CDeformationCost.h | 3 +- libclandmark/CDisplacementDeformationCost.cpp | 2 +- libclandmark/CFeaturePool.h | 6 +- libclandmark/CLandmark.cpp | 14 ++- libclandmark/CLandmark.h | 14 ++- libclandmark/CLoss.h | 8 +- libclandmark/CMakeLists.txt | 77 +++++++++--- libclandmark/CMaxSumSolver.h | 6 +- libclandmark/CSparseLBPAppearanceModel.h | 3 +- libclandmark/CTreeMaxSumSolver.cpp | 3 +- libclandmark/CXMLInOut.cpp | 4 +- libclandmark/base64.h | 5 +- python_interface/CMakeLists.txt | 20 ++- python_interface/examples/webcam_input.py | 13 +- .../examples/webcam_input_jointmv.py | 115 ++++++++++++++++++ .../examples/webcam_input_single.py | 105 ++++++++++++++++ python_interface/include/c_flandmark.pxd | 1 + python_interface/src/CMakeLists.txt | 26 +++- python_interface/src/py_flandmark.pyx | 3 + 23 files changed, 409 insertions(+), 76 deletions(-) create mode 100644 python_interface/examples/webcam_input_jointmv.py create mode 100644 python_interface/examples/webcam_input_single.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 4de8bf0..d2dff8c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ project(clandmark) # The version number set(clandmark_VERSION_MAJOR 1) -set(clandmark_VERSION_MINOR 5) +set(clandmark_VERSION_MINOR 6) set(clandmark_VERSION ${clandmark_VERSION_MAJOR}.${clandmark_VERSION_MINOR}) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules") diff --git a/build_python_interface.bat b/build_python_interface.bat index 98b0758..e058188 100644 --- a/build_python_interface.bat +++ b/build_python_interface.bat @@ -10,19 +10,28 @@ if NOT EXIST %BUILD_DIR% ( cd %BUILD_DIR% -:: check if the library was compiled +:: check if the library was compiled IF NOT EXIST %INSTALL_PATH%\bin\clandmark.dll ( call %OLDDIR%\build_clandmark_libs.bat ) -::python interface build -cmake -G %CMAKE_GENERATOR% -DPYTHON_EXECUTABLE=%PYTHON_EXECUTABLE% -DPYTHON_INCLUDE_DIR=%PYTHON_INCLUDE_DIR% -DCYTHON_EXECUTABLE=%CYTHON_EXECUTABLE% -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=%INSTALL_PATH% -DBUILD_CPP_EXAMPLES=OFF -DBUILD_MATLAB_BINDINGS=OFF -DBUILD_PYTHON_BINDINGS=ON ..\ +::python interface build +cmake -G %CMAKE_GENERATOR% \ + -DPYTHON_LIBRARY=%PYTHON_LIBRARY% \ + -DPYTHON_EXECUTABLE=%PYTHON_EXECUTABLE% \ + -DPYTHON_INCLUDE_DIR=%PYTHON_INCLUDE_DIR% \ + -DCYTHON_EXECUTABLE=%CYTHON_EXECUTABLE% \ + -DBUILD_SHARED_LIBS=ON \ + -DCMAKE_INSTALL_PREFIX=%INSTALL_PATH% \ + -DBUILD_CPP_EXAMPLES=OFF \ + -DBUILD_MATLAB_BINDINGS=OFF \ + -DBUILD_PYTHON_BINDINGS=ON ..\ cmake --build . --target ReplicatePythonSourceTree %CMAKE_CONFIGURATION% cmake --build . --target py_featurePool --config %CMAKE_CONFIGURATION% cmake --build . --target py_flndmark --config %CMAKE_CONFIGURATION% -:: install +:: install cmake --build . --target INSTALL --config %CMAKE_CONFIGURATION% cd %OLDDIR% diff --git a/build_setup_variables.bat b/build_setup_variables.bat index ce5d169..5852d97 100644 --- a/build_setup_variables.bat +++ b/build_setup_variables.bat @@ -1,15 +1,21 @@ -:: Change these variables to fit your settings +:: Change these variables to fit your settings -set BUILD_DIR=D:\GitHub\clandmark\build -set CMAKE_GENERATOR="Visual Studio 14 2015 Win64" +set BUILD_DIR=D:\GitHub\clandmark\build_win10 +:: set CMAKE_GENERATOR="Visual Studio 14 2015 Win64" +set CMAKE_GENERATOR="Visual Studio 15 2017 Win64" set CMAKE_CONFIGURATION=Release -set INSTALL_PATH=D:\GitHub\clandmark\install +set INSTALL_PATH=D:\GitHub\clandmark\build_win10\install -set OpenCV_DIR=D:\opencv\opencv-2.4.13\build\ +:: set OpenCV_DIR=D:\opencv\opencv-2.4.13\build\ -set PYTHON_EXECUTABLE=D:\ProgramFiles\Anaconda2\python.exe -set PYTHON_INCLUDE_DIR=D:\ProgramFiles\Anaconda2\include -REM set PYTHON_LIBRARY=D:\ProgramFiles\Anaconda2\python27.dll -REM set PYTHON_LIBRARY=D:\ProgramFiles\Anaconda2\libs\python27.lib -set CYTHON_EXECUTABLE=D:\ProgramFiles\Anaconda2\Scripts\cython.exe +:: set PYTHON_EXECUTABLE=D:\ProgramFiles\Anaconda2\python.exe +:: set PYTHON_INCLUDE_DIR=D:\ProgramFiles\Anaconda2\include +:: set PYTHON_LIBRARY=D:\ProgramFiles\Anaconda2\python27.dll +:: set PYTHON_LIBRARY=D:\ProgramFiles\Anaconda2\libs\python27.lib +:: set CYTHON_EXECUTABLE=D:\ProgramFiles\Anaconda2\Scripts\cython.exe +set CYTHON_EXECUTABLE="C:/Program Files (x86)/Microsoft Visual Studio/Shared/Anaconda3_64/Scripts/cython.exe" +set PYTHON_EXECUTABLE="C:/Program Files (x86)/Microsoft Visual Studio/Shared/Anaconda3_64/python.exe" +set PYTHON_INCLUDE_DIR="C:/Program Files (x86)/Microsoft Visual Studio/Shared/Anaconda3_64/include" +::set PYTHON_LIBRARY="C:/Program Files (x86)/Microsoft Visual Studio/Shared/Anaconda3_64/python3.dll" +set PYTHON_LIBRARY="C:/Program Files (x86)/Microsoft Visual Studio/Shared/Anaconda3_64/pkgs/python-3.6.5-h0c2934d_0/libs/python36.lib" diff --git a/libclandmark/CAppearanceModel.h b/libclandmark/CAppearanceModel.h index ea35a26..a14d509 100644 --- a/libclandmark/CAppearanceModel.h +++ b/libclandmark/CAppearanceModel.h @@ -180,7 +180,7 @@ class CAppearanceModel { * @brief setName * @param name */ - inline void setName(std::string name) { this->name = name; } + inline void setName(std::string name_) { this->name = name_; } /** * @brief getName @@ -198,7 +198,7 @@ class CAppearanceModel { * @brief setType * @param type */ - inline void setType(std::string type) { this->type = type; } + inline void setType(std::string type_) { this->type = type_; } /** * @brief hasLoss @@ -246,7 +246,8 @@ class CAppearanceModel { protected: const int kNodeID; /**< */ - const int kLength; /**< number of feature vectors for node (component)*/ + //const int kLength; /**< number of feature vectors for node (component)*/ + const size_t kLength; /**< number of feature vectors for node (component)*/ int size[2]; /**< */ int searchSpace[4]; /**< */ @@ -351,12 +352,13 @@ class Vertex { << "}"; } - int best; /**< */ - std::vector< CAppearanceModel* > appearances; /**< */ + //int best; /**< */ + size_t best; /**< */ int ss[4]; /**< */ int winSize[2]; /**< */ int nodeID; /**< */ std::string name; /**< */ + std::vector< CAppearanceModel* > appearances; /**< */ }; } diff --git a/libclandmark/CDeformationCost.h b/libclandmark/CDeformationCost.h index c0784e3..2b0dc62 100644 --- a/libclandmark/CDeformationCost.h +++ b/libclandmark/CDeformationCost.h @@ -151,7 +151,8 @@ class CDeformationCost { // Loss function CLoss *loss; - int kDimension; + //int kDimension; + size_t kDimension; // internal representation of features goes to specialized classes (e.g. CDisplacementDeformationCost, etc.) // convention on order for edge (parent, child) diff --git a/libclandmark/CDisplacementDeformationCost.cpp b/libclandmark/CDisplacementDeformationCost.cpp index 8c3aa77..85d9929 100644 --- a/libclandmark/CDisplacementDeformationCost.cpp +++ b/libclandmark/CDisplacementDeformationCost.cpp @@ -116,7 +116,7 @@ void CDisplacementDeformationCost::write(XmlStorage &fs, fl_double_t * const w, << "ParentID" << parent->getNodeID() << "ChildID" << child->getNodeID() << "Type" << DISPLACEMENT_VECTOR - << "Dims" << kDimension; + << "Dims" << (int)kDimension; if (loss) fs << "LossType" << loss->getName(); diff --git a/libclandmark/CFeaturePool.h b/libclandmark/CFeaturePool.h index 2b22aa6..c6cb5e3 100644 --- a/libclandmark/CFeaturePool.h +++ b/libclandmark/CFeaturePool.h @@ -107,8 +107,10 @@ class CFeaturePool { private: - const int kWidth; /**< width of NF mipmap */ - const int kHeight; /**< height of NF mipmap */ + //const int kWidth; /**< width of NF mipmap */ + //const int kHeight; /**< height of NF mipmap */ + const size_t kWidth; /**< width of NF mipmap */ + const size_t kHeight; /**< height of NF mipmap */ std::vector featurePool; /**< */ unsigned char *NF_mipmap; /**< Normalized Frame mipmap */ diff --git a/libclandmark/CLandmark.cpp b/libclandmark/CLandmark.cpp index 057b800..92f99f3 100644 --- a/libclandmark/CLandmark.cpp +++ b/libclandmark/CLandmark.cpp @@ -340,10 +340,10 @@ fl_double_t *CLandmark::getLossValues(int *position) int estimate[2] = {position[INDEX(0, i, 2)]-ss[0], position[INDEX(1, i, 2)]-ss[1]}; - int position = INDEX(estimate[1], estimate[0], size[1]); + int pos = INDEX(estimate[1], estimate[0], size[1]); if (vertices[i].appearances[vertices[i].best]->hasLoss()) { - L[i] = vertices[i].appearances[vertices[i].best]->getLoss()->getLossAt(position); + L[i] = vertices[i].appearances[vertices[i].best]->getLoss()->getLossAt(pos); } else { L[i] = 0.0; } @@ -1076,8 +1076,8 @@ void CLandmark::write(const char *filename, bool writeW) fs << "name" << this->name << "version" << version - << "num_nodes" << kLandmarksCount - << "num_edges" << kEdgesCount + << "num_nodes" << (int)kLandmarksCount + << "num_edges" << (int)kEdgesCount << "graph_type" << TREE << "bw_width" << baseWindow[0] << "bw_height" << baseWindow[1] @@ -1086,7 +1086,8 @@ void CLandmark::write(const char *filename, bool writeW) << "sigma" << sigma; fs << "Nodes" << "["; - for (int i=0; i < kLandmarksCount; ++i) + //for (int i=0; i < kLandmarksCount; ++i) + for (size_t i = 0; i < kLandmarksCount; ++i) { fs << "Node"; fs << "{"; @@ -1105,7 +1106,8 @@ void CLandmark::write(const char *filename, bool writeW) fs << "]"; fs << "Edges" << "["; - for (int i=0; i < kEdgesCount; ++i) + //for (int i=0; i < kEdgesCount; ++i) + for (size_t i = 0; i < kEdgesCount; ++i) { edges.at(i)->write(fs, w[kLandmarksCount+i][0], writeW); } diff --git a/libclandmark/CLandmark.h b/libclandmark/CLandmark.h index 6a612db..3b75d1d 100644 --- a/libclandmark/CLandmark.h +++ b/libclandmark/CLandmark.h @@ -254,13 +254,15 @@ class CLandmark { * @brief getLandmarksCount * @return */ - inline int getLandmarksCount(void) { return vertices.size(); } + //inline int getLandmarksCount(void) { return vertices.size(); } + inline size_t getLandmarksCount(void) { return vertices.size(); } /** * @brief getEdgesCount * @return */ - inline int getEdgesCount(void) { return kEdgesCount; } + //inline int getEdgesCount(void) { return kEdgesCount; } + inline size_t getEdgesCount(void) { return kEdgesCount; } /** * @brief computeWdimension @@ -380,7 +382,7 @@ class CLandmark { * @brief setSmoothingSigma * @param sigma */ - inline void setSmoothingSigma(fl_double_t sigma) { this->sigma = sigma; } + inline void setSmoothingSigma(fl_double_t sigma_) { this->sigma = sigma_; } /** * @brief getSmoothingSigma @@ -508,8 +510,10 @@ class CLandmark { std::string name; /**< */ // internal parameters - int kLandmarksCount; /**< */ - int kEdgesCount; /**< */ + //int kLandmarksCount; /**< */ + //int kEdgesCount; /**< */ + size_t kLandmarksCount; /**< */ + size_t kEdgesCount; /**< */ // convention for size [width x height] int baseWindow[2]; /**< */ diff --git a/libclandmark/CLoss.h b/libclandmark/CLoss.h index 543aa50..01a1698 100644 --- a/libclandmark/CLoss.h +++ b/libclandmark/CLoss.h @@ -121,14 +121,16 @@ class CLoss { /** * @brief CLoss */ - CLoss(const CLoss&) : kLength(-1) + //CLoss(const CLoss&) : kLength(-1) + CLoss(const CLoss&) : kLength(0) {} protected: - const int kLength; /**< */ + //const int kLength; /**< */ + const size_t kLength; /**< */ fl_double_t normalizationFactor; /**< */ - int *admissiblePositions; /**< */ + int *admissiblePositions; /**< */ }; diff --git a/libclandmark/CMakeLists.txt b/libclandmark/CMakeLists.txt index 46746e3..28c44ad 100644 --- a/libclandmark/CMakeLists.txt +++ b/libclandmark/CMakeLists.txt @@ -20,12 +20,18 @@ if(NOT RAPIDXML_FOUND) message(STATUS "RapidXML not found - using internal version.") set(RapidXML_INCLUDE_DIR "$" CACHE PATH "Include directory for RapidXML" FORCE) file(GLOB RapidXML_HEADERS ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13/*.hpp) - install(FILES ${RapidXML_HEADERS} DESTINATION include COMPONENT Devel) install( - FILES - ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13/manual.html - ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13/license.txt - DESTINATION share/doc/clandmark COMPONENT Devel + FILES + ${RapidXML_HEADERS} + DESTINATION include + COMPONENT Devel + ) + install( + FILES + ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13/manual.html + ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13/license.txt + DESTINATION share/doc/clandmark + COMPONENT Devel ) endif() @@ -34,10 +40,18 @@ find_package(CImg) if(NOT CIMG_FOUND) message(STATUS "CImg not found - using internal version.") set(CImg_INCLUDE_DIR "$" CACHE PATH "Include directory for CImg" FORCE) - install(FILES ${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6/CImg.h - DESTINATION include COMPONENT Devel) + install( + FILES + ${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6/CImg.h + DESTINATION include + COMPONENT Devel + ) file(GLOB CImg_DOCS ${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6/*.txt) - install(FILES ${CImg_DOCS} DESTINATION share/doc/clandmark COMPONENT Devel) + install( + FILES ${CImg_DOCS} + DESTINATION share/doc/clandmark + COMPONENT Devel + ) endif() configure_file( @@ -134,7 +148,8 @@ if(NOT ${BUILD_SHARED_LIBS}) set_target_properties(flandmark PROPERTIES POSITION_INDEPENDENT_CODE TRUE) # -fPIC endif() target_link_libraries(flandmark clandmark) -set_target_properties(flandmark PROPERTIES +set_target_properties( + flandmark PROPERTIES SOVERSION "${clandmark_VERSION_MAJOR}" VERSION "${clandmark_VERSION}" ) @@ -145,13 +160,45 @@ set(flandmark_models ${CMAKE_SOURCE_DIR}/data/haarcascade_frontalface_alt.xml ) -install(TARGETS clandmark flandmark - EXPORT CLandmarkTargets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin - INCLUDES DESTINATION include +install( + TARGETS clandmark flandmark + EXPORT CLandmarkTargets + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + INCLUDES DESTINATION include ) + +# RapidXML +file(GLOB RapidXML_HEADERS ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13/*.hpp) +install( + FILES + ${RapidXML_HEADERS} + DESTINATION include + COMPONENT Devel +) +install( + FILES + ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13/manual.html + ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13/license.txt + DESTINATION share/doc/clandmark + COMPONENT Devel +) + +# CImg +install( + FILES + ${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6/CImg.h + DESTINATION include + COMPONENT Devel +) +file(GLOB CImg_DOCS ${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6/*.txt) +install( + FILES ${CImg_DOCS} + DESTINATION share/doc/clandmark + COMPONENT Devel +) + install(FILES ${clandmark_headers} DESTINATION include COMPONENT Devel) install(FILES ${flandmark_headers} DESTINATION include COMPONENT Devel) install(FILES ${flandmark_models} DESTINATION share/clandmark/models) diff --git a/libclandmark/CMaxSumSolver.h b/libclandmark/CMaxSumSolver.h index 279bcb6..94c4d57 100644 --- a/libclandmark/CMaxSumSolver.h +++ b/libclandmark/CMaxSumSolver.h @@ -61,8 +61,10 @@ class CMaxSumSolver { std::vector< CDeformationCost* > *edges; /**< */ // DT - int bw[2]; /**< */ - int tmpFsize; /**< */ + //int bw[2]; /**< */ + //int tmpFsize; /**< */ + size_t bw[2]; /**< */ + size_t tmpFsize; /**< */ fl_double_t * tmpA, * tmpB; /**< */ fl_double_t * rectangle; /**< */ fl_double_t * tmpDT; /**< */ diff --git a/libclandmark/CSparseLBPAppearanceModel.h b/libclandmark/CSparseLBPAppearanceModel.h index 88c01ea..3affa4c 100644 --- a/libclandmark/CSparseLBPAppearanceModel.h +++ b/libclandmark/CSparseLBPAppearanceModel.h @@ -122,7 +122,8 @@ class CSparseLBPAppearanceModel : public CAppearanceModel { const int kHeightOfPyramid; /**< */ int *LBPFeatures; /**< */ - int kSparseFeatureDimension; /**< */ + //int kSparseFeatureDimension; /**< */ + size_t kSparseFeatureDimension; /**< */ int *window; /**< */ }; diff --git a/libclandmark/CTreeMaxSumSolver.cpp b/libclandmark/CTreeMaxSumSolver.cpp index 5ef31eb..f5fa1e5 100644 --- a/libclandmark/CTreeMaxSumSolver.cpp +++ b/libclandmark/CTreeMaxSumSolver.cpp @@ -93,7 +93,8 @@ CTreeMaxSumSolver::CTreeMaxSumSolver(std::vector< Vertex > * const vertices, std // prepare intermediate arrays for indices for (int i=0; i < kLandmarks; ++i) { - int best = 0, length = 0; + //int best = 0, length = 0; + size_t best = 0, length = 0; if (graph[i].ancestors.size() > 0) { best = vertices->at(graph[i].ancestors.at(0)).best; diff --git a/libclandmark/CXMLInOut.cpp b/libclandmark/CXMLInOut.cpp index 4123bf1..50b247c 100644 --- a/libclandmark/CXMLInOut.cpp +++ b/libclandmark/CXMLInOut.cpp @@ -164,7 +164,9 @@ XmlNode XmlStorage::operator [](const char *name) void XmlStorage::writeRaw(const void *bindata, int length) { char *base64Ascii; - int base64AsciiLen; + //int base64AsciiLen; + //base64Ascii = base64(bindata, length, &base64AsciiLen); + size_t base64AsciiLen; base64Ascii = base64(bindata, length, &base64AsciiLen); if (state == VALUE_EXPECTED) diff --git a/libclandmark/base64.h b/libclandmark/base64.h index 9b5bf98..625e6c9 100644 --- a/libclandmark/base64.h +++ b/libclandmark/base64.h @@ -69,7 +69,8 @@ const static unsigned char unb64[]={ // Converts binary data of length=len to base64 characters. // Length of the resultant string is stored in flen // (you must pass pointer flen). -char* base64( const void* binaryData, int len, int *flen ) +//char* base64( const void* binaryData, int len, int *flen ) +char* base64(const void* binaryData, int len, size_t *flen) { unsigned char* bin = (unsigned char*) binaryData ; char* res; @@ -123,7 +124,7 @@ unsigned char* unbase64( const char* ascii, int len, int *flen ) { unsigned char *safeAsciiPtr = (unsigned char*)ascii; unsigned char *bin; - int cb=0; + int cb = 0; int charNo; int pad = 0; diff --git a/python_interface/CMakeLists.txt b/python_interface/CMakeLists.txt index b7180fa..f6c0a18 100644 --- a/python_interface/CMakeLists.txt +++ b/python_interface/CMakeLists.txt @@ -1,6 +1,7 @@ # python_interface/CMakeLists.txt find_package(clandmark REQUIRED) +find_package(python) include_directories( ${CLANDMARK_INCLUDE_DIRS} @@ -11,9 +12,19 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) # include_directories(${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13) # include_directories(${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6) -execute_process(COMMAND python -c "import numpy as np; print np.get_include()" OUTPUT_VARIABLE NUMPY_INCLUDE) -message(STATUS "numpy include directories found: ${NUMPY_INCLUDE}") -include_directories(${NUMPY_INCLUDE}) +# execute_process(COMMAND python -c "import numpy as np; print np.get_include()" OUTPUT_VARIABLE NUMPY_INCLUDE) +execute_process( + # COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print('\"{}\"'.format(numpy.get_include()));" + COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print('{}'.format(numpy.get_include()));" + ERROR_VARIABLE NUMPY_FIND_ERROR + RESULT_VARIABLE NUMPY_FIND_RESULT + OUTPUT_VARIABLE NUMPY_FIND_OUTPUT + OUTPUT_STRIP_TRAILING_WHITESPACE +) +message(STATUS "NUMPY_FIND_ERROR = ${NUMPY_FIND_ERROR}") +message(STATUS "NUMPY_FIND_RESULT = ${NUMPY_FIND_RESULT}") +message(STATUS "NUMPY_FIND_OUTPUT = ${NUMPY_FIND_OUTPUT}") +include_directories(${NUMPY_FIND_OUTPUT}) set(PY_NAME_interface python_interface) @@ -37,7 +48,8 @@ include( UseCython ) # no-longer needed in the build tree. However, with pure *.py source, the # source is processed directly. To handle this, we reproduce the availability # of the source files in the build tree. -add_custom_target(ReplicatePythonSourceTree ALL ${CMAKE_COMMAND} -P +add_custom_target( + ReplicatePythonSourceTree ALL ${CMAKE_COMMAND} -P ${CMAKE_MODULE_PATH}/ReplicatePythonSourceTree.cmake ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} diff --git a/python_interface/examples/webcam_input.py b/python_interface/examples/webcam_input.py index 37c3bd3..28f7c62 100644 --- a/python_interface/examples/webcam_input.py +++ b/python_interface/examples/webcam_input.py @@ -6,7 +6,8 @@ """ import sys -sys.path.append("D:/GitHub/clandmark/install/share/clandmark/python/") +# sys.path.append("D:/GitHub/clandmark/install/share/clandmark/python/") +sys.path.append("D:/GitHub/clandmark/build_win10/install/share/clandmark/python") from py_flandmark import PyFlandmark from py_featurePool import PyFeaturePool @@ -29,7 +30,7 @@ def rgb2gray(rgb): converts rgb array to grey scale variant accordingly to fomula taken from wiki (this function is missing in python) - """ + """ return np.dot(rgb[...,:3], [0.299, 0.587, 0.144]) cascPath = "D:/GitHub/clandmark/data/haarcascade_frontalface_alt.xml" @@ -54,12 +55,12 @@ def rgb2gray(rgb): # Draw a rectangle around the faces for (x, y, w, h) in faces: - bbox = np.array([x, y, x+w, y+h], dtype=np.int32) - bbox = bbox.reshape((2,2), order='F') + bbox = np.array([x, y, x+w, y+h], dtype=np.int32) + bbox = bbox.reshape((2,2), order='F') start_time = time.time() P = flandmark.detect_optimized(arr, bbox) - print "Elapsed time: %s ms" % ((time.time() - start_time) * 1000) - for i in xrange(0, len(P[0,:])-1): + print('Elapsed time: {} ms'.format((time.time() - start_time) * 1000)) + for i in range(len(P[0,:])-1): cv2.circle(frame, (int(round(P[0,i])), int(round(P[1,i]))), 1, (0, 0, 255), 2) cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) diff --git a/python_interface/examples/webcam_input_jointmv.py b/python_interface/examples/webcam_input_jointmv.py new file mode 100644 index 0000000..c2a7a66 --- /dev/null +++ b/python_interface/examples/webcam_input_jointmv.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +""" +@author: uricar.michal +""" + +import os +import sys +import time +import numpy as np +import cv2 + +sys.path.append('D:/GitHub/clandmark/build_win10/install/share/clandmark/python/') + +from py_flandmark import PyFlandmark +from py_featurePool import PyFeaturePool + + +# webcam ID +CAM_ID = 3 + +# Models +MODEL_PATH = 'D:/GitHub/clandmark/build_win10/install/share/clandmark/models/jointmv/' +VIEWPORTS = ['-PROFILE', '-HALF-PROFILE', 'FRONTAL', 'HALF-PROFILE', 'PROFILE'] +MODELS = [os.path.join(MODEL_PATH, 'JOINT_MV_SPLIT_1_'+x+'.xml') for x in VIEWPORTS] + +PHIS = len(MODELS) + +CV_CASCADE_PATH = "D:/GitHub/clandmark/data/haarcascade_frontalface_alt.xml" + + +def rgb2gray(rgb): + """ + converts rgb array to grey scale variant + accordingly to fomula taken from wiki + (this function is missing in python) + """ + return np.dot(rgb[...,:3], [0.299, 0.587, 0.144]) + + +def jointmv_detector(I, bbox, flandmarkPool): + PHIS = len(flandmarkPool) + scores = np.zeros((PHIS, 1), dtype=np.float) + Ps = [] + + for i in range(PHIS): + P = flandmarkPool[i].detect_optimized(arr, bbox) + Ps.append(P) + score = flandmarkPool[i].get_score() + scores[i] = score + + viewID = scores.argmax() + + return Ps[viewID], viewID + + +if __name__ == '__main__': + + # flandmarkPool = flandmark_init() + flandmarkPool = [] + for i in range(PHIS): + flandmarkPool.append(PyFlandmark(MODELS[i], False)) + + # Initialize featurePool + bw = flandmarkPool[0].getBaseWindowSize() + featurePool = PyFeaturePool(bw[0], bw[1], None) + featurePool.addFeatuaddSparseLBPfeatures() + + for i in range(PHIS): + flandmarkPool[i].setFeaturePool(featurePool) + + faceCascade = cv2.CascadeClassifier(CV_CASCADE_PATH) + + video_capture = cv2.VideoCapture(CAM_ID) + + while True: + # Capture frame-by-frame + ret, frame = video_capture.read() + + gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + arr = rgb2gray(frame) + + faces = faceCascade.detectMultiScale( + gray, + scaleFactor=1.1, + minNeighbors=5, + minSize=(30, 30), + flags=cv2.CASCADE_SCALE_IMAGE + ) + + # Draw a rectangle around the faces + for (x, y, w, h) in faces: + + bbox = np.array([x, y, x+w, y+h], dtype=np.int32) + bbox = bbox.reshape((2,2), order='F') + start_time = time.time() + + P, viewID = jointmv_detector(arr, bbox, flandmarkPool) + # P = flandmark.detect_optimized(arr, bbox) + + print('Elapsed time: {} ms'.format((time.time() - start_time) * 1000)) + print('VIEWPORT: {}'.format(VIEWPORTS[viewID])) + + for i in range(len(P[0,:])-1): + cv2.circle(frame, (int(round(P[0,i])), int(round(P[1,i]))), 1, (0, 0, 255), 2) + cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) + + # Display the resulting frame + cv2.imshow('CLandmark - webcam input', frame) + + if cv2.waitKey(1) & 0xFF == ord('q'): + break + + # When everything is done, release the capture + video_capture.release() + cv2.destroyAllWindows() diff --git a/python_interface/examples/webcam_input_single.py b/python_interface/examples/webcam_input_single.py new file mode 100644 index 0000000..9248f19 --- /dev/null +++ b/python_interface/examples/webcam_input_single.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +""" +Created on Sun Feb 05 16:26:55 2017 + +@author: uricar.michal +""" + +import os +import sys +import time +import numpy as np +import cv2 + +sys.path.append('D:/GitHub/clandmark/build_win10/install/share/clandmark/python/') + +from py_flandmark import PyFlandmark +from py_featurePool import PyFeaturePool + + +# webcam ID +CAM_ID = 3 + +# Models +MODEL_PATH = 'D:/GitHub/clandmark/build_win10/install/share/clandmark/models/coarse2fine/' + +MODEL = os.path.join(MODEL_PATH, 'CDPM.xml') + +CV_CASCADE_PATH = "D:/GitHub/clandmark/data/haarcascade_frontalface_alt.xml" + + +def rgb2gray(rgb): + """ + converts rgb array to grey scale variant + accordingly to fomula taken from wiki + (this function is missing in python) + """ + return np.dot(rgb[...,:3], [0.299, 0.587, 0.144]) + + +def flandmark_init(model=MODEL): + flandmark = PyFlandmark(model, False) + + # Initialize featurePool + bw = flandmark.getBaseWindowSize() + featurePool = PyFeaturePool(bw[0], bw[1], None) + featurePool.addFeatuaddSparseLBPfeatures() + + flandmark.setFeaturePool(featurePool) + + return flandmark + + +if __name__ == '__main__': + + # flandmark = flandmark_init() + flandmark = PyFlandmark(MODEL, False) + # Initialize featurePool + bw = flandmark.getBaseWindowSize() + featurePool = PyFeaturePool(bw[0], bw[1], None) + featurePool.addFeatuaddSparseLBPfeatures() + flandmark.setFeaturePool(featurePool) + + faceCascade = cv2.CascadeClassifier(CV_CASCADE_PATH) + + video_capture = cv2.VideoCapture(CAM_ID) + + while True: + # Capture frame-by-frame + ret, frame = video_capture.read() + + gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + arr = rgb2gray(frame) + + faces = faceCascade.detectMultiScale( + gray, + scaleFactor=1.1, + minNeighbors=5, + minSize=(30, 30), + flags=cv2.CASCADE_SCALE_IMAGE + ) + + # Draw a rectangle around the faces + for (x, y, w, h) in faces: + + bbox = np.array([x, y, x+w, y+h], dtype=np.int32) + bbox = bbox.reshape((2,2), order='F') + start_time = time.time() + + P = flandmark.detect_optimized(arr, bbox) + + print('Elapsed time: {} ms'.format((time.time() - start_time) * 1000)) + + for i in range(len(P[0,:])-1): + cv2.circle(frame, (int(round(P[0,i])), int(round(P[1,i]))), 1, (0, 0, 255), 2) + cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) + + # Display the resulting frame + cv2.imshow('CLandmark - webcam input', frame) + + if cv2.waitKey(1) & 0xFF == ord('q'): + break + + # When everything is done, release the capture + video_capture.release() + cv2.destroyAllWindows() diff --git a/python_interface/include/c_flandmark.pxd b/python_interface/include/c_flandmark.pxd index 919c7d3..8283bd4 100644 --- a/python_interface/include/c_flandmark.pxd +++ b/python_interface/include/c_flandmark.pxd @@ -34,6 +34,7 @@ cdef extern from "Flandmark.h" namespace "clandmark": fl_double_t* getFeatures_base(CImg[unsigned char]*, int * const) fl_double_t* getFeatures(CImg[unsigned char]*, int * const, int * const) fl_double_t* getFeatures(int * const) + fl_double_t getScore() void setLossTable(fl_double_t* loss_data, const int landmark_id) const int * getSearchSpace(const int landmark_id) const int * getBaseWindowSize() diff --git a/python_interface/src/CMakeLists.txt b/python_interface/src/CMakeLists.txt index 01720c6..6d0fb34 100644 --- a/python_interface/src/CMakeLists.txt +++ b/python_interface/src/CMakeLists.txt @@ -1,5 +1,7 @@ # python_interface/src/CMakeLists.txt +find_package(python) + # If the pyx file is a C++ file, we should specify that here. set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/py_flandmark.pyx PROPERTIES CYTHON_IS_CXX TRUE) set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/py_featurePool.pyx PROPERTIES CYTHON_IS_CXX TRUE) @@ -10,9 +12,10 @@ cython_add_module(py_featurePool py_featurePool.pyx) # message(STATUS "CLANDMARK_LIBRARIES=${CLANDMARK_LIBRARIES}") # message(STATUS "FLANDMARK_LIBRARIES=${FLANDMARK_LIBRARIES}") message(STATUS "PYTHON_LIBRARIES=${PYTHON_LIBRARIES}") +message(STATUS "Python_LIBRARIES=${Python_LIBRARIES}") #target_link_libraries(py_featurePool ${FLANDMARK_LIBRARIES} ${CLANDMARK_LIBRARIES}) -target_link_libraries(py_featurePool ${FLANDMARK_LIBRARY_STATIC} ${CLANDMARK_LIBRARY_STATIC}) # for MSVC now, change _LIBRARIES to contain .lib files also, to solve this +target_link_libraries(py_featurePool ${FLANDMARK_LIBRARY_STATIC} ${CLANDMARK_LIBRARY_STATIC}) # for MSVC now, change _LIBRARIES to contain .lib files also, to solve this ## TRY THIS if(APPLE) @@ -21,11 +24,13 @@ else(APPLE) if (UNIX) message(STATUS "Linking target py_featurePool against libpython") target_link_libraries(py_featurePool ${PYTHON_LIBRARIES}) + # target_link_libraries(py_featurePool ${Python_LIBRARIES}) endif(UNIX) if (MSVC) message(STATUS "Not linking target py_featurePool against libpython") set_target_properties(py_featurePool PROPERTIES LINK_FLAGS "/LTCG") target_link_libraries(py_featurePool ${PYTHON_LIBRARIES}) + # target_link_libraries(py_featurePool ${Python_LIBRARIES}) endif(MSVC) endif(APPLE) ######### @@ -33,7 +38,7 @@ endif(APPLE) cython_add_module(py_flandmark py_flandmark.pyx) # cython_add_module2( py_flandmark py_flandmark.pyx TRUE ) # target_link_libraries(py_flandmark ${FLANDMARK_LIBRARIES} ${CLANDMARK_LIBRARIES}) -target_link_libraries(py_flandmark ${FLANDMARK_LIBRARY_STATIC} ${CLANDMARK_LIBRARY_STATIC}) # for MSVC now, chanhe _LIBRARIES to contain .lib files also, to solve this s +target_link_libraries(py_flandmark ${FLANDMARK_LIBRARY_STATIC} ${CLANDMARK_LIBRARY_STATIC}) # for MSVC now, change _LIBRARIES to contain .lib files also, to solve this s ## TRY THIS if(APPLE) @@ -45,8 +50,9 @@ else(APPLE) endif(UNIX) if (MSVC) message(STATUS "Not linking target py_flandmark against libpython") - set_target_properties(py_flandmark PROPERTIES LINK_FLAGS "/LTCG") + # set_target_properties(py_flandmark PROPERTIES LINK_FLAGS "/LTCG") target_link_libraries(py_flandmark ${PYTHON_LIBRARIES}) + # target_link_libraries(py_flandmark ${Python_LIBRARIES}) endif(MSVC) endif(APPLE) ######### @@ -75,7 +81,7 @@ endif (UNIX) # COMMAND ${copy_py_flandmark} # COMMAND ${copy_py_featurePool} - + ## COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/libclandmark/libclandmark${CMAKE_SHARED_LIBRARY_SUFFIX}.${clandmark_VERSION_MAJOR} ${PROJECT_BINARY_DIR}/python_interface/bin ## COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/libclandmark/libflandmark${CMAKE_SHARED_LIBRARY_SUFFIX}.${clandmark_VERSION_MAJOR} ${PROJECT_BINARY_DIR}/python_interface/bin ## COMMAND ${CMAKE_COMMAND} -E copy ${FLANDMARK_LIBRARIES} ${PROJECT_BINARY_DIR}/python_interface/bin @@ -85,6 +91,14 @@ endif (UNIX) # ) if (MSVC) - install(FILES ${PROJECT_BINARY_DIR}/python_interface/src/Release/py_flandmark.pyd DESTINATION share/clandmark/python COMPONENT Python) - install(FILES ${PROJECT_BINARY_DIR}/python_interface/src/Release/py_featurePool.pyd DESTINATION share/clandmark/python COMPONENT Python) + install( + FILES ${PROJECT_BINARY_DIR}/python_interface/src/Release/py_flandmark.pyd + DESTINATION share/clandmark/python + COMPONENT Python + ) + install( + FILES ${PROJECT_BINARY_DIR}/python_interface/src/Release/py_featurePool.pyd + DESTINATION share/clandmark/python + COMPONENT Python + ) endif (MSVC) \ No newline at end of file diff --git a/python_interface/src/py_flandmark.pyx b/python_interface/src/py_flandmark.pyx index fdd76ec..911ca59 100644 --- a/python_interface/src/py_flandmark.pyx +++ b/python_interface/src/py_flandmark.pyx @@ -434,6 +434,9 @@ cdef class PyFlandmark: return landmarks + def get_score(self): + cdef double score = self.thisptr.getScore() + return score ################################################################################### # aulilary functions