|
|
@ -232,114 +232,4 @@ void print_img( const cv::Mat& img, int img_height = -1, int img_width = -1 )
|
|
|
|
printf("\n");
|
|
|
|
printf("\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @brief Extract RGB channel seprately from bayer image
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @tparam T data tyoe of bayer image.
|
|
|
|
|
|
|
|
* @return vector of RGB image. OpenCV internally maintain reference count.
|
|
|
|
|
|
|
|
* Thus this step won't create deep copy overhead.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @example extract_rgb_fmom_bayer<uint16_t>( bayer_img, rgb_vector_container );
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
|
|
|
|
void extract_rgb_fmom_bayer( const cv::Mat& bayer_img, \
|
|
|
|
|
|
|
|
cv::Mat& red_img, cv::Mat& green_img1, cv::Mat& green_img2, cv::Mat& blue_img )
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
const T* bayer_img_ptr = (const T*)bayer_img.data;
|
|
|
|
|
|
|
|
int bayer_width = bayer_img.size().width;
|
|
|
|
|
|
|
|
int bayer_height = bayer_img.size().height;
|
|
|
|
|
|
|
|
int bayer_step = bayer_img.step1();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ( bayer_width % 2 != 0 || bayer_height % 2 != 0 )
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw std::runtime_error("Bayer image data size incorrect, must be multiplier of 2\n");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// RGB image is half the size of bayer image
|
|
|
|
|
|
|
|
int rgb_width = bayer_width / 2;
|
|
|
|
|
|
|
|
int rgb_height = bayer_height / 2;
|
|
|
|
|
|
|
|
red_img.create( rgb_height, rgb_width, bayer_img.type() );
|
|
|
|
|
|
|
|
green_img1.create( rgb_height, rgb_width, bayer_img.type() );
|
|
|
|
|
|
|
|
green_img2.create( rgb_height, rgb_width, bayer_img.type() );
|
|
|
|
|
|
|
|
blue_img.create( rgb_height, rgb_width, bayer_img.type() );
|
|
|
|
|
|
|
|
int rgb_step = red_img.step1();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
T* r_img_ptr = (T*)red_img.data;
|
|
|
|
|
|
|
|
T* g1_img_ptr = (T*)green_img1.data;
|
|
|
|
|
|
|
|
T* g2_img_ptr = (T*)green_img2.data;
|
|
|
|
|
|
|
|
T* b_img_ptr = (T*)blue_img.data;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for ( int rgb_row_i = 0; rgb_row_i < rgb_height; rgb_row_i++ )
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
int rgb_row_i_offset = rgb_row_i * rgb_step;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Every RGB row corresbonding to two Bayer image row
|
|
|
|
|
|
|
|
int bayer_row_i_offset1 = ( rgb_row_i * 2 + 0 ) * bayer_step; // For RG
|
|
|
|
|
|
|
|
int bayer_row_i_offset2 = ( rgb_row_i * 2 + 1 ) * bayer_step; // For GB
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for ( int rgb_col_j = 0; rgb_col_j < rgb_width; rgb_col_j++ )
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
r_img_ptr[ rgb_row_i_offset + rgb_col_j ] = bayer_img_ptr[ bayer_row_i_offset1 + ( rgb_col_j * 2 + 0 ) ];
|
|
|
|
|
|
|
|
g1_img_ptr[ rgb_row_i_offset + rgb_col_j ] = bayer_img_ptr[ bayer_row_i_offset1 + ( rgb_col_j * 2 + 1 ) ];
|
|
|
|
|
|
|
|
g2_img_ptr[ rgb_row_i_offset + rgb_col_j ] = bayer_img_ptr[ bayer_row_i_offset2 + ( rgb_col_j * 2 + 0 ) ];
|
|
|
|
|
|
|
|
b_img_ptr[ rgb_row_i_offset + rgb_col_j ] = bayer_img_ptr[ bayer_row_i_offset2 + ( rgb_col_j * 2 + 1 ) ];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @brief Extract RGB channel seprately from bayer image
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @tparam T data tyoe of bayer image.
|
|
|
|
|
|
|
|
* @return vector of RGB image. OpenCV internally maintain reference count.
|
|
|
|
|
|
|
|
* Thus this step won't create deep copy overhead.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @example extract_rgb_fmom_bayer<uint16_t>( bayer_img, rgb_vector_container );
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
|
|
|
|
void extract_rgb_fmom_bayer( const cv::Mat& bayer_img, \
|
|
|
|
|
|
|
|
cv::Mat& red_img, cv::Mat& green_img1, cv::Mat& green_img2, cv::Mat& blue_img )
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
const T* bayer_img_ptr = (const T*)bayer_img.data;
|
|
|
|
|
|
|
|
int bayer_width = bayer_img.size().width;
|
|
|
|
|
|
|
|
int bayer_height = bayer_img.size().height;
|
|
|
|
|
|
|
|
int bayer_step = bayer_img.step1();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ( bayer_width % 2 != 0 || bayer_height % 2 != 0 )
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw std::runtime_error("Bayer image data size incorrect, must be multiplier of 2\n");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// RGB image is half the size of bayer image
|
|
|
|
|
|
|
|
int rgb_width = bayer_width / 2;
|
|
|
|
|
|
|
|
int rgb_height = bayer_height / 2;
|
|
|
|
|
|
|
|
red_img.create( rgb_height, rgb_width, bayer_img.type() );
|
|
|
|
|
|
|
|
green_img1.create( rgb_height, rgb_width, bayer_img.type() );
|
|
|
|
|
|
|
|
green_img2.create( rgb_height, rgb_width, bayer_img.type() );
|
|
|
|
|
|
|
|
blue_img.create( rgb_height, rgb_width, bayer_img.type() );
|
|
|
|
|
|
|
|
int rgb_step = red_img.step1();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
T* r_img_ptr = (T*)red_img.data;
|
|
|
|
|
|
|
|
T* g1_img_ptr = (T*)green_img1.data;
|
|
|
|
|
|
|
|
T* g2_img_ptr = (T*)green_img2.data;
|
|
|
|
|
|
|
|
T* b_img_ptr = (T*)blue_img.data;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for ( int rgb_row_i = 0; rgb_row_i < rgb_height; rgb_row_i++ )
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
int rgb_row_i_offset = rgb_row_i * rgb_step;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Every RGB row corresbonding to two Bayer image row
|
|
|
|
|
|
|
|
int bayer_row_i_offset1 = ( rgb_row_i * 2 + 0 ) * bayer_step; // For RG
|
|
|
|
|
|
|
|
int bayer_row_i_offset2 = ( rgb_row_i * 2 + 1 ) * bayer_step; // For GB
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for ( int rgb_col_j = 0; rgb_col_j < rgb_width; rgb_col_j++ )
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
r_img_ptr[ rgb_row_i_offset + rgb_col_j ] = bayer_img_ptr[ bayer_row_i_offset1 + ( rgb_col_j * 2 + 0 ) ];
|
|
|
|
|
|
|
|
g1_img_ptr[ rgb_row_i_offset + rgb_col_j ] = bayer_img_ptr[ bayer_row_i_offset1 + ( rgb_col_j * 2 + 1 ) ];
|
|
|
|
|
|
|
|
g2_img_ptr[ rgb_row_i_offset + rgb_col_j ] = bayer_img_ptr[ bayer_row_i_offset2 + ( rgb_col_j * 2 + 0 ) ];
|
|
|
|
|
|
|
|
b_img_ptr[ rgb_row_i_offset + rgb_col_j ] = bayer_img_ptr[ bayer_row_i_offset2 + ( rgb_col_j * 2 + 1 ) ];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace hdrplus
|
|
|
|
} // namespace hdrplus
|
|
|
|