[英]How to detect motion on android device
I want to create motion detector in android usingCamera.PreviewCallback
, and comparing two images . 我想在Android中使用
usingCamera.PreviewCallback
创建运动检测器,并比较两个图像。 Could you help me please? 请问你能帮帮我吗?
public class IsengActivity extends Activity implements SurfaceHolder.Callback, Camera.PreviewCallback, PictureCallback { 公共类IsengActivity扩展Activity实现了SurfaceHolder.Callback,Camera.PreviewCallback,PictureCallback {
Camera kamera;
SurfaceHolder surface;
SurfaceView kameraview;
public byte dataOld[];
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
kameraview =(SurfaceView) findViewById(R.id. kameraku);
surface = kameraview.getHolder();
surface.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surface.addCallback(this);
}
@Override
public void onPreviewFrame(byte[] data, Camera kamera) {
if(data.length ==0) return;
if(dataOld.length==0 )
data=dataOld;
int Isdiferent=0;
int treshold =50;
for (int x=0; x<data.length; x=+5)
{
if(Math.abs(data[x] - dataOld[x]) <= treshold )
{
Isdiferent +=1;
}
float precentage = Isdiferent / data.length;
if (precentage > 20 )
{
kamera.takePicture(null,null,this);
}
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int h, int w) {
kamera.startPreview();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
kamera=Camera.open();
try
{
Camera.Parameters parameter = kamera.getParameters();
if(this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE)
{
parameter.set("orientation","portrait");
kamera.setDisplayOrientation(90);
}
else
{
parameter.set("orientation","landscape");
kamera.setDisplayOrientation(0);
}
kamera.setParameters(parameter);
kamera.setPreviewDisplay(holder);
}
catch(IOException e)
{
kamera.release();
}
kamera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
kamera.stopPreview();
kamera.release();
}
@Override
public void onPictureTaken(byte[] data, Camera kamera) {
// TODO Auto-generated method stub
Uri imageFileUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI,new ContentValues());
try
{
/*String sdcardStorage = Environment.getExternalStorageDirectory().toString();
imageFileUri=Uri.parse(sdcardStorage + "/HeryMD/Test.jpg");*/
String sdcardStorage = Environment.getExternalStorageDirectory().toString();
File f = new File(sdcardStorage + "/HeryMD/Test.jpg");
OutputStream os = new FileOutputStream(f);
os.write(data);
os.flush();
os.close();
} catch(FileNotFoundException e)
{
Toast t = Toast.makeText(this,e.getMessage(), Toast.LENGTH_SHORT);
t.show();
}
catch(IOException e)
{
Toast t = Toast.makeText(this,e.getMessage(), Toast.LENGTH_SHORT);
t.show();
}
kamera.startPreview();
}
} }
managing preview is a bit tricky, because you haev to take into accound orientation changes and activity lifecycle. 管理预览有点棘手,因为您必须考虑调整方向和活动生命周期。 But this is nicely encapsulated in this project ( See android demos in sources, and camera manager ):
但这很好地封装在该项目中(请参阅源代码中的android demos和camera manager):
http://sourceforge.net/projects/javaocr/ http://sourceforge.net/projects/javaocr/
Another issue would be to determine movement. 另一个问题是确定运动。 This could be done using image moments - just compute some domains over ixisting image and cmopare them with previous values ( of course, you will have to pick moments where there is not translation of rotation invariance ) (code computing image moments is also in project )
这可以使用图像矩来完成-只需在ixisting图像上计算一些域,然后用先前的值对其进行cmopare处理(当然,您必须选择没有旋转不变性平移的矩)(代码计算图像矩也在项目中)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.