2012-05-16 236 views
3

我有一个指向矢量的指针,它指向我从camrea和framegrabber获得的图像(大小w = 96 h = 100 NoImg = 100)。你看到我正在创建它们的矩阵并开始逐个像素地读取数据。下一步是创建一个更大的矩阵(h = 9600 w = 100),它可以保存第一列中一个图像的所有像素数据,并将下一个图像数据保存到第二列,但是达到100的图像。 我想知道在opencv中是否有任何足够的方法或预备方法,这有助于我将所有图像数据直接复制到另一个矩阵的一列?或者是否需要逐个读取所有像素,如我的代码在下面,并在另一个内部逐个写入? 编辑 我结束了下面的代码opencv将一个矩阵复制到另一个矩阵的第一列中

cv::Mat _mainMatrix(_imageSize,_totalImgNO,CV_8UC1);  
//loop for creating a matrix of each image in the memory 
for(counter=0;counter<_totalImgNO;counter++){ 
    unsigned char* _pointer=(unsigned char*)_imgPtrVector.at(counter); 
    cv::Mat _matrixImage(cv::Size(width,height), CV_8UC1,_pointer , cv::Mat::AUTO_STEP);   
    channels=_matrixImage.channels(); 
    nRows=_matrixImage.rows * channels; 
    nCols=_matrixImage.cols; 
    if (_matrixImage.isContinuous()) 
    { 
     nCols *= nRows; 
     nRows = 1; 
    } 
    for(int i = 0; i < nRows; ++i) 
    { 
     p = _matrixImage.ptr<uchar>(i); 
     for (int j = 0; j < nCols; ++j) 
     { 
      if(iRow<_totalImgNO && jCol<_imageSize){     
       _mainMatrix.at<uchar>(iRow,jCol)=p[j]; 
       iRow++; 
      }    
     } 
    } 
    jCol++; 
    iRow=0; 
    _matrixImage.~Mat();    
} 

回答

1

我想你想要的是真正贴近重塑功能。

告诉我,如果我错了:)

Opencv Reshape

+0

感谢您的回答。我会检查并让你知道 – user261002

+0

以及我只是检查它,我不认为这是有用的,因为我需要将所有图像矩阵添加到一个大矩阵,然后我可以实现我的算法。 – user261002

+0

那么,我会至少在第一步中使用它,以便将所有图像合并到一行中。然后,将每个img.data指向最终图像每行的开头。 – jlengrand

2

OpenCV的迭代器是STL迭代器。这意味着,你可以在它们上使用STL函数。

粗糙例如:

cv::Mat1b bigmat(9600, 100); 
for (int i = 0; i < bigmat.cols; ++i) { 
    cv::Mat1b column = bigmatrix.col(i); 
    cv::Mat1b &source = *(images[i]); 
    std::copy(source.begin(), source.end(), column.begin()); 
} 
相关问题