diff --git a/exe/FaceLandmarkImg/FaceLandmarkImg.cpp b/exe/FaceLandmarkImg/FaceLandmarkImg.cpp index c38a085c..4b6121db 100644 --- a/exe/FaceLandmarkImg/FaceLandmarkImg.cpp +++ b/exe/FaceLandmarkImg/FaceLandmarkImg.cpp @@ -314,19 +314,8 @@ int main(int argc, char **argv) // Loading image cv::Mat read_image = cv::imread(file, -1); - - // Deal with 16 bit images (TODO this should be a proper conversion code pulled out) - if (read_image.type() == CV_16UC3 || read_image.type() == CV_16UC1) - { - if(read_image.channels() == 3) - { - read_image.convertTo(read_image, CV_8UC3, 1.0 / 256.0); - } - else if(read_image.channels() == 1) - { - read_image.convertTo(read_image, CV_8UC1, 1.0 / 256.0); - } - } + // Deal with 16 bit images + LandmarkDetector::convert_to_8bit_bgr_or_grayscale(read_image); if (read_image.empty()) { diff --git a/exe/FeatureExtraction/FeatureExtraction.cpp b/exe/FeatureExtraction/FeatureExtraction.cpp index e27fd80b..c0d0daa1 100644 --- a/exe/FeatureExtraction/FeatureExtraction.cpp +++ b/exe/FeatureExtraction/FeatureExtraction.cpp @@ -363,6 +363,9 @@ int main(int argc, char **argv) { string curr_img_file = input_image_files[f_n][curr_img]; captured_image = cv::imread(curr_img_file, -1); + // Deal with 16 bit images + LandmarkDetector::convert_to_8bit_bgr_or_grayscale(captured_image); + } else { @@ -562,6 +565,9 @@ int main(int argc, char **argv) { string curr_img_file = input_image_files[f_n][curr_img]; captured_image = cv::imread(curr_img_file, -1); + // Deal with 16 bit images + LandmarkDetector::convert_to_8bit_bgr_or_grayscale(captured_image); + } else { diff --git a/lib/local/LandmarkDetector/include/LandmarkDetectorUtils.h b/lib/local/LandmarkDetector/include/LandmarkDetectorUtils.h index 4798f570..0ca076b9 100644 --- a/lib/local/LandmarkDetector/include/LandmarkDetectorUtils.h +++ b/lib/local/LandmarkDetector/include/LandmarkDetectorUtils.h @@ -158,7 +158,12 @@ namespace LandmarkDetector //============================================================================ // General utilty functions //============================================================================ + + // Convert an image to grayscale void convert_to_grayscale(const cv::Mat& in, cv::Mat& out); + // Convert an image to an 8bit one with one channel (Grayscale) or three channels (BGR), depending on number of original channels + void convert_to_8bit_bgr_or_grayscale(cv::Mat& in_out); + } #endif diff --git a/lib/local/LandmarkDetector/src/LandmarkDetectorUtils.cpp b/lib/local/LandmarkDetector/src/LandmarkDetectorUtils.cpp index 8fd9740a..e9637531 100644 --- a/lib/local/LandmarkDetector/src/LandmarkDetectorUtils.cpp +++ b/lib/local/LandmarkDetector/src/LandmarkDetectorUtils.cpp @@ -1766,4 +1766,45 @@ void convert_to_grayscale(const cv::Mat& in, cv::Mat& out) } } +void convert_to_8bit_bgr_or_grayscale(cv::Mat& in_out) +{ + if (in_out.channels() == 3) + { + // Make sure it's in a correct format + if (in_out.depth() != CV_8U) + { + if (in_out.depth() == CV_16U) + { + in_out = in_out / 256; + in_out.convertTo(in_out, CV_8UC3); + } + else if (in_out.depth() != CV_8U) + { + in_out.convertTo(in_out, CV_8U); + } + } + } + else if (in_out.channels() == 4) + { + cv::cvtColor(in_out, in_out, CV_BGRA2BGR); + + if (in_out.depth() == CV_16U) + { + in_out = in_out / 256; + in_out.convertTo(in_out, CV_8UC3); + } + } + else + { + if (in_out.depth() == CV_16U) + { + in_out = in_out / 256; + } + else if (in_out.depth() != CV_8U) + { + in_out.convertTo(in_out, CV_8U); + } + } +} + } diff --git a/matlab_runners/Full_test_suite.m b/matlab_runners/Full_test_suite.m index 2d47cfd4..1008e38e 100644 --- a/matlab_runners/Full_test_suite.m +++ b/matlab_runners/Full_test_suite.m @@ -22,6 +22,21 @@ assert(median(err_clnf) < 0.039); run_yt_dataset; assert(median(ceclm_error) < 0.045); assert(median(clnf_error) < 0.053); +run_300VW_dataset_OpenFace; +assert(median(ceclm_error_49_cat_1) < 0.025); +assert(median(ceclm_error_49_cat_2) < 0.027); +assert(median(ceclm_error_49_cat_3) < 0.032); +assert(median(ceclm_error_66_cat_1) < 0.032); +assert(median(ceclm_error_66_cat_2) < 0.036); +assert(median(ceclm_error_66_cat_3) < 0.041); + +assert(median(clnf_error_49_cat_1) < 0.029); +assert(median(clnf_error_49_cat_2) < 0.035); +assert(median(clnf_error_49_cat_3) < 0.040); +assert(median(clnf_error_66_cat_1) < 0.039); +assert(median(clnf_error_66_cat_2) < 0.044); +assert(median(clnf_error_66_cat_3) < 0.049); + cd('../'); %% AUs