3

カムレアとフレームグラバーから取得した画像 (サイズ w=96 h=100 NoImg=100) を指しているポインターのベクトルがあります。ご覧のとおり、私はそれらのマトリックスを作成しており、データをピクセルごとに読み取り始めています。次のステップは、1 つの画像のすべてのピクセル データを最初の列に保持し、次の画像データを 2 番目の列に保持できる、より大きなマトリックス (h=9600 w=100) を作成することですが、100 に達する時間は画像の。すべての画像データを別の行列の1つの列に直接コピーするのに役立つ、 opencv に十分な方法または事前準備済みの方法があるのではないかと思っていましたか?? または、以下のコードのように、すべてのピクセルを 1 つずつ読み取り、別のコード内に 1 つずつ書き込む必要がありますか? 編集 私は次のコードになります

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();            
}
4

2 に答える 2

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());
}
于 2012-05-16T16:25:02.000 に答える
1

あなたが望むものは、リシェイプ機能に本当に近いと思います。

私が間違っている場合は教えてください:)

Opencv リシェイプ

于 2012-05-16T13:46:59.710 に答える