使用实时图像处理检测Android摄像头中的激光点的代码

时间:2012-09-06 11:35:12

标签: java android image-processing

我写了一个代码来找到相机中最亮的像素(激光点) 取景器并在该坐标处画一个圆圈。

理想情况下,圆圈应位于圆点上。但由于一些问题(也许是屏幕 分辨率/编码错误)圆圈有点移位。

我附上截图和代码。

如果你能指出错误或给你的错误,我将非常感激 有价值的建议。

问题:

  1. 正确跟踪点,但坐标不准确(如屏幕截图所示)
  2. Fireworks模式在S2上不起作用,但适用于Galaxy Ace。
  3. 应用程序在motorolla安卓手机崩溃
  4. 代码+截图 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);
            }
    

1 个答案:

答案 0 :(得分:0)

从你的屏幕截图判断,只要你找到最亮的像素就绝对没有帮助你。激光点的大小可能是15×15像素,大部分区域是过饱和的,即所有这些像素都被最大化并且将是“最亮的像素”。

更好的启发式方法可能是,取所有像素的坐标,其亮度值(假设您可以使用HSL颜色模型)高于给定阈值,然后计算某种形式的加权平均值(每个像素的权重是相对的)它的亮度)。对于测试目的,只计算平均值可能会。