update.
This commit is contained in:
parent
33a0c50ea3
commit
5330379d4c
@ -8,6 +8,7 @@ add_executable(PassengerStatistics main.cpp
|
|||||||
Camera.h Camera.cpp
|
Camera.h Camera.cpp
|
||||||
ImageUtilities.h ImageUtilities.cpp
|
ImageUtilities.h ImageUtilities.cpp
|
||||||
NngServer.h NngServer.cpp
|
NngServer.h NngServer.cpp
|
||||||
|
OpenCVAlgorithm.h OpenCVAlgorithm.cpp
|
||||||
RtspServer.h RtspServer.cpp
|
RtspServer.h RtspServer.cpp
|
||||||
RwAlgorithm.h RwAlgorithm.cpp
|
RwAlgorithm.h RwAlgorithm.cpp
|
||||||
Settings.h Settings.cpp
|
Settings.h Settings.cpp
|
||||||
|
42
Main/OpenCVAlgorithm.cpp
Normal file
42
Main/OpenCVAlgorithm.cpp
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
#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;
|
||||||
|
}
|
||||||
|
}
|
21
Main/OpenCVAlgorithm.h
Normal file
21
Main/OpenCVAlgorithm.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#ifndef __OPENCVALGORITHM_H__
|
||||||
|
#define __OPENCVALGORITHM_H__
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
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__
|
@ -4,7 +4,7 @@
|
|||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <opencv2/opencv.hpp>
|
#include <opencv2/opencv.hpp>
|
||||||
|
|
||||||
bool Algorithm::initialize() {
|
bool RwAlgorithm::initialize() {
|
||||||
using namespace std::chrono;
|
using namespace std::chrono;
|
||||||
if (m_firstTime == system_clock::time_point{}) {
|
if (m_firstTime == system_clock::time_point{}) {
|
||||||
m_firstTime = system_clock::now();
|
m_firstTime = system_clock::now();
|
||||||
@ -38,7 +38,7 @@ bool Algorithm::initialize() {
|
|||||||
return m_handle != nullptr;
|
return m_handle != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Algorithm::detect(const uint8_t *imageData) {
|
void RwAlgorithm::detect(const uint8_t *imageData) {
|
||||||
if (m_handle == nullptr) {
|
if (m_handle == nullptr) {
|
||||||
initialize();
|
initialize();
|
||||||
}
|
}
|
||||||
@ -49,7 +49,7 @@ void Algorithm::detect(const uint8_t *imageData) {
|
|||||||
ds_pedestrian_det_hisi(m_handle, m_buffer.data(), bboxes);
|
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<unsigned char *>(nv21Data));
|
cv::Mat nv21Image(height + height / 2, width, CV_8UC1, const_cast<unsigned char *>(nv21Data));
|
||||||
cv::Mat bgrImage(height, width, CV_8UC3, bgr24Data);
|
cv::Mat bgrImage(height, width, CV_8UC3, bgr24Data);
|
||||||
cv::cvtColor(nv21Image, bgrImage, cv::COLOR_YUV2BGR_NV21);
|
cv::cvtColor(nv21Image, bgrImage, cv::COLOR_YUV2BGR_NV21);
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
class Algorithm {
|
class RwAlgorithm {
|
||||||
public:
|
public:
|
||||||
static constexpr int DetectImageWidth = 1024;
|
static constexpr int DetectImageWidth = 1024;
|
||||||
static constexpr int DetectImageHeight = 576;
|
static constexpr int DetectImageHeight = 576;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "VideoInput.h"
|
#include "VideoInput.h"
|
||||||
#include "Core/Logger.h"
|
#include "Core/Logger.h"
|
||||||
|
#include "OpenCVAlgorithm.h"
|
||||||
#include "get_scene_param_videomode.h"
|
#include "get_scene_param_videomode.h"
|
||||||
#include "rw_mpp_api.h"
|
#include "rw_mpp_api.h"
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -11,6 +12,7 @@ public:
|
|||||||
int32_t encodeChannel = -1;
|
int32_t encodeChannel = -1;
|
||||||
int32_t scaleChannel = -1;
|
int32_t scaleChannel = -1;
|
||||||
S_vdec_config decoderConfig;
|
S_vdec_config decoderConfig;
|
||||||
|
OpenCVAlgorithm algorithm;
|
||||||
};
|
};
|
||||||
|
|
||||||
VideoInput::VideoInput(int32_t width, int32_t height) : m_d(new VideoInputPrivate()), m_width(width), m_height(height) {
|
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;
|
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);
|
status = rw_mpp__vscale_start(m_d->scaleChannel, &scaleConfig);
|
||||||
if (status != 0) {
|
if (status != 0) {
|
||||||
LOG(error) << "rw_mpp__vscale_start() failed, status: " << status;
|
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) {
|
void VideoInputPrivate::processImage(S_mpp_img &image, S_mpp_img &detectImage, uint64_t frameIndex) {
|
||||||
// algorithm.detect(detectImage.nv21);
|
// algorithm.detect(detectImage.nv21);
|
||||||
|
|
||||||
|
// algorithm.detect(detectImage.nv21, detectImage.width, detectImage.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VideoInputPrivate::processFrame(S_mpp_img &image) {
|
void VideoInputPrivate::processFrame(S_mpp_img &image) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user