OpenCV 회색 이미지 변환 및 회전 알고리즘 (평면 내)

 무게 중심을 이미지 중심으로 회전합니다.

계산을 단순화하기 위해 회전 각도는 int 값이고 단위는 도입니다.

DIM_SAMPLE_POINTS_X, DIM_SAMPLE_POINTS_Y는 이미지 크기이며 같을 것을 권장합니다.

이미지의 x 축은 실제 좌표와 같고 y 축은 반대 방향이므로 shift_y 앞에 음의 부호가 있습니다.

계산 속도를 높이기 위해 일반적으로 사용되는 각도의 사인 및 코사인 값이 VIEW_COS_LOOKUP 배열에 저장됩니다.

  float pos_x, pos_y;
  int pos_x1, pos_x2, pos_y1, pos_y2;
  float sum = 0.0;
  float center_x=(DIM_SAMPLE_POINTS_X-1)/2.0;
  float center_y=(DIM_SAMPLE_POINTS_Y-1)/2.0;
  float shift_x = shift(0)/SENSOR_RANGE/2.0*DIM_SAMPLE_POINTS_X;
  float shift_y = -shift(1)/SENSOR_RANGE/2.0*DIM_SAMPLE_POINTS_Y;
  std::vector<float> temp_new_data;
  temp_new_data.reserve(SAMPLE_POINTS_SIZE);
  for (int t_i = 0; t_i < SAMPLE_POINTS_SIZE; t_i++)//clear all temp data
    temp_new_data[t_i] = 0;
  for (int x = 0; x < DIM_SAMPLE_POINTS_X; x++)
  {
    for (int y = 0; y < DIM_SAMPLE_POINTS_Y; y++)
    {
      float data_xy = (temp_s_data)[x+y* DIM_SAMPLE_POINTS_X];
      if(data_xy>0.01)
      {
        pos_x = VIEW_COS_LOOKUP[rot]*(x-center_x) - (center_y-y)*VIEW_SIN_LOOKUP[rot] + center_x + shift_x;
        pos_y = center_y - VIEW_SIN_LOOKUP[rot]*(x-center_x) - (center_y-y)*VIEW_COS_LOOKUP[rot] + shift_y;
        if(pos_x<0 || pos_y<0 || pos_x> DIM_SAMPLE_POINTS_X-1 || pos_y>= DIM_SAMPLE_POINTS_Y-1) continue;
        pos_x1 = floor(pos_x);
        pos_x2 = ceil(pos_x);
        pos_y1 = floor(pos_y);
        pos_y2 = ceil(pos_y);
        double w_x, w_y;
        if(pos_x1==pos_x) w_x = 1.0;
        else w_x = pos_x2 - pos_x;
        if(pos_y1==pos_y) w_y = 1.0;
        else w_y = pos_y2 - pos_y;
    
        temp_new_data[pos_x1 + pos_y1 * DIM_SAMPLE_POINTS_X] += w_x * w_y * data_xy;
        temp_new_data[pos_x1 + pos_y2 * DIM_SAMPLE_POINTS_X] += w_x * (1 - w_y) * data_xy;
        temp_new_data[pos_x2 + pos_y1 * DIM_SAMPLE_POINTS_X] += (1 - w_x) * w_y * data_xy;
        temp_new_data[pos_x2 + pos_y2 * DIM_SAMPLE_POINTS_X] += (1 - w_x) * (1 - w_y) * data_xy;    

        sum += data_xy;
      }
    }
  }

다음은 매칭 알고리즘이며, 과거 데이터는 매칭을 위해 배열에 저장됩니다.

  float error = 0.0;
  std::vector<float> show_err_data;
  show_err_data.reserve(SAMPLE_POINTS_SIZE);//to show error data in window
  
  for (int t_i = 0; t_i < SAMPLE_POINTS_SIZE; t_i++)
  {
    error += abs(temp_new_data[t_i] - memory_sdata[t_i]);
    show_err_data[t_i] = abs(temp_new_data[t_i] - memory_sdata[t_i]);
  }
  
  return error/sum/2.0;
}

 

추천

출처blog.csdn.net/li4692625/article/details/109349978