int test_cvtColor_RGB2RGB()
{
	cv::Mat mat = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);
	if (!mat.data) {
		std::cout << "read image fail" << std::endl;
		return -1;
	}

	int width = mat.cols;
	int height = mat.rows;

	// uchar
	fbc::Mat3BGR mat1(height, width, mat.data);
	fbc::Mat3BGR mat2(mat1);
	fbc::Mat_<uchar, 4> mat3(height, width);
	fbc::cvtColor(mat2, mat3, fbc::CV_BGR2BGRA);

	cv::Mat mat1_(height, width, CV_8UC3, mat.data);
	cv::Mat mat2_;
	mat1_.copyTo(mat2_);
	cv::Mat mat3_(height, width, CV_8UC4);
	cv::cvtColor(mat2_, mat3_, CV_BGR2BGRA);

	assert(mat3.step == mat3_.step);
	for (int y = 0; y < mat3.rows; y++) {
		const fbc::uchar* p = mat3.ptr(y);
		const uchar* p_ = mat3_.ptr(y);

		for (int x = 0; x < mat3.step; x++) {
			assert(p[x] == p_[x]);
		}
	}

	// float
	cv::Mat matf;
	mat.convertTo(matf, CV_32FC3);

	fbc::Mat_<float, 3> mat4(height, width, matf.data);
	fbc::Mat_<float, 3> mat5(mat4);
	fbc::Mat_<float, 4> mat6(height, width);
	fbc::cvtColor(mat5, mat6, fbc::CV_BGR2BGRA);

	cv::Mat mat4_(height, width, CV_32FC3, matf.data);
	cv::Mat mat5_;
	mat4_.copyTo(mat5_);
	cv::Mat mat6_(height, width, CV_32FC4);
	cv::cvtColor(mat5_, mat6_, CV_BGR2BGRA);

	assert(mat6.step == mat6_.step);
	for (int y = 0; y < mat6.rows; y++) {
		const fbc::uchar* p = mat6.ptr(y);
		const uchar* p_ = mat6_.ptr(y);

		for (int x = 0; x < mat6.step; x++) {
			assert(p[x] == p_[x]);
		}
	}

	return 0;
}
int test_cvtColor_Lab2RGB()
{
#ifdef _MSC_VER
	cv::Mat mat = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);
#else	
	cv::Mat mat = cv::imread("test_images/lena.png", 1);
#endif
	if (!mat.data) {
		std::cout << "read image fail" << std::endl;
		return -1;
	}

	int code[] = { fbc::CV_Lab2BGR, fbc::CV_Luv2BGR };
	int code1[] = { fbc::CV_BGR2Lab, fbc::CV_BGR2Luv };

	for (int i = 0; i < 2; i++) {
		cv::cvtColor(mat, mat, code1[i]);

		int width = mat.cols;
		int height = mat.rows;

		// uchar
		fbc::Mat_<uchar, 3> mat1(height, width, mat.data);
		fbc::Mat_<uchar, 3> mat2(mat1);
		fbc::Mat_<uchar, 3> mat3(height, width);
		fbc::cvtColor(mat2, mat3, code[i]);

		cv::Mat mat1_(height, width, CV_8UC3, mat.data);
		cv::Mat mat2_;
		mat1_.copyTo(mat2_);
		cv::Mat mat3_(height, width, CV_8UC3);
		cv::cvtColor(mat2_, mat3_, code[i]);

		assert(mat3.step == mat3_.step);
		for (int y = 0; y < mat3.rows; y++) {
			const fbc::uchar* p = mat3.ptr(y);
			const uchar* p_ = mat3_.ptr(y);

			for (int x = 0; x < mat3.step; x++) {
				assert(p[x] == p_[x]);
			}
		}

		// float
		cv::Mat matf;
		mat.convertTo(matf, CV_32FC3);

		fbc::Mat_<float, 3> mat4(height, width, matf.data);
		fbc::Mat_<float, 3> mat5(mat4);
		fbc::Mat_<float, 3> mat6(height, width);
		fbc::cvtColor(mat5, mat6, code[i]);

		cv::Mat mat4_(height, width, CV_32FC3, matf.data);
		cv::Mat mat5_;
		mat4_.copyTo(mat5_);
		cv::Mat mat6_(height, width, CV_32FC3);
		cv::cvtColor(mat5_, mat6_, code[i]);

		assert(mat6.step == mat6_.step);
		for (int y = 0; y < mat6.rows; y++) {
			const fbc::uchar* p = mat6.ptr(y);
			const uchar* p_ = mat6_.ptr(y);

			for (int x = 0; x < mat6.step; x++) {
				assert(p[x] == p_[x]);
			}
		}
	}

	return 0;
}