2016-02-27 85 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