Skip to content

Commit

Permalink
Рефакторинг функции коррекции экспозиции
Browse files Browse the repository at this point in the history
  • Loading branch information
dvorotnev committed Apr 18, 2021
1 parent 8a0b23f commit 9adc8bc
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,8 @@
Функция подстраивает яркость текущего кадра под яркость фонового изображения.
Входные параметры:
SegmentationMask - бинарное изображение с отмеченными движущимися объектами
с предыдущего кадра.
SegmentationMask - бинарное изображение с отмеченными движущимися объектами с предыдущего кадра.
BackgroundImage - цветное изображение текущего фона.
CurrentImage - текущий кадр в формате Y, яркость которого будет
изменена в соответствии с фоновым изображением.
CurrentImage - текущий кадр, яркость которого будет изменена в соответствии с фоновым изображением.
*/
void correctionOfExposition(const cv::Mat& segmentationMask,
const cv::Mat& backgroundImage,
cv::Mat& currentImage);
void correctionOfExposition(const cv::Mat& segmentationMask, const cv::Mat& backgroundImage, cv::Mat& currentImage);
73 changes: 35 additions & 38 deletions src/CorrectionOfExposition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,72 +2,69 @@
Реализация функции коррекции яркости.
*/

#include <opencv2/imgproc.hpp>
#include <math.h>
#include <algorithm>

#include <CorrectionOfExposition.h>
#include <opencv2/imgproc.hpp>

using namespace cv;
#include <CorrectionOfExposition.hpp>

namespace
{
const uchar Background = 0;
}

void correctionOfExposition(const Mat& segmentationMask,
const Mat& backgroundImage,
Mat& currentImage)
void correctionOfExposition(const cv::Mat& segmentation_mask, const cv::Mat& background_img, cv::Mat& current_image)
{
Mat background_image = backgroundImage.clone();
cvtColor(background_image, background_image, COLOR_BGR2YCrCb);
cvtColor(currentImage, currentImage, COLOR_BGR2YCrCb);
cv::Mat background_image = background_img.clone();
cv::cvtColor(background_image, background_image, cv::COLOR_BGR2YCrCb);
cv::cvtColor(current_image, current_image, cv::COLOR_BGR2YCrCb);

// Размер зоны вокруг объектов, зарезервированной под движение.
// (Ориентировочное расстояние, на которое могли переместиться
// объекты между двумя кадрами).
const int reserved_area = 5;
// (Ориентировочное максимальное расстояние, на которое могли
// переместиться объекты между двумя кадрами).
constexpr int reserved_area = 5;

// Изображение с отмечеными фоновыми пикселями.
Mat markedImage;
cv::Mat marked_image;

// Создраём вокруг объектов область из reserved_area точек,
// в которой может появиться движение.
Matx<uchar, 3, 3> kernel = {
cv::Matx<uchar, 3, 3> kernel = {
0, 1, 0,
1, 1, 1,
0, 1, 0};
dilate(segmentationMask, markedImage, kernel, Point(1, 1), reserved_area);
cv::dilate(segmentation_mask, marked_image, kernel, cv::Point(1, 1), reserved_area);

// Высчитываем суммарную яркость точек фона.
double background_light = 0; // Переменная для хранения суммарной яркости фона.
double current_light = 0; // Переменная для хранения суммарной яркости текущего кадра.
int counter = 0; // Переменная для хранения количества точек по которым посчитана сумма.
for (int y = reserved_area; y < markedImage.rows - reserved_area; ++y)
int counter = 0;
double current_brightness = 0;
double background_brightness = 0;

using Pixel = cv::Point3_<uchar>;
for (int y = reserved_area; y < marked_image.rows - reserved_area; ++y)
{
const uchar* markedImage_ptr = markedImage.ptr(y);
const uchar* background_image_ptr = background_image.ptr(y);
const uchar* currentImage_ptr = currentImage.ptr(y);
for (int x = reserved_area; x < markedImage.cols - reserved_area; ++x)
for (int x = reserved_area; x < marked_image.cols - reserved_area; ++x)
{
if (markedImage_ptr[x] != Background)
if (marked_image.at<uchar>(y, x) != Background)
continue;
background_light += background_image_ptr[3 * x];
current_light += currentImage_ptr[3 * x];

background_brightness += background_image.at<Pixel>(y, x).x;
current_brightness += current_image.at<Pixel>(y, x).x;
counter++;
}
}

// Вычисляем среднее значение изменения яркости.
// Корректируем яркость на изображении.
if (counter != 0)
{
const double diff = (double)(background_light - current_light) / counter;
const int diff = (background_brightness - current_brightness) / counter;

//Корректируем яркость на изображении.
for (int y = 0; y < currentImage.rows; ++y)
auto correction_lambda = [diff](Pixel& value, const int[])
{
uchar* currentImage_ptr = currentImage.ptr(y);
for (int x = 0; x < currentImage.cols; ++x)
{
currentImage_ptr[3 * x] = (uchar)min(max((currentImage_ptr[3 * x] + diff), 0.0), 255.0);
}
}
value.x = std::clamp(value.x + diff, 0, 255);
};
current_image.forEach<Pixel>(correction_lambda);
}

cvtColor(currentImage, currentImage, COLOR_YCrCb2BGR);
cv::cvtColor(current_image, current_image, cv::COLOR_YCrCb2BGR);
}
2 changes: 1 addition & 1 deletion src/HandDetector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include <opencv2/highgui.hpp>

#include <HandDetector.hpp>
#include <CorrectionOfExposition.h>
#include <CorrectionOfExposition.hpp>

using namespace cv;

Expand Down

0 comments on commit 9adc8bc

Please sign in to comment.