API for merge & align

main
Xiao Song 3 years ago
parent 193621ed1f
commit e1112eac5f

@ -2,6 +2,12 @@
int main( int argc, char** argv )
{
if ( argc != 3 )
{
printf("Usage: ./demo BURST_FOLDER_PATH(no / at end) REFERENCE_IMAGE_PATH\n");
exit(1);
}
hdrplus::hdrplus_pipeline pipeline;
pipeline.run_pipeline();
pipeline.run_pipeline( argv[1], argv[ 2 ]);
}

@ -12,7 +12,17 @@ class align
{
public:
align() = default;
void process( hdrplus::burst& burst_images, \
~align() = default;
/**
* @brief Run alignment on burst of images
*
* @param burst_images collection of burst images
* @param aligements alignment in pixel value pair.
* Outer most vector is per alternative image.
* Inner most two vector is for horizontle & verticle tiles
*/
void process( const hdrplus::burst& burst_images, \
std::vector<std::vector<std::vector<std::pair<int, int>>>>& aligements );
const std::vector<int> inv_scale_factors = { 1, 2, 2, 4 };

@ -19,7 +19,11 @@ class burst
int reference_image_idx;
std::vector<std::string> bayer_image_paths;
// Source bayer images & grayscale unpadded image
std::vector<hdrplus::bayer_image> bayer_images;
// Image padded to tile size
// Use for alignment, merging, and finishing
std::vector<cv::Mat> grayscale_images_pad;
};

@ -1,5 +1,6 @@
#pragma once
#include <string>
#include <opencv2/opencv.hpp> // all opencv header
#include "hdrplus/burst.h"
#include "hdrplus/align.h"
@ -17,8 +18,9 @@ class hdrplus_pipeline
hdrplus::finish finish_module;
public:
void run_pipeline();
void run_pipeline( const std::string& burst_path, const std::string& reference_image_path );
hdrplus_pipeline() = default;
~hdrplus_pipeline() = default;
};
} // namespace hdrplus

@ -1,6 +1,8 @@
#pragma once
#include <vector>
#include <opencv2/opencv.hpp> // all opencv header
#include "hdrplus/burst.h"
namespace hdrplus
{
@ -9,6 +11,18 @@ class merge
{
public:
merge() = default;
~merge() = default;
/**
* @brief Run alignment on burst of images
*
* @param burst_images collection of burst images
* @param aligements alignment in pixel value pair.
* Outer most vector is per alternative image.
* Inner most two vector is for horizontle & verticle tiles
*/
void process( const hdrplus::burst& burst_images, \
std::vector<std::vector<std::vector<std::pair<int, int>>>>& aligements );
};
} // namespace hdrplus

@ -1,7 +1,52 @@
#include <vector>
#include <opencv2/opencv.hpp> // all opencv header
#include "hdrplus/align.h"
#include "hdrplus/burst.h"
#include "hdrplus/utility.h"
namespace hdrplus
{
void align::process( const hdrplus::burst& burst_images, \
std::vector<std::vector<std::vector<std::pair<int, int>>>>& aligements )
{
/*
// Build image pyramid
std::vector<std::vector<cv::Mat>> grayscale_images_pyramid;
grayscale_images_pyramid.resize( burst_images.grayscale_images_pad.size() );
for ( int img_idx = 0; img_idx < burst_images.grayscale_images_pad.size(); ++img_idx )
{
grayscale_images_pyramid[ img_idx ].resize( inv_scale_factors.size() );
// pyramid image are laied out from coarse to fine
// level 0 is the original grayscale image
grayscale_images_pyramid[ img_idx ][ inv_scale_factors.size() - 1 ] = burst_images.grayscale_images_pad[ img_idx];
// downsample and gaussian blur
for ( int i = 1; i < inv_scale_factors.size(); ++i )
{
int inv_scale_factor_i = inv_scale_factors[ i ];
cv::Mat blurred_image = \
hdrplus::gaussian_blur( grayscale_images_pyramid[ img_idx ][ i - 1 ], inv_scale_factor_i * 0.5 );
// Get around with template
cv::Mat downsampled_blurred_image;
if ( inv_scale_factor_i == 2 )
{
hdrplus::downsample_nearest_neighbour<uint16_t, 2>( blurred_image );
}
else if ( inv_scale_factor_i == 4 )
{
hdrplus::downsample_nearest_neighbour<uint16_t, 4>( blurred_image );
}
grayscale_images_pyramid[ img_idx ][ inv_scale_factors.size() - i - 1 ] = downsampled_blurred_image;
}
}
cv::GaussianBlur( src_image, dst_image, cv::Size(0, 0), sigma );
*/
}
} // namespace hdrplus

@ -1,13 +1,32 @@
#include <cstdio>
#include <string>
#include <vector>
#include <utility> // std::pair
#include <opencv2/opencv.hpp> // all opencv header
#include "hdrplus/hdrplus_pipeline.h"
#include "hdrplus/burst.h"
#include "hdrplus/align.h"
#include "hdrplus/merge.h"
#include "hdrplus/finish.h"
namespace hdrplus
{
void hdrplus_pipeline::run_pipeline()
void hdrplus_pipeline::run_pipeline( \
const std::string& burst_path, \
const std::string& reference_image_path )
{
printf("Run pipeline\n");
// Create burst of images
burst burst_images( burst_path, reference_image_path );
std::vector<std::vector<std::vector<std::pair<int, int>>>> alignments;
// Run align
align_module.process( burst_images, alignments );
// Run merging
merge_module.process( burst_images, alignments );
// Run finishing
}
} // namespace hdrplus

@ -1,7 +1,15 @@
#include <opencv2/opencv.hpp> // all opencv header
#include <vector>
#include "hdrplus/merge.h"
#include "hdrplus/burst.h"
namespace hdrplus
{
void merge::process( const hdrplus::burst& burst_images, \
std::vector<std::vector<std::vector<std::pair<int, int>>>>& aligements )
{
}
} // namespace hdrplus

Loading…
Cancel
Save