From 5330379d4cee2204105a29c1d128d9cbc680f432 Mon Sep 17 00:00:00 2001 From: amass <168062547@qq.com> Date: Sun, 4 May 2025 11:54:40 +0800 Subject: [PATCH] update. --- Main/CMakeLists.txt | 1 + Main/OpenCVAlgorithm.cpp | 42 ++++++++++++++++++++++++++++++++++++++++ Main/OpenCVAlgorithm.h | 21 ++++++++++++++++++++ Main/RwAlgorithm.cpp | 6 +++--- Main/RwAlgorithm.h | 2 +- Main/VideoInput.cpp | 6 +++++- 6 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 Main/OpenCVAlgorithm.cpp create mode 100644 Main/OpenCVAlgorithm.h diff --git a/Main/CMakeLists.txt b/Main/CMakeLists.txt index a1a432d..6d4abfc 100644 --- a/Main/CMakeLists.txt +++ b/Main/CMakeLists.txt @@ -8,6 +8,7 @@ add_executable(PassengerStatistics main.cpp Camera.h Camera.cpp ImageUtilities.h ImageUtilities.cpp NngServer.h NngServer.cpp + OpenCVAlgorithm.h OpenCVAlgorithm.cpp RtspServer.h RtspServer.cpp RwAlgorithm.h RwAlgorithm.cpp Settings.h Settings.cpp diff --git a/Main/OpenCVAlgorithm.cpp b/Main/OpenCVAlgorithm.cpp new file mode 100644 index 0000000..0372cf2 --- /dev/null +++ b/Main/OpenCVAlgorithm.cpp @@ -0,0 +1,42 @@ +#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; + } +} diff --git a/Main/OpenCVAlgorithm.h b/Main/OpenCVAlgorithm.h new file mode 100644 index 0000000..22e919d --- /dev/null +++ b/Main/OpenCVAlgorithm.h @@ -0,0 +1,21 @@ +#ifndef __OPENCVALGORITHM_H__ +#define __OPENCVALGORITHM_H__ + +#include +#include + +class OpenCVAlgorithmPrivate; + +class OpenCVAlgorithm { +public: + static constexpr int DetectImageWidth = 576; + static constexpr int DetectImageHeight = 320; + OpenCVAlgorithm(); + void detect(const uint8_t *imageData, int width, int height); + ~OpenCVAlgorithm(); + +private: + OpenCVAlgorithmPrivate *m_d = nullptr; +}; + +#endif // __OPENCVALGORITHM_H__ \ No newline at end of file diff --git a/Main/RwAlgorithm.cpp b/Main/RwAlgorithm.cpp index 9a54254..5cbfdd0 100644 --- a/Main/RwAlgorithm.cpp +++ b/Main/RwAlgorithm.cpp @@ -4,7 +4,7 @@ #include #include -bool Algorithm::initialize() { +bool RwAlgorithm::initialize() { using namespace std::chrono; if (m_firstTime == system_clock::time_point{}) { m_firstTime = system_clock::now(); @@ -38,7 +38,7 @@ bool Algorithm::initialize() { return m_handle != nullptr; } -void Algorithm::detect(const uint8_t *imageData) { +void RwAlgorithm::detect(const uint8_t *imageData) { if (m_handle == nullptr) { initialize(); } @@ -49,7 +49,7 @@ void Algorithm::detect(const uint8_t *imageData) { ds_pedestrian_det_hisi(m_handle, m_buffer.data(), bboxes); } -void Algorithm::NV21ToBGR24(const unsigned char *nv21Data, unsigned char *bgr24Data, int width, int height) { +void RwAlgorithm::NV21ToBGR24(const unsigned char *nv21Data, unsigned char *bgr24Data, int width, int height) { cv::Mat nv21Image(height + height / 2, width, CV_8UC1, const_cast(nv21Data)); cv::Mat bgrImage(height, width, CV_8UC3, bgr24Data); cv::cvtColor(nv21Image, bgrImage, cv::COLOR_YUV2BGR_NV21); diff --git a/Main/RwAlgorithm.h b/Main/RwAlgorithm.h index 945e096..46a4e98 100644 --- a/Main/RwAlgorithm.h +++ b/Main/RwAlgorithm.h @@ -5,7 +5,7 @@ #include #include -class Algorithm { +class RwAlgorithm { public: static constexpr int DetectImageWidth = 1024; static constexpr int DetectImageHeight = 576; diff --git a/Main/VideoInput.cpp b/Main/VideoInput.cpp index dfc3baa..5ffe679 100644 --- a/Main/VideoInput.cpp +++ b/Main/VideoInput.cpp @@ -1,5 +1,6 @@ #include "VideoInput.h" #include "Core/Logger.h" +#include "OpenCVAlgorithm.h" #include "get_scene_param_videomode.h" #include "rw_mpp_api.h" #include @@ -11,6 +12,7 @@ public: int32_t encodeChannel = -1; int32_t scaleChannel = -1; S_vdec_config decoderConfig; + OpenCVAlgorithm algorithm; }; VideoInput::VideoInput(int32_t width, int32_t height) : m_d(new VideoInputPrivate()), m_width(width), m_height(height) { @@ -122,7 +124,7 @@ bool VideoInput::startEncode() { } m_d->scaleChannel = 0; - S_vscale_cfg scaleConfig = {2960, 1664, 1280, 720}; + S_vscale_cfg scaleConfig = {2960, 1664, OpenCVAlgorithm::DetectImageWidth, OpenCVAlgorithm::DetectImageHeight}; status = rw_mpp__vscale_start(m_d->scaleChannel, &scaleConfig); if (status != 0) { LOG(error) << "rw_mpp__vscale_start() failed, status: " << status; @@ -159,6 +161,8 @@ void VideoInput::setPacketHandler(const PacketHandler &hanlder) { void VideoInputPrivate::processImage(S_mpp_img &image, S_mpp_img &detectImage, uint64_t frameIndex) { // algorithm.detect(detectImage.nv21); + + // algorithm.detect(detectImage.nv21, detectImage.width, detectImage.height); } void VideoInputPrivate::processFrame(S_mpp_img &image) {