OpenCV 之Mat::push_back()

来源:互联网 发布:金融seo是什么意思 编辑:程序博客网 时间:2024/06/06 13:07

  OpenCV的数据结构Mat是相当强大的,Mat的push_back()

template<typename _Tp> inline void Mat::push_back(const _Tp& elem){    if( !data )    {        *this = Mat(1, 1, DataType<_Tp>::type, (void*)&elem).clone();        return;    }    CV_Assert(DataType<_Tp>::type == type() && cols == 1              /* && dims == 2 (cols == 1 implies dims == 2) */);    uchar* tmp = dataend + step[0];    if( !isSubmatrix() && isContinuous() && tmp <= datalimit )    {        *(_Tp*)(data + (size.p[0]++)*step.p[0]) = elem;        dataend = tmp;    }    else        push_back_(&elem);}template<typename _Tp> inline void Mat::push_back(const Mat_<_Tp>& m){    push_back((const Mat&)m);}

从上面可以看出,当dig.push_back()的参数是Mat small的时候,会把这个small的数据排成一行放到dig中,在这之前先reshape().这样就可以作为一个Mat的虚拟的vector来使用。注意,这个功能必须要求isContinues(),即small的数据必须是在内存中连续存放的。

一下是一个使用的例子

// Main entry code OpenCV#include <cv.h>#include <highgui.h>#include <cvaux.h>#include <iostream>#include <vector>using namespace std;using namespace cv;int main ( int argc, char** argv ){    cout << "OpenCV Training SVM Automatic Number Plate Recognition\n";    cout << "\n";    char* path_Plates;    char* path_NoPlates;    int numPlates;    int numNoPlates;    int imageWidth=144;    int imageHeight=33;    //Check if user specify image to process    if(argc >= 5 )    {        numPlates= atoi(argv[1]);        numNoPlates= atoi(argv[2]);        path_Plates= argv[3];        path_NoPlates= argv[4];    }else{        cout << "Usage:\n" << argv[0] << " <num Plate Files> <num Non Plate Files> <path to plate folder files> <path to non plate files> \n";        return 0;    }            Mat classes;//(numPlates+numNoPlates, 1, CV_32FC1);    Mat trainingData;//(numPlates+numNoPlates, imageWidth*imageHeight, CV_32FC1 );    Mat trainingImages;    vector<int> trainingLabels;    for(int i=0; i< numPlates; i++)    {        stringstream ss(stringstream::in | stringstream::out);        ss << path_Plates << i << ".jpg";        Mat img=imread(ss.str(), 0);        img= img.reshape(1, 1);        trainingImages.push_back(img);        trainingLabels.push_back(1);    }    for(int i=0; i< numNoPlates; i++)    {        stringstream ss(stringstream::in | stringstream::out);        ss << path_NoPlates << i << ".jpg";        Mat img=imread(ss.str(), 0);        img= img.reshape(1, 1);        trainingImages.push_back(img);        trainingLabels.push_back(0);    }    Mat(trainingImages).copyTo(trainingData);    //trainingData = trainingData.reshape(1,trainingData.rows);    trainingData.convertTo(trainingData, CV_32FC1);    Mat(trainingLabels).copyTo(classes);    FileStorage fs("SVM.xml", FileStorage::WRITE);    fs << "TrainingData" << trainingData;    fs << "classes" << classes;    fs.release();    return 0;}


原创粉丝点击