PassengerStatistics/Main/OpenCVAlgorithm.cpp
2025-05-04 11:54:40 +08:00

43 lines
1.7 KiB
C++

#include "OpenCVAlgorithm.h"
#include "Core/Logger.h"
#include <opencv2/objdetect.hpp>
#include <opencv2/opencv.hpp>
class OpenCVAlgorithmPrivate {
public:
cv::HOGDescriptor hog;
std::array<uint8_t, OpenCVAlgorithm::DetectImageWidth * OpenCVAlgorithm::DetectImageHeight * 3> 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<milliseconds>(system_clock::now() - begin);
LOG(info) << "convert image(" << width << "x" << height << ") elapsed: " << elapsed;
std::vector<cv::Rect> 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<milliseconds>(system_clock::now() - begin);
LOG(info) << "people number: " << detectedPeople.size() << ", elapsed: " << elapsed;
}
OpenCVAlgorithm::~OpenCVAlgorithm() {
if (m_d != nullptr) {
delete m_d;
}
}