|
|
@ -178,4 +178,74 @@ burst::burst( const std::vector<std::string>& bayer_image_paths, int reference_i
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
burst::burst( const std::vector<std::vector<uint8_t> >& bayer_image_contents, int reference_image_index )
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// Number of images
|
|
|
|
|
|
|
|
num_images = bayer_image_contents.size();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Find reference image path in input directory
|
|
|
|
|
|
|
|
// reference image path need to be absolute path
|
|
|
|
|
|
|
|
reference_image_idx = -1;
|
|
|
|
|
|
|
|
if ( reference_image_index >= 0 && reference_image_index < bayer_image_contents.size() )
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
reference_image_idx = reference_image_index;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ( reference_image_idx == -1 )
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
// throw std::runtime_error("Error reference image index is out of range " );
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef NDEBUG
|
|
|
|
|
|
|
|
printf("%s::%s reference image idx %d\n", \
|
|
|
|
|
|
|
|
__FILE__, __func__, reference_image_idx );
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Get source bayer image
|
|
|
|
|
|
|
|
// Downsample original bayer image by 2x2 box filter
|
|
|
|
|
|
|
|
for ( const auto& bayer_image_content : bayer_image_contents )
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
bayer_images.emplace_back( bayer_image_content );
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Pad information
|
|
|
|
|
|
|
|
int tile_size_bayer = 32;
|
|
|
|
|
|
|
|
int padding_top = tile_size_bayer / 2;
|
|
|
|
|
|
|
|
int padding_bottom = tile_size_bayer / 2 + \
|
|
|
|
|
|
|
|
( (bayer_images[ 0 ].height % tile_size_bayer) == 0 ? \
|
|
|
|
|
|
|
|
0 : tile_size_bayer - bayer_images[ 0 ].height % tile_size_bayer );
|
|
|
|
|
|
|
|
int padding_left = tile_size_bayer / 2;
|
|
|
|
|
|
|
|
int padding_right = tile_size_bayer / 2 + \
|
|
|
|
|
|
|
|
( (bayer_images[ 0 ].width % tile_size_bayer) == 0 ? \
|
|
|
|
|
|
|
|
0 : tile_size_bayer - bayer_images[ 0 ].width % tile_size_bayer );
|
|
|
|
|
|
|
|
padding_info_bayer = std::vector<int>{ padding_top, padding_bottom, padding_left, padding_right };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Pad bayer image
|
|
|
|
|
|
|
|
for ( const auto& bayer_image_i : bayer_images )
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
cv::Mat bayer_image_pad_i;
|
|
|
|
|
|
|
|
cv::copyMakeBorder( bayer_image_i.raw_image, \
|
|
|
|
|
|
|
|
bayer_image_pad_i, \
|
|
|
|
|
|
|
|
padding_top, padding_bottom, padding_left, padding_right, \
|
|
|
|
|
|
|
|
cv::BORDER_REFLECT );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// cv::Mat use internal reference count
|
|
|
|
|
|
|
|
bayer_images_pad.emplace_back( bayer_image_pad_i );
|
|
|
|
|
|
|
|
grayscale_images_pad.emplace_back( box_filter_kxk<uint16_t, 2>( bayer_image_pad_i ) );
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef NDEBUG
|
|
|
|
|
|
|
|
printf("%s::%s Pad bayer image from (%d, %d) -> (%d, %d)\n", \
|
|
|
|
|
|
|
|
__FILE__, __func__, \
|
|
|
|
|
|
|
|
bayer_images[ 0 ].height, \
|
|
|
|
|
|
|
|
bayer_images[ 0 ].width, \
|
|
|
|
|
|
|
|
bayer_images_pad[ 0 ].size().height, \
|
|
|
|
|
|
|
|
bayer_images_pad[ 0 ].size().width );
|
|
|
|
|
|
|
|
printf("%s::%s pad top %d, buttom %d, left %d, right %d\n", \
|
|
|
|
|
|
|
|
__FILE__, __func__, \
|
|
|
|
|
|
|
|
padding_top, padding_bottom, padding_left, padding_right );
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace hdrplus
|
|
|
|
} // namespace hdrplus
|
|
|
|