C到delphi方法转换openCV示例代码

时间:2012-08-01 08:35:09

标签: delphi delphi-7

我有一个来自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-&gt; imageData是

imageData: PByte;

有人可以帮我将偏移线转换为delphi吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

计算offset的行只是计算指针iterator.ptrimage->imageData之间的字节数。假设您使用相同的变量名称,该代码的Delphi版本将如下所示:

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

但是,由于您使用的是较旧版本的Delphi,因此上述代码无法编译。较旧的Delphi版本(Delphi 2009之前的版本)不允许在PAnsiChar以外的类型上使用指针算法。所以你需要这样写:

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

我怀疑你在C代码中混淆的是(uchar*)。这是类型转换的C语法。


另外,对于OpenCV结构使用packed记录是错误的。如果您查看C头文件,您将看到这些结构未打包。在CvLineIterator的情况下这是良性的,因为它没有填充,但如果你养成了不应该打包的结构的坏习惯,你就会陷入某个地方。