1

次のように、openCV の例からのコード スニペットがあります。

CvScalar sum_line_pixels( IplImage* image, CvPoint pt1, CvPoint pt2 )
{
    CvLineIterator iterator;
    int blue_sum = 0, green_sum = 0, red_sum = 0;
    int count = cvInitLineIterator( image, pt1, pt2, &iterator, 8, 0 );

    for( int i = 0; i < count; i++ ){
        blue_sum += iterator.ptr[0];
        green_sum += iterator.ptr[1];
        red_sum += iterator.ptr[2];
        CV_NEXT_LINE_POINT(iterator);

        /* print the pixel coordinates: demonstrates how to calculate the
                                                      coordinates */
        {
        int offset, x, y;
        /* assume that ROI is not set, otherwise need to take it
                                              into account. */
        offset = iterator.ptr - (uchar*)(image->imageData);
        y = offset/image->widthStep;
        x = (offset - y*image->widthStep)/(3*sizeof(uchar)
                                      /* size of pixel */);
        printf("(%d,%d)\n", x, y );
        }
    }
    return cvScalar( blue_sum, green_sum, red_sum );
}

私は次の行で立ち往生しました:

offset = iterator.ptr - (uchar*)(image->imageData);

イテレータ構造は次のとおりです。

PCvLineIterator = ^TCvLineIterator;
TCvLineIterator = packed record
  ptr: ^UCHAR;
  err: Integer;
  plus_delta: Integer;
  minus_delta: Integer;
  plus_step: Integer;
  minus_step: Integer;
end;

image->imageData は

imageData: PByte;

誰かがオフセットラインをデルファイに変換するのを手伝ってくれませんか?

ありがとう!

4

1 に答える 1

2

を計算する行は、ポインタとoffsetの間のバイト数を単純に計算しています。同じ変数名を使用していると仮定すると、そのコードの Delphi バージョンは次のようになります。iterator.ptrimage->imageData

offset := PByte(iterator.ptr) - image.ImageData;

ただし、古いバージョンの Delphi を使用しているため、上記のコードはコンパイルされません。Delphi の古いバージョン(Delphi 2009 より前)では、PAnsiChar. したがって、次のように記述する必要があります。

offset := PAnsiChar(iterator.ptr) - PAnsiChar(image.ImageData);

Cコードであなたを混乱させているのは(uchar*). これは、型キャストの C 構文です。


余談ですが、packedOpenCV 構造体にレコードを使用するのは誤りです。C ヘッダー ファイルを見ると、これらの構造体がパックされていないことがわかります。パディングがないため、これは の場合はCvLineIterator問題ありませんが、パックされるべきではない構造体をパックするという悪い習慣に陥ると、どこかで問題が発生します。

于 2012-08-01T08:50:24.940 に答える