2011-07-04 84 views
-1

這是我的一次。 Turbo C++是真正的古代。我得到了一個圓圈的中心問題,我寫了一個程序來顯示質心的座標,但顯示屏顯示了我--NAN,而不是數字。請諮詢,thnx。獲得圓圈的中心Turbo C++

unsigned char *p = rgbImage; //rbgImage = new unsigned char [ 160 * 120 * 4 ] 
unsigned char *q = image; //image = new unsigned char [ 160 * 120 * 1 ] 
int n = 0; 
float LaserX = 0, LaserY = 0; 
char* LaserMID = new char[255]; 

for(int j = 0; j < 120; j++) { 
    for(int i = 0; i < 160; i++) { 
     *q++ = *p++; 
     if (*q >= Thrshld) { 
      LaserX += j; 
      LaserY += i; 
      n = n + 1; 
     } 
    } 
} 
LaserX = LaserX/n; 
LaserY = LaserY/n; 
sprintf(LaserMID, "%.1f, %.1f", LaserX, LaserY); 
ShowCo->Text = LaserMID; 
+0

你是如何表示該圓的? –

+1

請注意,如果rgbImage的每像素爲4Bytes,那麼您應該每次將p增加4,否則複製到q時您將遍歷每個顏色通道,這將只複製圖像的四分之一。此外,您應該對rgb頻道進行平均以獲得灰度值。 – Nobody

+0

@Pollano,圓圈是我的相機發現的一個點。 – Chang

回答

2

您需要檢查n在您的分割之前是否爲非零。

+0

n = n + 1;只要進入循環,這將使其非零。 – Chang

1

您需要處理在沒有由Q指出值大於你的閾值的情況下:在這種情況下,正以0保持你0.

而且結束了一個部門,我不明白爲什麼你用*q++ = *p++;很難讀(好吧,我從來不知道是否++在雙方assignement之前或之後發生)

  • 加括號可能容易可讀性
  • 在一個大的memcpy這樣做會更更省時

關於原始數據,變量和大小的名稱似乎指出,您的p指針應該增加更多(比如3或4而不是1),以便始終檢查相同的顏色,而不是使用所有顏色並覆蓋(假設存儲器表示爲pixel_0_r,pixel_0_g,pixel_0_b,pixel_1_r,pixel_1_g,pixel_1_b ...

+0

++發生在該過程之後,所以下一個* q或* p將爲+1。 你的意思是我需要放一個別的? – Chang

+0

如果'* q'永遠不會超過您的閾值,n會停留在0,您需要稍後處理該情況。關於'* p ++ = * q ++;',它只是不容易閱讀,而且時間效率不高,但確實有效 – Bruce