#include "OpenCVAlgorithm.h" #include "Core/Logger.h" #include #include class OpenCVAlgorithmPrivate { public: cv::HOGDescriptor hog; std::array bgrBuffer; cv::Mat convertNV21ToMat(int width, int height, const uint8_t *nv21_data) { cv::Mat yuv(height + height / 2, width, CV_8UC1, (void *)nv21_data); cv::Mat bgr(height, width, CV_8UC3, bgrBuffer.data()); cv::cvtColor(yuv, bgr, cv::COLOR_YUV2BGR_NV21); return bgr; } }; OpenCVAlgorithm::OpenCVAlgorithm() : m_d{new OpenCVAlgorithmPrivate()} { m_d->hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector()); } void OpenCVAlgorithm::detect(const uint8_t *imageData, int width, int height) { using namespace std::chrono; auto begin = system_clock::now(); auto frame = m_d->convertNV21ToMat(width, height, imageData); auto elapsed = duration_cast(system_clock::now() - begin); LOG(info) << "convert image(" << width << "x" << height << ") elapsed: " << elapsed; std::vector detectedPeople; begin = system_clock::now(); m_d->hog.detectMultiScale(frame, detectedPeople, 0, cv::Size(16, 16), // 增大步长,减少窗口数量 cv::Size(32, 32), 1.05, // 增大缩放因子,减少金字塔层数 2); elapsed = duration_cast(system_clock::now() - begin); LOG(info) << "people number: " << detectedPeople.size() << ", elapsed: " << elapsed; } OpenCVAlgorithm::~OpenCVAlgorithm() { if (m_d != nullptr) { delete m_d; } }