由于 cv::FileStorage读取cv::Mat 存在通道数的上限,因此对多于4个通道的Mat输出为YAML存储时,需要进行Reshape,具体如下:
写出多通道的Mat到YAML文件
cv::Mat fdstMat = cv::Mat::zeros(cv::Size(dst_w, dst_h), CV_32FC(nBandNum)); //nBandNum)>4
cv::Mat finalMat;
finalMat = fdstMat.reshape(1,1);//1个通道1行
cv::String filemat;
CString outNum;
outNum.Format(_T("%d"), i);
filemat = currentDir + _T("\\Samples_") +outNum + ".yaml"; //构造输出文件名
cv::FileStorage file0(filemat, cv::FileStorage::WRITE);
file0 << "SamplesMatrixRows" << height; //Mat实际大小
file0 << "SamplesMatrixCols" << width;
file0 << "SamplesMatrixChannels" << nBandNum;
file0 << "SamplesMatrix" << finalMat;
file0.release();
读入YAML文件到多通道的Mat
int srcMatrixRows;
int srcMatrixCols;
int srcMatrixChannels;
srcFSRead["SamplesMatrixRows"] >> srcMatrixRows;
srcFSRead["SamplesMatrixCols"] >> srcMatrixCols;
srcFSRead["SamplesMatrixChannels"] >> srcMatrixChannels;
cv::Mat srcMatrixTemp ;
srcFSRead["SamplesMatrix"] >> srcMatrixTemp;
cv::Mat srcMatrix = srcMatrixTemp.reshape(srcMatrixChannels, srcMatrixRows);
srcFSRead.release();
至此突破cv::FileStorage对cv::Mat的通道上限,实现自由读写。
参考