Example #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);
    }
  }
  /////////////////////////////////////////////////////////////////////////////////////

}
Example #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);
      }
    }

}
Example #3
0
/** calc_sce_transform
 *
 * DESCRIPTION: calculate the new co-efficents and the offset bits
 *              for the new traingle
 *
 **/
static int32_t calc_sce_transform(ISP_Skin_enhan_range *interp_range,
  cr_cb_triangle *pOrigVert, sce_affine_transform_2d *pTransform,double val)
{
  double M1[9], M2[9], InvM2[9], Tx[9];
  double dest_cr, dest_cb, int_step;
  int32_t rc = TRUE, i;

  if (pOrigVert == NULL || pTransform == NULL){
    ISP_DBG(ISP_MOD_SCE, " Null pointer in vfe_util_sce_transform\n");
    return FALSE;
  }

  /* Calculate the new vertex */
  if (val < 0)
    int_step = interp_range->neg_step * (-val);
  else
    int_step = interp_range->pos_step * val;

  dest_cr = interp_range->interpolation_line.point0.cr +
            interp_range->interpolation_line.shift_cr * int_step;
  dest_cb = interp_range->interpolation_line.point0.cb +
            interp_range->interpolation_line.shift_cb * int_step;

  /* fill in M1, the dest triangle */
  M1[0] = dest_cr;
  M1[3] = dest_cb;
  M1[1] = pOrigVert->point2.cr;
  M1[4] = pOrigVert->point2.cb;
  M1[2] = pOrigVert->point3.cr;
  M1[5] = pOrigVert->point3.cb;
  M1[6] = M1[7] = M1[8] = 1.0;

  /* fill in M2 the original three vertex */
  M2[0] = pOrigVert->point1.cr;
  M2[3] = pOrigVert->point1.cb;
  M2[1] = pOrigVert->point2.cr;
  M2[4] = pOrigVert->point2.cb;
  M2[2] = pOrigVert->point3.cr;
  M2[5] = pOrigVert->point3.cb;
  M2[6] = M2[7] = M2[8] = 1.0;

  MATRIX_INVERSE_3x3(M2, InvM2);

  Tx[8] = M1[6]*InvM2[2] + M1[7]*InvM2[5] + M1[8]*InvM2[8];

  if ( Tx [8] != 0 ){
     Tx[0] = (M1[0]*InvM2[0] + M1[1]*InvM2[3] + M1[2]*InvM2[6]) / Tx[8];
     Tx[1] = (M1[0]*InvM2[1] + M1[1]*InvM2[4] + M1[2]*InvM2[7]) / Tx[8];
     Tx[2] = (M1[0]*InvM2[2] + M1[1]*InvM2[5] + M1[2]*InvM2[8]) / Tx[8];
     Tx[3] = (M1[3]*InvM2[0] + M1[4]*InvM2[3] + M1[5]*InvM2[6]) / Tx[8];
     Tx[4] = (M1[3]*InvM2[1] + M1[4]*InvM2[4] + M1[5]*InvM2[7]) / Tx[8];
     Tx[5] = (M1[3]*InvM2[2] + M1[4]*InvM2[5] + M1[5]*InvM2[8]) / Tx[8];
     Tx[6] = (M1[6]*InvM2[0] + M1[7]*InvM2[3] + M1[8]*InvM2[6]) / Tx[8];
     Tx[7] = (M1[6]*InvM2[1] + M1[7]*InvM2[4] + M1[8]*InvM2[7]) / Tx[8];
     Tx[8] = 1;

    for (i = 0; i < 6; i++)
      *((float *)pTransform + i) = (float)(Tx[i]);
  } else
      rc = FALSE;

  return rc;
}