C++ 求圆的中心点turboc++;

C++ 求圆的中心点turboc++;,c++,C++,又是我。Turbo C++是真正的古代。我在获取圆心时遇到了一个问题,我编写了一个程序来显示质心的坐标,但是显示器显示的是-NAN,-NAN而不是数字。请给我建议,thnx 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; fl

又是我。Turbo C++是真正的古代。我在获取圆心时遇到了一个问题,我编写了一个程序来显示质心的坐标,但是显示器显示的是-NAN,-NAN而不是数字。请给我建议,thnx

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;
无符号字符*p=rgbImage//rbgImage=新的无符号字符[160*120*4]
无符号字符*q=图像//image=新的无符号字符[160*120*1]
int n=0;
浮动激光X=0,激光Y=0;
char*LaserMID=新字符[255];
对于(int j=0;j<120;j++){
对于(int i=0;i<160;i++){
*q++=*p++;
如果(*q>=Thrshld){
激光器x+=j;
激光+=i;
n=n+1;
}
}
}
LaserX=LaserX/n;
LaserY=LaserY/n;
sprintf(LaserMID,%.1f,%.1f),LaserX,LaserY);
ShowCo->Text=LaserMID;

在除法之前,您需要检查
n
是否为非零。

您需要处理q所指的值均不大于阈值的情况:在这种情况下,n保持在0,并以0除法结束

而且,我不明白你为什么使用
*q++=*p++很难阅读(好吧,我永远不知道++是在两边赋值之前还是之后发生的)

  • 添加括号可能更易于阅读
  • 在一个大的内存中完成这项工作将更加节省时间

关于原始数据,变量名称和大小似乎表明p指针的增量应该大于该值(如3或4而不是1),以始终检查相同的颜色,而不是使用所有颜色,并覆盖图片的1/3(假设内存表示为pixel_0_r,pixel_0_g,pixel_0_b,pixel_1_r,pixel_1_g,pixel_1_b…

如何表示该圆?请注意,如果rgbImage的每个像素有4个字节,则每轮也应将p增加4,或者在复制到q时,您将通过每个颜色通道,这将只复制图像的四分之一。进一步,您可以应该平均rgb通道以获得灰色值。@Pollano,圆圈是我相机拍到的一个点。@没人,你平均rgb通道是什么意思?你的灰度值是r、g和b值的平均值,所以灰色=(r+g+b)/3.还有一些特殊的权重可以查看以获取更多信息。n=n+1;这将使它在进入循环时变为非零。++发生在过程之后,因此下一个*q或*p将为+1。你的意思是我需要放置一个其他值?如果
*q
从未大于阈值,n将保持在0,你需要稍后处理该情况。关于
*p++=*q++;
,它不容易阅读,也不省时,但确实有效