Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added VirtualPTZ Module and BrightnessContrast Module #31

Merged
merged 6 commits into from
Sep 15, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions base/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,8 @@ SET(IP_FILES
src/ImageResizeCV.cpp
src/ImageEncoderCV.cpp
src/RotateCV.cpp
src/BrightnessContrastControl.cpp
src/VirtualPTZ.cpp
)

SET(IP_FILES_H
Expand All @@ -222,6 +224,8 @@ SET(IP_FILES_H
include/ImageResizeCV.h
include/ImageEncoderCV.h
include/RotateCV.h
include/BrightnessContrastControl.h
include/VirtualPTZ.h
)

SET(CUDA_CORE_FILES
Expand Down Expand Up @@ -418,6 +422,8 @@ SET(UT_FILES
test/ImageEncodeCV_tests.cpp
test/QRReader_tests.cpp
test/rotatecv_tests.cpp
test/brightness_contrast_tests.cpp
test/virtualptz_tests.cpp
${ARM64_UT_FILES}
${CUDA_UT_FILES}
)
Expand Down
54 changes: 54 additions & 0 deletions base/include/BrightnessContrastControl.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#pragma once

#include "Module.h"

class BrightnessContrastControlProps : public ModuleProps
{
public:
BrightnessContrastControlProps(double _alpha, int _beta) : alpha(_alpha), beta(_beta)
{
}
double alpha;
int beta;

size_t getSerializeSize()
{
return ModuleProps::getSerializeSize() + sizeof(int) + sizeof(double);
}

private:
friend class boost::serialization::access;

template <class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar &boost::serialization::base_object<ModuleProps>(*this);
ar &alpha &beta;
}
};

class BrightnessContrastControl : public Module
{

public:
BrightnessContrastControl(BrightnessContrastControlProps _props);
virtual ~BrightnessContrastControl();
bool init();
bool term();
void setProps(BrightnessContrastControlProps &props);
BrightnessContrastControlProps getProps();

protected:
bool process(frame_container &frames);
bool processSOS(frame_sp &frame);
bool validateInputPins();
bool validateOutputPins();
void addInputPin(framemetadata_sp &metadata, string &pinId);
void setProps(BrightnessContrastControl);
bool handlePropsChange(frame_sp &frame);

private:
void setMetadata(framemetadata_sp &metadata);
class Detail;
boost::shared_ptr<Detail> mDetail;
};
62 changes: 62 additions & 0 deletions base/include/VirtualPTZ.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#pragma once

#include "Module.h"

class VirtualPTZProps : public ModuleProps
{
public:
VirtualPTZProps()
{
roiHeight = roiWidth = 1;
roiX = roiY = 0;
}
VirtualPTZProps(float _roiWidth, float _roiHeight, float _roiX, float _roiY) : roiWidth(_roiWidth), roiHeight(_roiHeight), roiX(_roiX), roiY(_roiY)
{
}

float roiX;
float roiY;
float roiWidth;
float roiHeight;

size_t getSerializeSize()
{
return ModuleProps::getSerializeSize() + sizeof(float) * 4;
}

private:
friend class boost::serialization::access;

template <class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar &boost::serialization::base_object<ModuleProps>(*this);
ar &roiX &roiY &roiWidth &roiHeight;
}
};

class VirtualPTZ : public Module
{

public:
VirtualPTZ(VirtualPTZProps _props);
virtual ~VirtualPTZ();
bool init();
bool term();
void setProps(VirtualPTZProps &props);
VirtualPTZProps getProps();

protected:
bool process(frame_container &frames);
bool processSOS(frame_sp &frame);
bool validateInputPins();
bool validateOutputPins();
void addInputPin(framemetadata_sp &metadata, string &pinId);
void setProps(VirtualPTZ);
bool handlePropsChange(frame_sp &frame);

private:
void setMetadata(framemetadata_sp &metadata);
class Detail;
boost::shared_ptr<Detail> mDetail;
};
165 changes: 165 additions & 0 deletions base/src/BrightnessContrastControl.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
#include "BrightnessContrastControl.h"
#include "FrameMetadata.h"
#include "FrameMetadataFactory.h"
#include "Frame.h"
#include "Logger.h"
#include <opencv2/imgcodecs.hpp>
#include "opencv2/highgui.hpp"
#include "Utils.h"

class BrightnessContrastControl::Detail
{
public:
Detail(BrightnessContrastControlProps &_props) : mProps(_props)
{
}
~Detail() {}

void initMatImages(framemetadata_sp &input)
{
mInputImg = Utils::getMatHeader(FrameMetadataFactory::downcast<RawImageMetadata>(input));
mOutputImg = Utils::getMatHeader(FrameMetadataFactory::downcast<RawImageMetadata>(mOutputMetadata));
}

void setProps(BrightnessContrastControlProps &props)
{
mProps = props;
}

public:
framemetadata_sp mOutputMetadata;
std::string mOutputPinId;
cv::Mat mInputImg;
cv::Mat mOutputImg;
BrightnessContrastControlProps mProps;
int mFrameType;
};

BrightnessContrastControl::BrightnessContrastControl(BrightnessContrastControlProps _props) : Module(TRANSFORM, "BrightnessContrastControl", _props)
{
mDetail.reset(new Detail(_props));
}

BrightnessContrastControl::~BrightnessContrastControl() {}

bool BrightnessContrastControl::validateInputPins()
{
if (getNumberOfInputPins() != 1)
{
LOG_ERROR << "<" << getId() << ">::validateInputPins size is expected to be 1. Actual<" << getNumberOfInputPins() << ">";
return false;
}

framemetadata_sp metadata = getFirstInputMetadata();
FrameMetadata::FrameType frameType = metadata->getFrameType();
if (frameType != FrameMetadata::RAW_IMAGE)
{
LOG_ERROR << "<" << getId() << ">::validateInputPins input frameType is expected to be Raw_Image. Actual<" << frameType << ">";
return false;
}

return true;
}

bool BrightnessContrastControl::validateOutputPins()
{
if (getNumberOfOutputPins() != 1)
{
LOG_ERROR << "<" << getId() << ">::validateOutputPins size is expected to be 1. Actual<" << getNumberOfOutputPins() << ">";
return false;
}

framemetadata_sp metadata = getFirstOutputMetadata();
FrameMetadata::FrameType frameType = metadata->getFrameType();
if (frameType != FrameMetadata::RAW_IMAGE)
{
LOG_ERROR << "<" << getId() << ">::validateOutputPins input frameType is expected to be RAW_IMAGE. Actual<" << frameType << ">";
return false;
}

return true;
}

void BrightnessContrastControl::addInputPin(framemetadata_sp &metadata, string &pinId)
{
Module::addInputPin(metadata, pinId);
mDetail->mOutputMetadata = framemetadata_sp(new RawImageMetadata());
mDetail->mOutputMetadata->copyHint(*metadata.get());
mDetail->mOutputPinId = addOutputPin(mDetail->mOutputMetadata);
}

bool BrightnessContrastControl::init()
{
return Module::init();
}

bool BrightnessContrastControl::term()
{
return Module::term();
}

bool BrightnessContrastControl::process(frame_container &frames)
{
auto frame = frames.begin()->second;
auto outFrame = makeFrame();

mDetail->mInputImg.data = static_cast<uint8_t *>(frame->data());
mDetail->mOutputImg.data = static_cast<uint8_t *>(outFrame->data());
mDetail->mInputImg.convertTo(mDetail->mOutputImg, -1, mDetail->mProps.alpha, mDetail->mProps.beta);
frames.insert(make_pair(mDetail->mOutputPinId, outFrame));
send(frames);
return true;
}

void BrightnessContrastControl::setMetadata(framemetadata_sp &metadata)
{
if (!metadata->isSet())
{
return;
}
auto rawMetadata = FrameMetadataFactory::downcast<RawImageMetadata>(metadata);
RawImageMetadata outputMetadata(rawMetadata->getWidth(), rawMetadata->getHeight(), rawMetadata->getImageType(), rawMetadata->getType(), 0, rawMetadata->getDepth(), FrameMetadata::HOST, true);
auto rawOutMetadata = FrameMetadataFactory::downcast<RawImageMetadata>(mDetail->mOutputMetadata);
rawOutMetadata->setData(outputMetadata);
auto imageType = rawMetadata->getImageType();

mDetail->initMatImages(metadata);

switch (imageType)
{
case ImageMetadata::MONO:
case ImageMetadata::BGR:
case ImageMetadata::BGRA:
case ImageMetadata::RGB:
case ImageMetadata::RGBA:
break;
default:
throw AIPException(AIP_NOTIMPLEMENTED, "ImageType not Supported<" + std::to_string(imageType) + ">");
}
}

bool BrightnessContrastControl::processSOS(frame_sp &frame)
{
auto metadata = frame->getMetadata();
setMetadata(metadata);
return true;
}

BrightnessContrastControlProps BrightnessContrastControl::getProps()
{
fillProps(mDetail->mProps);
return mDetail->mProps;
}

bool BrightnessContrastControl::handlePropsChange(frame_sp &frame)
{
BrightnessContrastControlProps props(0, 0);
auto ret = Module::handlePropsChange(frame, props);
mDetail->setProps(props);
return ret;
}

void BrightnessContrastControl::setProps(BrightnessContrastControlProps &props)
{
Module::addPropsToQueue(props);
}
Loading