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;

图像->图像数据是

imageData: PByte;

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

谢谢!

4

1 回答 1

2

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

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

但是,由于您使用的是旧版本的 Delphi,上述代码将无法编译。较旧的 Delphi 版本(Delphi 2009 之前)不允许对除PAnsiChar. 所以你需要这样写:

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

我怀疑在 C 代码中让您感到困惑的是(uchar*). 这是类型转换的 C 语法。


顺便说一句,将packed记录用于 OpenCV 结构是错误的。如果您查看 C 头文件,您会发现这些结构没有打包。在这种情况下这是良性的,CvLineIterator因为它没有填充,但是如果您养成打包不应该打包的结构的坏习惯,您将在某个地方陷入困境。

于 2012-08-01T08:50:24.940 回答