【发布时间】:2019-03-11 14:27:47
【问题描述】:
我正在将 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)。
【问题讨论】:
标签: opencv