昨天重新写了一遍DCSift的提取过程,自认为写得没问题,结果跑实验发现结果不正确,于是开始Debug……
从结尾开始一步步调,一直都没问题。然后,到了开头的地方,cvLoadImage是对的,cvResize是对的,cvCvtColor就不对了。。把OpenCV换回原来的2。0版本,结果又一样了,莫非,OpenCV2.0和2.4.1里面cvCvtColor实现不一样?
于是一路找源代码,终于发现了问题的根源:参数不一样。
代码里面用到的cvCvtColor是:CV_BGR2Lab,测了一下,发现BGR2HSV之类的问题都不大。。为什么受伤的总是我呢。。
下面贴一下OpenCV2.0里面BGR2Lab过程中转成XYZ时候的参数(cvcolor.cpp):
#define labXr_32f 0.433953f /* = xyzXr_32f / 0.950456 */
#define labXg_32f 0.376219f /* = xyzXg_32f / 0.950456 */
#define labXb_32f 0.189828f /* = xyzXb_32f / 0.950456 */
#define labYr_32f 0.212671f /* = xyzYr_32f */
#define labYg_32f 0.715160f /* = xyzYg_32f */
#define labYb_32f 0.072169f /* = xyzYb_32f */
#define labZr_32f 0.017758f /* = xyzZr_32f / 1.088754 */
#define labZg_32f 0.109477f /* = xyzZg_32f / 1.088754 */
#define labZb_32f 0.872766f /* = xyzZb_32f / 1.088754 */
下面是OpenCV2.4.1里面的代码(在color.cpp):
static const float sRGB2XYZ_D65[] =
{
0.412453f, 0.357580f, 0.180423f,
0.212671f, 0.715160f, 0.072169f,
0.019334f, 0.119193f, 0.950227f
};
这两组有一定差异的浮点数,直接导致了cvCvtColor出来的颜色不一致,导致后面的结果不一样。。查了一下google,发现也有人抱怨说OpenCV的cvCvtColor做出来和matlab不一致,大抵就是这里参数的问题。而为什么参数会有不一样呢?因为Lab颜色空间本身是1976年CIE(国际照明委员会)提出的,“Lab模式既不依赖光线,也不依赖于颜料,它是CIE组织确定的一个理论上包括了人眼可以看见的所有色彩的色彩模式。Lab模式弥补了RGB和CMYK两种色彩模式的不足。”,色彩范围更广,但是无法直接通过BGR转换过来(需要经过XYZ)。至于为什么参数不一致么,难道是写OpenCV的人用的显示器颜色有偏差?而且查了一下http://en.wikipedia.org/wiki/CIE_1931_color_space里面的XYZ介绍,好像参数还是不对啊。。难道写OpenCV的人觉得这样做出来的颜色更好看??
anyway,软件更新换代的时候也会有各种问题啊。。所以守旧也是挺好的啊。。我那可怜的自行车啊。。