2016-02-27 1075 views
0

我有一个问题,我正确地使用我的矩阵类型从rgb到lms颜色空间与opencv的颜色转换。我发现的论文是here。我想要做的只是计算lms颜色三元组如下:RGB到LMS颜色空间转换与OpenCV

Mat actRGBVec = new Mat(1,3,Imgproc.COLOR_RGB2BGR); 
Mat lmsResVec = new Mat(1,3,CvType.CV_64FC3); 

lmsMat = new Mat(inputImg.rows(),inputImg.cols(),CvType.CV_64FC3); 

// iterate through all pixels and multiply rgb values with the lms transformation matrix 
try { 
    for (int x = 0; x < inputImg.rows(); x++) { 
    for (int y = 0; y < inputImg.cols(); y++) { 
     actRGBVal = inputImg.get(x, y); 

     // vector holding rgb info 
     actRGBVec.put(0, 0, actRGBVal); 
     Core.gemm(lmsTransformMat, actRGBVec, 1, null, 0, lmsResVec, 0); 

     lmsMat.put(x, y, lmsResVec.get(0, 0)); 
    } 
    } 
} 
catch (Exception e) { 
    Log.d("ImageHandler","Error rgb to lms conversion! " + e.getMessage()); 
} 

lmsMat是CV_64FC3类型。 inputImg的类型为Imgproc.COLOR_RGB2BGR。 lmsTransformMat的类型是CV_64FC1(因为它只包含标量值,这应该是正确的类型?)。

异常说:错误rgb到lms的转换! null 我在这里做错了什么?

回答

0

确保所有的矩阵具有正确的尺寸和类型:

  • inputImage不能Imgproc.COLOR_RGB2BGR类型。这是一个常数,用于cvtColor函数,而不是OpenCV矩阵类型。由于您的输入图像可能是彩色图像,因此会生成正确的类型CV_8UC3
  • lmsTransformMat应该是CV_64FC1类型的3x3矩阵。
  • actRGBVec需要是与lmsTransformMat相同类型的3x1矩阵。 (再次:Imgproc.COLOR_RGB2BGR不是矩阵类型)。
  • lmsResVec需要是与lmsTransformMat相同类型的3x1矩阵。 (但是,您可以使用new Mat(),OpenCV将在Core.gemm中处理它)。
  • lmsMat看起来不错。

除了传递nullsrc3参数Core.gemm。这是你的NullPointerException的原因。由于您的beta参数为0,因此您可以只提供new Mat()而不是null