#ifndef OPENCV_GAPI_PIPELINE_MODELING_TOOL_UTILS_HPP #define OPENCV_GAPI_PIPELINE_MODELING_TOOL_UTILS_HPP #include #if defined(_WIN32) #include #endif // FIXME: It's better to place it somewhere in common.hpp struct OutputDescr { std::vector dims; int precision; }; namespace utils { inline void generateRandom(cv::Mat& out) { switch (out.depth()) { case CV_8U: cv::randu(out, 0, 255); break; case CV_32F: cv::randu(out, 0.f, 1.f); break; case CV_16F: { cv::Mat fp32_mat(out.size(), CV_MAKETYPE(CV_32F, out.channels())); cv::randu(fp32_mat, 0.f, 1.f); fp32_mat.convertTo(out, out.type()); break; } default: throw std::logic_error("Unsupported preprocessing depth"); } } inline void sleep(double ms) { #if defined(_WIN32) // NB: It takes portions of 100 nanoseconds. int64_t ns_units = static_cast(ms * 1e4); // FIXME: Wrap it to RAII and instance only once. HANDLE timer = CreateWaitableTimer(NULL, true, NULL); if (!timer) { throw std::logic_error("Failed to create timer"); } LARGE_INTEGER li; li.QuadPart = -ns_units; if(!SetWaitableTimer(timer, &li, 0, NULL, NULL, false)){ CloseHandle(timer); throw std::logic_error("Failed to set timer"); } if (WaitForSingleObject(timer, INFINITE) != WAIT_OBJECT_0) { CloseHandle(timer); throw std::logic_error("Failed to wait timer"); } CloseHandle(timer); #else using namespace std::chrono; std::this_thread::sleep_for(duration(ms)); #endif } template typename duration_t::rep measure(std::function f) { using namespace std::chrono; auto start = high_resolution_clock::now(); f(); return duration_cast( high_resolution_clock::now() - start).count(); } template typename duration_t::rep timestamp() { using namespace std::chrono; auto now = high_resolution_clock::now(); return duration_cast(now.time_since_epoch()).count(); } } // namespace utils #endif // OPENCV_GAPI_PIPELINE_MODELING_TOOL_UTILS_HPP