43 lines
1.7 KiB
C++
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;
|
|
}
|
|
}
|