diff --git a/src/align.cpp b/src/align.cpp index 5a22c16..c9798cb 100644 --- a/src/align.cpp +++ b/src/align.cpp @@ -198,12 +198,12 @@ static unsigned long long l1_distance( const cv::Mat& img1, const cv::Mat& img2, return_type sum(0); // TODO: add pragma unroll here - for ( int row_i = img1_tile_row_start_idx; row_i < (img1_tile_row_start_idx + tile_size); ++row_i ) + for ( int row_i = 0; row_i < tile_size; ++row_i ) { - const data_type* img1_ptr_row_i = img1_ptr + row_i * img1_step; - const data_type* img2_ptr_row_i = img2_ptr + row_i * img2_step; + const data_type* img1_ptr_row_i = img1_ptr + (img1_tile_row_start_idx + row_i) * img1_step + img1_tile_col_start_idx; + const data_type* img2_ptr_row_i = img2_ptr + (img2_tile_row_start_idx + row_i) * img2_step + img2_tile_col_start_idx; - for ( int col_i = img1_tile_col_start_idx; col_i < (img1_tile_col_start_idx + tile_size); ++col_i ) + for ( int col_i = 0; col_i < tile_size; ++col_i ) { data_type l1 = CUSTOME_ABS( img1_ptr_row_i[ col_i ] - img2_ptr_row_i[ col_i ] ); sum += l1; @@ -263,12 +263,12 @@ static return_type l2_distance( const cv::Mat& img1, const cv::Mat& img2, \ return_type sum(0); // TODO: add pragma unroll here - for ( int row_i = img1_tile_row_start_idx; row_i < (img1_tile_row_start_idx + tile_size); ++row_i ) + for ( int row_i = 0; row_i < tile_size; ++row_i ) { - const data_type* img1_ptr_row_i = img1_ptr + row_i * img1_step; - const data_type* img2_ptr_row_i = img2_ptr + row_i * img2_step; + const data_type* img1_ptr_row_i = img1_ptr + (img1_tile_row_start_idx + row_i) * img1_step + img1_tile_col_start_idx; + const data_type* img2_ptr_row_i = img2_ptr + (img2_tile_row_start_idx + row_i) * img2_step + img2_tile_col_start_idx; - for ( int col_i = img1_tile_col_start_idx; col_i < (img1_tile_col_start_idx + tile_size); ++col_i ) + for ( int col_i = 0; col_i < tile_size; ++col_i ) { data_type l1 = CUSTOME_ABS( img1_ptr_row_i[ col_i ] - img2_ptr_row_i[ col_i ] ); sum += ( l1 * l1 ); @@ -456,6 +456,27 @@ void align_image_level( \ min_distance_col_i = search_col_j; min_distance_row_i = search_row_j; } + + // If same value, choose the one closer to the original tile location + if ( distance_j == min_distance_i && min_distance_row_i != -1 && min_distance_col_i != -1 ) + { + int prev_distance_row_2_ref = min_distance_row_i - search_radiou; + int prev_distance_col_2_ref = min_distance_col_i - search_radiou; + int curr_distance_row_2_ref = search_row_j - search_radiou; + int curr_distance_col_2_ref = search_col_j - search_radiou; + + int prev_distance_2_ref_sqr = prev_distance_row_2_ref * prev_distance_row_2_ref + prev_distance_col_2_ref * prev_distance_col_2_ref; + int curr_distance_2_ref_sqr = curr_distance_row_2_ref * curr_distance_row_2_ref + curr_distance_col_2_ref * curr_distance_col_2_ref; + + // previous min distance idx is farther away from ref tile start location + if ( prev_distance_2_ref_sqr > curr_distance_2_ref_sqr ) + { + printf("@@@ Same distance, choose closer one (%d, %d) instead of (%d, %d)\n", \ + search_row_j, search_col_j, min_distance_row_i, min_distance_col_i); + min_distance_col_i = search_col_j; + min_distance_row_i = search_row_j; + } + } } }