2011-07-04 52 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