有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用OpenCV实现java RGB到LMS颜色空间的转换

我在理解如何使用opencv正确地将矩阵类型用于从rgb颜色空间到lms颜色空间的颜色转换时遇到问题。我找到的论文是here。我想做的是简单地计算lms颜色三元组,如下所示:

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型。颜色_RGB2BGR。lmsTransformMat的类型为CV_64FC1(因为它只包含标量值,所以应该是正确的类型?)

异常显示:rgb到lms转换错误!无效的 我做错了什么


共 (1) 个答案

  1. # 1 楼答案

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

    • 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看起来不错

    此外,将null作为src3参数传递给Core.gemm。这就是你的NullPointerException的原因。因为beta参数是0,所以只需提供new Mat()而不是null