我正在使用cv :: PCA类进行人脸识别项目。我将面部照片转换为一个行向量,将它们连接到一个大数组并输入到pca,以获得一个新的空间,我可以尝试使用距离进行识别。问题是,每次启动程序时从头开始计算pca都非常耗时(差不多五分钟)。我发现我需要将计算出的pca保存到硬盘驱动器,并在我再次启动程序时加载它。这就是问题所在。我可以看到,cv :: PCA中的所有cv :: Mat对象都是CV_32F类型。当我尝试将其保存为普通图片时,它会转换为8位图像,并且会丢失一些数据。当我使用XML / YAML持久性时,生成的文件非常大,数据也会丢失(我保存了它,加载到另一个结构并运行cerr<<sum(pca_orginal.mean==pca_loaded.mean)[0]<<endl
来检查区别有多大)。现在我正在尝试将std::ofstream::write
与std::ofstream::binary
标记和istream::read
一起使用,但存在一些类型问题(out.write(_pca.mean.data,_pca.mean.rows*_pca.mean.cols*4/*CV_32F->4*CV_8U*/\);
生成error: no matching function for call to ‘std::basic_ofstream<char, std::char_traits<char> >::write(uchar*&, int)
。我已经还听说过openexr库及其文件格式,但我宁愿避免使用其他库。我正在使用OpenCV 2.3.1和OpenCV 2.2。
修改:
对不起,我很抱歉。我误读了cv::Mat operator==
描述,并认为它的工作原理与之相反,因此sum(pca_orginal.mean==pca_loaded.mean)[0]
给出0是可能的结果,而不是最好的结果。这意味着XML / YML除了生成大文件外还可以正常工作。此外,在使用c风格的转换后,我能够使二进制流工作,但生成的文件也很大(超过150MB)。
答案 0 :(得分:0)
在C接口中,有用于保存任意矩阵的函数cvSave
和cvLoad
。也可能是C ++接口对应物。