#pragma once

#include "stdafx.h"
#include "DetectCasmatch.h"
#include "DetectMacbeth.h"
#include "MRegressionLinear.h"
#include "MRegressionRGB.h"

#define LIGHTSOURCE_SPECTRAL	"Data\\ArtificalSunlightSpectrum.csv"
#define MACBETH_SPECTRAL		"Data\\MacbethSpectrum.csv"
#define CMF_SPECTRAL			"Data\\ColorMatchFuncSpectrum.csv"
#define MEASURED_MACBETH_XYZ	"Data\\MeasuredMacbethXYZ.csv"
#define MONITOR_RGB				"Data\\MonitorRGB4913DG.csv"
#define MONITOR_XYZ				"Data\\MonitorXYZ4913N.csv"
#define SPECT_DIM				61
//#define	XYZ_FROM_SPECTRAL_DATA
#define LIN_XYZ_CONVERT_DIM		4
#define XYZ_DISP_CONVERT_DIM	4

class CReferenceProc
{
private:
	CDetectCasmatch		*m_Casmatch;	// キャスマッチ検出クラス
	CDetectMacbeth		*m_Macbeth;		// マクベス検出クラス
	CMRegressionLinear	*m_ccmCL;		// 線形化クラス
	CMRegressionRGB		*m_ccmLX;		// XYZ変換クラス
	CMRegressionRGB		*m_ccmXD;		// モニタRGB変換クラス
	CvMat				*m_crgbRC;		// キャスマッチ パッチ色
	CvMat				*m_lrgbRC;		// キャスマッチ 線形パッチ色
	CvMat				*m_crgbRM;		// マクベス パッチ色
	CvMat				*m_lrgbRM;		// マクベス 線形パッチ色
	CvMat				*m_xyzM;		// マクベス XYZ

public:
	CReferenceProc(void);
	~CReferenceProc(void);
	bool Init();
	bool CalcMatrix(const char *filename, const char *outputFile);
	CvMat    *GenMacbethXYZSpect();
	CvMat    *GenLinearize (const CvMat    *data);
	IplImage *GenLinearize (const IplImage *data);
	CvMat    *GenConvertXYZ(const CvMat    *data);
	IplImage *GenConvertXYZ(const IplImage *data);
	CvMat    *GenConvertDisp(const CvMat    *data);
	IplImage *GenConvertDisp(const IplImage *data);
	CvMat    *lrgbRC() { return m_lrgbRC; };
	CvScalar ScalarLinearize(const CvScalar data);
	CvScalar ScalarConvertXYZ(const CvScalar data);
	CvScalar ScalarConvertDisp(const CvScalar data);
};
