0

カメラのファインダーで最も明るいピクセル(レーザードット)を見つけ、その座標に円を描くコードを書きました。

円がドット上にあるのが理想的です。しかし、何らかの問題(おそらく画面解像度/コーディングエラー)により、円は少しずれています。

スクリーンショットとコードを添付しています。

エラーを特定するか、貴重な提案をしていただければ幸いです。

問題:

  1. ドットは適切に追跡されますが、座標は正確ではありません (スクリーンショットのように)
  2. Fireworks モードは S2 では機能しませんが、Galaxy Ace では機能します。
  3. Motorolla Android フォンでアプリがクラッシュする

コード + スクリーンショット http://wikisend.com/download/553910/re41postqueryregardingdecodeyuv420spmrgbdatamyuvd.zip

 protected void onDraw(Canvas canvas) {
        if (mBitmap != null)
        {
            int canvasWidth = canvas.getWidth();
            int canvasHeight = canvas.getHeight();
            int newImageWidth = canvasWidth;
            int marginWidth = (canvasWidth - newImageWidth)/2;

            // Convert from YUV to RGB
            decodeYUV420SP(mRGBData, mYUVData, mImageWidth, mImageHeight);

                int maxR=255;x=0;y=0; int k=0;
            for (int i = 0; i < mRGBData.length; i++) {
                    if((((mRGBData[i] >> 16) & 0x000000FF)+((mRGBData[i] >> 8) & 0x000000FF)+((mRGBData[i]) & 0x000000FF))>maxR)
                    {
                        maxR=(mRGBData[i] >> 16) & 0x000000FF;
                        maxR+=(mRGBData[i] >> 8) & 0x000000FF;
                        maxR+=(mRGBData[i] ) & 0x000000FF;
                        y=i%mImageWidth;
                        x=i/(mImageWidth);
                    }
                }
                String status= "Laser coords: ("+maxR+", "+y+")";

                canvas.drawText(status, marginWidth+10, 60, mPaintYellow);
                canvas.drawCircle(y, x, 10, mPaintYellow);
                           }
           super.onDraw(canvas);
        }
4

1 に答える 1

0

スクリーンショットから判断すると、見つけた最も明るいピクセルを取得するだけでは、間違いなく役に立ちません。レーザードットはおそらく 15x15 ピクセルの大きさで、ほとんどの領域が過飽和になっています。つまり、これらのピクセルはすべて最大になり、「最も明るいピクセル」になります。

より良いヒューリスティックは、明るさの値 (HSL カラーモデルを使用できると仮定) が特定のしきい値を超えているすべてのピクセルの座標を取得し、何らかの形式の加重平均を計算することです (各ピクセルの重みはその明るさに比例します)。 )。テスト目的では、平均を計算するだけで十分でしょう。

于 2012-09-10T20:24:30.233 に答える