2011-07-04 6 views
-1

もう一度私です。ターボC++は本当の古代です。私は円の中心を取得する際に問題を抱えていますが、重心の座標を表示するプログラムを作成しましたが、ディスプレイは数値の代わりに-NAN、-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に1ピクセルあたり4Bytesがある場合は、各ラウンドごとにpを4ずつ増やすか、qにコピーするときに各カラーチャネルを通過して画像の4分の1しかコピーしないことに注意してください。グレー値を得るために、さらにrgbチャンネルを平均する必要があります。 – Nobody

+0

@Pollano、円は私のカメラで見つかった点です。 – Chang

答えて

2

あなたの部門に入る前にnがゼロでないことを確認する必要があります。

+0

n = n + 1;これはループに入るたびに非ゼロにします。 – Chang

1

あなたはqで指さ何の価値があなたのしきい値よりも大きくない場合に処理する必要があります。その場合には、nは0のまま、あなたはまた、0

による除算で終わる、私はしないでください読みやすい

  • が一つの大きなmemcpyの中でそれをやって可能性があることは非常になります括弧を追加

    • (++は両側でassignementの前または後に発生した場合は[OK]を、私は知っていることはありません)あなたは*q++ = *p++;を使用する理由は、読み取ることが難しい理解より効率的な時間

    変数とサイズの名前は、常に同じ色をチェックして、すべての色とカバーを使用しないように、ポインタを増やす必要があります(1ではなく3または4など)ピクチャの1/3(メモリ表現はpixel_0_r、pixel_0_g、pixel_0_b、pixel_1_r、pixel_1_g、pixel_1_b ...と仮定します)

  • +0

    ++がプロセスの後に発生するので、次の* qまたは* pは+1になります。 私はelseを置く必要があるのですか? – Chang

    +0

    '* q 'があなたのしきい値より大きくない場合、nは0のままです。後でこのケースを処理する必要があります。 '* p ++ = * q ++;'に関して、読むのは簡単ではなく、効率的ではありませんが、うまくいきます – Bruce

    関連する問題