Esempio n. 1
0
void sensor_generate_D65_matrix()
{
      float cc_mat[3][3], wb_mat[3][3], out_mat[3][3], FOWARD_MATRIX[3][3],COLOR_CORRECTION_MATRIX[3][3];
      cam_rational_type_t forward_mat[3][3],color_mat[3][3];

  float *ptr1, *ptr2;
  float tmp[3][3], tmp1[3][3], tmp2[3][3];

  cc_mat[0][0] = 1.5397; cc_mat[0][1] = -0.61080003; cc_mat[0][2] = 7.1000002e-002;
  cc_mat[1][0] = -0.1507; cc_mat[1][1] = 1.2663; cc_mat[1][2] = -0.1156;
  cc_mat[2][0] = 1.39e-002; cc_mat[2][1] = -0.4084; cc_mat[2][2] = 1.3945;

  wb_mat[0][0] = 3.3789999;
  wb_mat[0][1] = 0;
  wb_mat[0][2] = 0;
  wb_mat[1][0] = 0;
  wb_mat[1][1] = 1.000000;
  wb_mat[1][2] = 0;
  wb_mat[2][0] = 0;
  wb_mat[2][1] = 0;
  wb_mat[2][2] = 3.3889999;

  /* Forward Transform: sRGB2XYZ * CC */
  MATRIX_MULT(sRGB2XYZ, cc_mat, out_mat, 3, 3, 3);
  FLOAT_TO_RATIONAL(out_mat, forward_mat, 3, 3);
  ////////////////////////////////////////////////////////////////////////////////////
  for (int i = 0; i<3; i++)
  {
    for(int j=0; j<3; j++)
    {
        LOGD("D65 FM = [%i][%i]: %i/%i\n",i,j,forward_mat[i][j].numerator,forward_mat[i][j].denominator);
    }
  }
  /////////////////////////////////////////////////////////////////////////////////////



  //CM = Invert (H * W * CC' * G) 1510

    MATRIX_MULT(XYZ2RGB, cc_mat, tmp1, 3, 3, 3);

  MATRIX_MULT(tmp1, wb_mat, tmp2, 3, 3, 3);

  ptr1 = (float*) tmp2;
  ptr2 = (float*) out_mat;
  MATRIX_INVERSE_3x3(ptr1, ptr2);

  FLOAT_TO_RATIONAL(out_mat, color_mat, 3, 3);

 ////////////////////////////////////////////////////////////////////////////////////
  for (int i = 0; i<3; i++)
  {
    for(int j=0; j<3; j++)
    {
        LOGD("D65 CCM = [%i][%i]: %i/%i\n",i,j,color_mat[i][j].numerator,color_mat[i][j].denominator);
    }
  }
  /////////////////////////////////////////////////////////////////////////////////////

}
Esempio n. 2
0
void sensor_generate_A_matrix()
{
    float cc_mat[3][3], wb_mat[3][3], out_mat[3][3], FOWARD_MATRIX[3][3],COLOR_CORRECTION_MATRIX[3][3];
    cam_rational_type_t forward_mat[3][3],color_mat[3][3];

  float *ptr1, *ptr2;
  float tmp[3][3], tmp1[3][3], tmp2[3][3];

  cc_mat[0][0] = 1.4913; cc_mat[0][1] = 0.271; cc_mat[0][2] = -0.76230001;
  cc_mat[1][0] = -0.2061; cc_mat[1][1] = 1.1982; cc_mat[1][2] = 7.8999996e-003;
  cc_mat[2][0] = -0.15449999; cc_mat[2][1] = -0.1803; cc_mat[2][2] = 1.3348;

  wb_mat[0][0] = 1.284;
  wb_mat[0][1] = 0;
  wb_mat[0][2] = 0;
  wb_mat[1][0] = 0;
  wb_mat[1][1] = 1.000000;
  wb_mat[1][2] = 0;
  wb_mat[2][0] = 0;
  wb_mat[2][1] = 0;
  wb_mat[2][2] = 2.947;

  /* Forward Transform: sRGB2XYZ * CC */
  MATRIX_MULT(sRGB2XYZ, cc_mat, out_mat, 3, 3, 3);
  FLOAT_TO_RATIONAL(out_mat, forward_mat, 3, 3);

   ////////////////////////////////////////////////////////////////////////////////////
    for (int i = 0; i<3; i++)
    {
      for(int j=0; j<3; j++)
      {
          LOGD("A FM = [%i][%i]: %i/%i\n",i,j,forward_mat[i][j].numerator,forward_mat[i][j].denominator);
      }
    }
    /////////////////////////////////////////////////////////////////////////////////////

   MATRIX_MULT(D65_to_ref_A, XYZ2RGB, tmp, 3, 3, 3);
   MATRIX_MULT(tmp, cc_mat, tmp1, 3, 3, 3);

  MATRIX_MULT(tmp1, wb_mat, tmp2, 3, 3, 3);

  ptr1 = (float*) tmp2;
  ptr2 = (float*) out_mat;
  MATRIX_INVERSE_3x3(ptr1, ptr2);

  FLOAT_TO_RATIONAL(out_mat, color_mat, 3, 3);

    for (int i = 0; i<3; i++)
    {
      for(int j=0; j<3; j++)
      {
          LOGD("A CCM = [%i][%i]: %i/%i\n",i,j,color_mat[i][j].numerator,color_mat[i][j].denominator);
      }
    }

}
Esempio n. 3
0
/** util_color_correct_interpolate:
 *    @p_cmd: It will be apply in registers
 *    @effects_matrix: effects matrix
 *    @p_cc: color correct
 *    @dig_gain: digital gain
 *
 * Set color correction params.
 *
 * This function executes in ISP thread context
 *
 * Return none.
 **/
static void util_set_color_correction_params(
  ISP_ColorCorrectionCfgCmdType* p_cmd, float effects_matrix[3][3],
  color_correct_type* p_cc, float dig_gain)
{
  int i, j;
  float coeff[3][3], out_coeff[3][3];

#ifdef ENABLE_CC_LOGGING
  PRINT_2D_MATRIX(3, 3, effects_matrix);
#endif
  if (IS_UNITY_MATRIX(effects_matrix, 3)) {
    ISP_DBG(ISP_MOD_COLOR_CORRECT, "%s: No effects enabled", __func__);
    GET_CC_MATRIX(p_cc, out_coeff);
  } else {
    ISP_DBG(ISP_MOD_COLOR_CORRECT, "%s: Effects enabled", __func__);
    GET_CC_MATRIX(p_cc, coeff);
    MATRIX_MULT(effects_matrix, coeff, out_coeff, 3, 3, 3);
  }
#ifdef ENABLE_CC_LOGGING
  PRINT_2D_MATRIX(3, 3, out_coeff);
#endif
  SET_ISP_CC_MATRIX(p_cmd, out_coeff, (p_cc->q_factor));
  ISP_DBG(ISP_MOD_COLOR_CORRECT, "%s: dig_gain %5.3f", __func__, dig_gain);

  p_cmd->C2 = (int32_t)(128 * dig_gain) - (p_cmd->C0 + p_cmd->C1);
  p_cmd->C5 = (int32_t)(128 * dig_gain) - (p_cmd->C3 + p_cmd->C4);
  p_cmd->C6 = (int32_t)(128 * dig_gain) - (p_cmd->C7 + p_cmd->C8);

  p_cmd->K0 = p_cc->k1;
  p_cmd->K1 = p_cc->k2;
  p_cmd->K2 = p_cc->k0;

  p_cmd->coefQFactor = p_cc->q_factor - 7;
  return;
} /*util_set_color_correction_params*/
Esempio n. 4
0
/** color_conversion_set_effect:
 *
 *    @mod:
 *    @in_params:
 *    @in_param_size:
 *
 * Set special effect
 *
 **/
static int color_conversion_set_effect(isp_color_conversion_mod_t *mod,
  isp_hw_pix_setting_params_t *in_params, uint32_t in_param_size)
{
  if (in_param_size != sizeof(isp_hw_pix_setting_params_t)) {
    CDBG_ERROR("%s: size mismatch, expecting = %d, received = %d",
      __func__, sizeof(isp_hw_pix_setting_params_t), in_param_size);
    return -1;
  }

  int i = 0, j = 0;
  ISP_DBG(ISP_MOD_COLOR_CONV, "%s",__func__);
  float hue_matrix[2][2];
  float sat_matrix[2][2];
  float s, hue_in_radian;
  int type;
  int status= 0;

  if (in_params->bestshot_mode != CAM_SCENE_MODE_OFF) {
    ISP_DBG(ISP_MOD_COLOR_CONV, "%s: Best shot enabled, skip set effect", __func__);
    return 0;
  }

  s = 2.0 * in_params->effects.saturation;
  hue_in_radian = DEGREE_TO_RADIAN(in_params->effects.hue * 10); //ryan need to define in pix_common.h

  type = in_params->effects.effect_type_mask;

  if(type & (1 << ISP_EFFECT_SPECIAL)) {
    status = color_conversion_set_spl_effect(mod, in_params, in_param_size);
    if (status)
      goto END;
  }

  if(type & (1 << ISP_EFFECT_SATURATION)) {
    SET_UNITY_MATRIX(mod->effects_matrix, 2);
    SET_SAT_MATRIX(sat_matrix, s);
  }

  if(type & (1 << ISP_EFFECT_HUE)) {
    if (F_EQUAL(in_params->effects.hue, 0)) {
      SET_UNITY_MATRIX(hue_matrix, 2);
    } else {
      SET_HUE_MATRIX(hue_matrix, hue_in_radian);
    }

    MATRIX_MULT(sat_matrix, hue_matrix, mod->effects_matrix, 2, 2, 2);
  }

#ifdef ENABLE_CV_LOGGING
  PRINT_2D_MATRIX(2, 2, mod->effects_matrix);
#endif

  mod->hw_update_pending = TRUE;

END:
  return status;
}/*color_conversion_set_effect*/