使用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 楼答案
确保所有矩阵的尺寸和类型正确:
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