因为做竞赛要用到机器视觉,本来想用CM4开源平台但是由于需要很大的计算资源,手机更加合适方便,并且开发周期短,不需要操纵让人心烦的硬件逻辑
本Demo程序是基于安卓摄像头动态提取图像加工后输出到屏幕上的。
这个程序的逻辑很简单,找到图像中某一个颜色区域,比如,找到图像中的红色方块(环境颜色都是蓝色这种容易跟红色分开的色泽)
首先,在Manifest.xml文件中加入
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.Camera" />
上面这些是开启摄像头允许
然后我们在布局文件中定义两个SurfaceView
<SurfaceView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/surface_view" />
<SurfaceView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/surface_view2" />
为什么是两个surfaceview呢,因为有一个surfaceview是用来预览摄像头的,但是我们需要预览的是经过处理后的图像,因此我们另一个surfaceview来覆盖掉原本用来预览摄像头的surfaceview
下面试MainActivity
public class MainActivity extends Activity implements SurfaceHolder.Callback,PreviewCallback{
private Camera camera;
private SurfaceView view=null;
private SurfaceView surfaceDraw = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = (SurfaceView) findViewById(R.id.surface_view);
view.getHolder().addCallback(this);
surfaceDraw= (SurfaceView) findViewById(R.id.surface_view2);
surfaceDraw.setVisibility(View.VISIBLE);
surfaceDraw.setZOrderOnTop(true);//我们自己的预览窗口放到顶部,这个必须
}
public void surfaceCreated(SurfaceHolder holder) {
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
try
{
camera = Camera.open();//打开摄像头
camera.setPreviewDisplay(holder);
Camera.Parameters parameters = camera.getParameters();
//支持照片格式,这里向调试器打印