2012-08-01 143 views
1

我有一個代碼段從OpenCV的示例方法的轉換如下:C至DELPHI的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 is

imageData: PByte; 

有人可以幫助我將偏移行轉換爲德爾福?

謝謝!

+1

我們很樂意提供幫助,但請首先表明您的努力。有什麼問題? – 2012-08-01 08:38:09

+0

你的delphi代碼是什麼樣的,你爲什麼打包這個記錄? – 2012-08-01 08:38:41

+0

我想計算偏移量。說實話,我不明白在這一行上做了什麼以及如何用delphi編寫它。我已經從C,方法簽名遷移結構,似乎工作,只有這個抵消 – John 2012-08-01 08:40:21

回答

2

計算offset的行只是簡單計算指針iterator.ptrimage->imageData之間的字節數。假設你使用的是相同的變量名的代碼的德爾福版本是這樣的:

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

然而,由於使用的是德爾福的舊版本,上面的代碼將無法編譯。較早的Delphi版本(Delphi 2009之前的版本)不允許在PAnsiChar以外的類型上進行指針運算。所以,你需要把它寫這樣的:

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

我懷疑什麼是混淆你的C代碼爲(uchar*)。這是一個類型轉換的C語法。


順便說一句,在OpenCV結構中使用packed記錄是錯誤的。如果你看看C頭文件,你會發現這些結構沒有被打包。在CvLineIterator的情況下,這是良性的,因爲它沒有填充,但如果你遇到不應該打包的結構包裝的壞習慣,你會在某處下到某處。

+0

我得到:操作符不適用於此操作數類型 – John 2012-08-01 08:53:49

+0

@John是的,我是最重要的。我注意到你正在使用一箇舊的Delphi版本,它不支持除了PAnsiChar以外的類型的指針算術。請參閱第二行代碼。 – 2012-08-01 08:55:46

+1

謝謝。這似乎工作。 – John 2012-08-01 08:57:26