8

私はOpenCVが初めてです。「for」ループの代わりにイテレータを使用しようとしていますが、これは私の場合には遅すぎます。私はこのようないくつかのコードを試しました:

MatIterator_<uchar> it, end;
for( it = I.begin<uchar>(), end = I.end<uchar>(); it != end; ++it)
{
    //some codes here
}

ここでの私の質問は次のとおりです: for ループを次のように変換するにはどうすればよいですか:

for ( int i = 0; i < 500; i ++ )
{
    exampleMat.at<int>(i) = srcMat>.at<int>( i +2, i + 3 )
}

イテレータモードに?つまり、イテレータ形式で "i +2, i + 3" を実行するにはどうすればよいでしょうか? 「 *it 」で対応する値しか取得できないと思いますが、そのカウント数を取得できませんでした。よろしくお願いします。

4

2 に答える 2

23

遅いのは for ループではなく、exampleMat.at<int>(i)範囲チェックを行っているのです。

すべてのピクセルを効率的にループするには、.ptr() を使用して各行の開始時にデータへのポインターを取得できます。

for(int row = 0; row < img.rows; ++row) {
    uchar* p = img.ptr(row);
    for(int col = 0; col < img.cols; ++col) {
         *p++  //points to each pixel value in turn assuming a CV_8UC1 greyscale image 
    }

    or 
    for(int col = 0; col < img.cols*3; ++col) {
         *p++  //points to each pixel B,G,R value in turn assuming a CV_8UC3 color image 
    }

}   
于 2012-08-16T04:10:31.237 に答える
1

ある種のカウント変数が必要であり、自分で宣言して更新する必要があります。これを行うコンパクトな方法は次のようになります

int i = 0;
for( it = I.begin<uchar>(), end = I.end<uchar>(); it != end; ++it,i++)
{
//some codes here involving i+2 and i+3
}

ただし、超高速アクセスを探している場合は、データ ポインターを自分で操作することをお勧めします。反復速度の優れた説明については、OpenCV 2 Computer Vision Application Programming Cookbook on page 51 (65 in pdf) を参照してください。あなたのコードは次のように見えるかもしれません

cv::Mat your_matrix;
//assuming you are using uchar
uchar* data = your_matrix.data();

for(int i = 0; i < some_number; i++)
{
  //operations using *data
  data++;
}
于 2012-08-16T00:50:09.460 に答える