android预览摄像头,Android上的摄像头预览处理

博主在尝试为Android机器人制作线路跟随者时遇到图像处理挑战,主要涉及摄像头预览的YUV格式转换为阈值以识别路径。已成功从相机预览获取数据并初步实现路径显示,但遇到YUV图像拉伸和重复问题。代码中展示了设置相机参数、预览回调以及阈值转换的过程,但存在应用崩溃的情况。更新说明CCD传感器方向问题已解决,但YUV数据管理问题依然存在。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我正在Android上为我的机器人制作线路跟随者(学习Java/Android编程),目前我正面临图像处理问题:摄像头预览返回一个名为YUV的图像格式,I想要将其转换为阈值以便知道线路的位置,那么该怎么做?Android上的摄像头预览处理

截至目前我已经成功获得东西,这是我绝对可以从相机的预览中读取数据,并通过某种奇迹,即使知道,如果光强度超过或低于一定值时在一定的区域屏幕。我的目标是将机器人的路径绘制在相机预览的叠加层上,这在某种程度上也起作用,但问题在于YUV管理。

6934ea1c06ece4a239dc7edce0f37770.png

正如你不仅可以看到暗区侧身拉,但它也重演4倍和预览图像被拉伸,我无法弄清楚如何解决这些问题。

这里的代码的相关部分:

public void surfaceCreated(SurfaceHolder arg0) {

// TODO Auto-generated method stub

// camera setup

mCamera = Camera.open();

Camera.Parameters parameters = mCamera.getParameters();

List sizes = parameters.getSupportedPreviewSizes();

for(int i=0; i

{

Log.i("CS", i+" - width: "+sizes.get(i).width+" height: "+sizes.get(i).height+" size: "+(sizes.get(i).width*sizes.get(i).height));

}

// change preview size

final Camera.Size cs = sizes.get(8);

parameters.setPreviewSize(cs.width, cs.height);

// initialize image data array

imgData = new int[cs.width*cs.height];

// make picture gray scale

parameters.setColorEffect(Camera.Parameters.EFFECT_MONO);

parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

mCamera.setParameters(parameters);

// change display size

LayoutParams params = (LayoutParams) mSurfaceView.getLayoutParams();

params.height = (int) (mSurfaceView.getWidth()*cs.height/cs.width);

mSurfaceView.setLayoutParams(params);

LayoutParams overlayParams = (LayoutParams) swOverlay.getLayoutParams();

overlayParams.width = mSurfaceView.getWidth();

overlayParams.height = mSurfaceView.getHeight();

swOverlay.setLayoutParams(overlayParams);

try

{

mCamera.setPreviewDisplay(mSurfaceHolder);

mCamera.setDisplayOrientation(90);

mCamera.startPreview();

}

catch (IOException e)

{

e.printStackTrace();

mCamera.stopPreview();

mCamera.release();

}

// callback every time a new frame is available

mCamera.setPreviewCallback(new PreviewCallback() {

public void onPreviewFrame(byte[] data, Camera camera)

{

// create bitmap from camera preview

int pixel, pixVal, frameSize = cs.width*cs.height;

for(int i=0; i

{

pixel = (0xff & ((int) data[i])) - 16;

if(pixel < threshold)

{

pixVal = 0;

}

else

{

pixVal = 1;

}

imgData[i] = pixVal;

}

int cp = imgData[(int) (cs.width*(0.5+(cs.height/2)))];

//Log.i("CAMERA", "Center pixel RGB: "+cp);

debug.setText("Center pixel: "+cp);

// process preview image data

Paint paint = new Paint();

paint.setColor(Color.YELLOW);

int start, finish, last;

start = finish = last = -1;

float x_ratio = mSurfaceView.getWidth()/cs.width;

float y_ratio = mSurfaceView.getHeight()/cs.height;

// display calculated path on overlay using canvas

Canvas overlayCanvas = overlayHolder.lockCanvas();

overlayCanvas.drawColor(0, Mode.CLEAR);

// start by finding the tape from bottom of the screen

for(int y=cs.height; y>0; y--)

{

for(int x=0; x

{

pixel = imgData[y*cs.height+x];

if(pixel == 1 && last == 0 && start == -1)

{

start = x;

}

else if(pixel == 0 && last == 1 && finish == -1)

{

finish = x;

break;

}

last = pixel;

}

//overlayCanvas.drawLine(start*x_ratio, y*y_ratio, finish*x_ratio, y*y_ratio, paint);

//start = finish = last = -1;

}

overlayHolder.unlockCanvasAndPost(overlayCanvas);

}

});

}

此代码退出应用程序时,有时会产生一个错误,由于一些方法release之后被调用,这是至少我的问题。

UPDATE:

现在的定位问题是固定的(CCD传感器方向),我仍然面临重复的问题,这可能与我的YUV数据管理......

QEBhF.png

2012-03-02

Solenoid

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值