我有一个来自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吗?
谢谢!
答案 0 :(得分: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语法。
另外,对于OpenCV结构使用packed
记录是错误的。如果您查看C头文件,您将看到这些结构未打包。在CvLineIterator
的情况下这是良性的,因为它没有填充,但如果你养成了不应该打包的结构的坏习惯,你就会陷入某个地方。