将mat的矢量转换为Mat文件,以便使用opencv svm

时间:2014-01-27 13:32:55

标签: c++ arrays opencv vector svm

我有两个向量,我想将它们转换为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);
    }

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>,并且可以减少操作。

希望它有所帮助。