| |
|
|
| |
| #include <opencv2/opencv.hpp> |
| |
| #define OPENPOSE_FLAGS_DISABLE_POSE |
| #include <openpose/flags.hpp> |
| |
| #include <openpose/headers.hpp> |
|
|
| #ifdef USE_CUDA |
| #ifdef USE_CAFFE |
| #include <caffe/net.hpp> |
| #endif |
|
|
| DEFINE_string(image_path, "examples/media/COCO_val2014_000000000192.jpg", "Process the desired image."); |
|
|
| cv::Mat gpuResize(cv::Mat& img, const cv::Size& newSize) |
| { |
| #if defined USE_CAFFE && defined USE_CUDA |
| |
| float* cpuPtr = &img.at<float>(0); |
| float* gpuPtr; |
| cudaMallocHost((void **)&gpuPtr, img.size().width * img.size().height * sizeof(float)); |
| cudaMemcpy(gpuPtr, cpuPtr, img.size().width * img.size().height * sizeof(float), |
| cudaMemcpyHostToDevice); |
|
|
| |
| cv::Mat newImg = cv::Mat(newSize,CV_32FC1,cv::Scalar(0)); |
| float* newCpuPtr = &newImg.at<float>(0); |
| float* newGpuPtr; |
| cudaMallocHost((void **)&newGpuPtr, newSize.width * newSize.height * sizeof(float)); |
| cudaMemcpy(newGpuPtr, newCpuPtr, newSize.width * newSize.height * sizeof(float), |
| cudaMemcpyHostToDevice); |
|
|
| std::vector<const float*> sourcePtrs; |
| sourcePtrs.emplace_back(gpuPtr); |
| std::array<int, 4> targetSize = {1,1,newImg.size().height,newImg.size().width}; |
| std::array<int, 4> sourceSize = {1,1,img.size().height,img.size().width}; |
| std::vector<std::array<int, 4>> sourceSizes; |
| sourceSizes.emplace_back(sourceSize); |
| op::resizeAndMergeGpu(newGpuPtr, sourcePtrs, targetSize, sourceSizes); |
| cudaMemcpy(newCpuPtr, newGpuPtr, newImg.size().width * newImg.size().height * sizeof(float), |
| cudaMemcpyDeviceToHost); |
|
|
| cudaFree(gpuPtr); |
| cudaFree(newGpuPtr); |
| return newImg; |
| #else |
| UNUSED(img); |
| UNUSED(newSize); |
| op::error("OpenPose must be compiled with the `USE_CAFFE` & `USE_CUDA` macro definitions in order to run" |
| " this functionality.", __LINE__, __FUNCTION__, __FILE__); |
| return cv::Mat(); |
| #endif |
| } |
|
|
| cv::Mat cpuResize(cv::Mat& img, cv::Size newSize) |
| { |
| |
| float* cpuPtr = &img.at<float>(0); |
|
|
| |
| cv::Mat newImg = cv::Mat(newSize,CV_32FC1,cv::Scalar(0)); |
|
|
| std::vector<const float*> sourcePtrs; |
| sourcePtrs.emplace_back(cpuPtr); |
| std::array<int, 4> targetSize = {1,1,newImg.size().height,newImg.size().width}; |
| std::array<int, 4> sourceSize = {1,1,img.size().height,img.size().width}; |
| std::vector<std::array<int, 4>> sourceSizes; |
| sourceSizes.emplace_back(sourceSize); |
| op::resizeAndMergeCpu(&newImg.at<float>(0), sourcePtrs, targetSize, sourceSizes); |
|
|
| return newImg; |
| } |
|
|
| int resizeTest() |
| { |
| try |
| { |
| |
| op::Matrix opImg = op::loadImage(FLAGS_image_path, op::getCvLoadImageGrayScale()); |
| cv::Mat img = OP_OP2CVMAT(opImg); |
| if(img.empty()) |
| op::error("Could not open or find the image: " + FLAGS_image_path, __LINE__, __FUNCTION__, __FILE__); |
| img.convertTo(img, CV_32FC1); |
| img = cpuResize(img, cv::Size(img.size().width/4,img.size().height/4)); |
| img*=0.005; |
|
|
| cv::Mat gpuImg = gpuResize(img, cv::Size(img.size().width*8,img.size().height*8)); |
| cv::Mat cpuImg = cpuResize(img, cv::Size(img.size().width*8,img.size().height*8)); |
| cv::imshow("gpuImg", gpuImg); |
| cv::imshow("cpuImg", cpuImg); |
|
|
| op::opLog("Done"); |
| cv::waitKey(0); |
|
|
| return 0; |
| } |
| catch (const std::exception& e) |
| { |
| op::error(e.what(), __LINE__, __FUNCTION__, __FILE__); |
| return -1; |
| } |
| } |
| #endif |
|
|
| int main(int argc, char *argv[]) |
| { |
| #ifdef USE_CUDA |
| |
| gflags::ParseCommandLineFlags(&argc, &argv, true); |
|
|
| |
| return resizeTest(); |
| #else |
| op::error("OpenPose must be compiled with the `USE_CAFFE` & `USE_CUDA` macro definitions in order to run" |
| " this functionality.", __LINE__, __FUNCTION__, __FILE__); |
| return 0; |
| #endif |
| } |
|
|