我有两个向量,我想将它们转换为Mat文件,以便使用opencv的SVM列车。我得到的矢量是一个用于训练数据的矢量和一个用于标记的矢量。如何将它们从svmtrain ?? /
转换为必要的类型for(int i=0; i<face.size();i++){
img = imread("faceNface/face/"+face.at(i),1);
cvtColor(img, img, CV_BGR2GRAY);
img = img.reshape(1, 12100).t();
trainData.push_back(img);
lbs.push_back(1);
}
for(int i=0; i<non_face.size();i++){
img = imread("faceNface/nonface/"+non_face.at(i), 1);
cvtColor(img, img, CV_BGR2GRAY);
img = img.reshape(1, 12100).t();
trainData.push_back(img);
lbs.push_back(-1);
}
答案 0 :(得分:4)
如果标签矢量类型为std::vector<double>
,则可以使用以下功能。如果不是,你需要做一些改变。我相信你可以搞清楚。
cv::Mat Classifier::vectorToMat(std::vector<double> data)
{
int size = data.size();
cv::Mat mat(size, 1, CV_32F);
for(int i = 0; i < size; ++i)
{
mat.at<float>(i, 0) = data[i];
}
return mat;
}
对于数据本身,我有两条建议供您使用;
1)将1x12100尺寸的图片转换为std::vector<double>
,然后std::vector<std::vector<double>>
为trainData
,然后您可以使用以下功能。
cv::Mat Classifier::vectorToMat(std::vector<std::vector<double> > data)
{
int height = data.size();
std::vector<double> vectorData = data[0];
int width = vectorData.size();
cv::Mat mat(height, width, CV_32F);
for(int i = 0; i < height; ++i)
{
for(int j = 0; j < width; ++j)
{
mat.at<float>(i,j) = data[i][j];
}
}
return mat;
}
2)修改我发布的代码,使用std::vector<cv::Mat>
执行相同的操作。实际上这样做会更好,因为如果你这样做,你首先不需要将cv::Mat
转换为std::vector<double>
,并且可以减少操作。
希望它有所帮助。