2011-10-29 25 views
2

我使用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::writestd::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库和它的文件格式,但我宁愿避免使用额外的库。 “M使用OpenCV的2.3.1和OpenCV 2.2如何将CV_32F类型CV :: Mat保存到文件而不会丢失精确度?

有没有人有类似的问题,并找到解决方案

编辑:? 我的混乱对不起,我看错cv::Mat operator==描述,和思想。它的工作方式与之相反,所以sum(pca_orginal.mean==pca_loaded.mean)[0]给出0是更糟的可能结果这不是最好的。这意味着XML/YML除了生成大文件外还能正常工作。另外,在使用c样式转换后,我能够使二进制流工作,但生成的文件也很大(超过150MB)。

回答

0

在C接口中,有功能cvSavecvLoad用于保存任意矩阵。也可能有C++接口对应。

+0

Thx为答案,但正如我已经写道,xml函数生成相当大的文件(因为像素值被写为文本),并且在使用保存的文件时似乎会出现精度损失。 – morynicz

+0

我明白了。请发布您遇到问题的代码。应该可以将'data'数组转换为二进制文件,并且无任何问题地读取它(只要不在代表浮动的计算机之间移动文件)。 – misha

+1

对不起,xml不会降低精度。在使用c-style转换为(const char *)之后,我能够编写和读取平均值矩阵,所以它看起来可能适用于其他平台。现在我只需要检查写入硬盘后所有的数据是否合理(少于100MB)大小)。 – morynicz

相关问题