【问题标题】:Overlaying image on live feed in android在android中的实时提要上叠加图像
【发布时间】:2012-06-01 12:35:33
【问题描述】:

我想在 android 的实时提要上叠加图像。谁能建议从哪里开始? 我已将所需的网址转换为图像。下面是代码:

ImageView imgView = (ImageView) findViewById(R.id.ImageView01); Drawable drawable = LoadImageFromWebOperations("https://www.google.com.pk/logos/classicplus.png"); imgView.setImageDrawable(drawable);

private Drawable LoadImageFromWebOperations(String url) {
    try {
        InputStream is = (InputStream) new URL(url).getContent();
        Drawable d = Drawable.createFromStream(is, "src name");
        return d;
    } catch (Exception e) {
        System.out.println("Exc=" + e);
        return null;
    }

现在,我想要的是如何将此图像叠加到视频中的所需区域,即手部检测区域。问题是这个感兴趣的区域可以移动,因为它是一个实时提要...... 我们将不胜感激。

【问题讨论】:

  • 相对布局和view.layout()方法是你的朋友
  • 我是否必须先将图像视图转换为位图才能将其覆盖在视频上
  • 如何播放视频?创建RelativeLayout,将VideoView & ImageView 放入其中。通过 layout 方法设置 ImageView 位置。
  • 不,基本上我使用的是本机相机,下面是代码: public void surfaceCreated(SurfaceHolder holder) { Log.i(TAG, "surfaceCreated"); mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID); if (mCamera.isOpened()) { (new Thread(this)).start(); } else { mCamera.release(); mCamera = null; Log.e(TAG, "无法打开原生相机"); } } 和 'm 使用 opencv 提供的布局,它基本上是一个没有 xml 文件的代码(视图)

标签: android android-layout image-processing overlay


【解决方案1】:

我通过叠加两个视图(下面称为预览和叠加)来做到这一点。一个负责相机预览,另一个控制画布以绘制我想要的任何东西。

res/layout/main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
  <FrameLayout
      android:id="@+id/toplevelframe"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      >
    <your.project.Preview
    android:id="@+id/preview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />
    <your.project.Overlay
    android:id="@+id/overlay"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />
  </FrameLayout>
</LinearLayout>

在你的活动课上,onCreate():

...
setContentView(R.layout.main);
mPreview = (Preview) findViewById(R.id.preview);
mOverlay = (Overlay) findViewById(R.id.overlay);
...

onResume():

...
mCamera = Camera.open();
mPreview.setCamera(mCamera);
...

onPause():

if (mCamera != null) {
    mPreview.setCamera(null);
    mCamera.release();
    mCamera = null;
}

Overlay 类扩展 View 并在画布上绘图。没什么特别的,直接覆盖onDraw()即可。

对于相机预览类(下面的Preview),请查看official guide 以获取示例。它看起来像这样:

class Preview extends ViewGroup implements SurfaceHolder.Callback {
...
  private SurfaceView mSurfaceView;
  private SurfaceHolder mHolder;
  private Camera mCamera;
...
  public Preview(Context context, AttributeSet aset) {
      ...
      mSurfaceView = new SurfaceView(context);
      addView(mSurfaceView);
      // Install a SurfaceHolder.Callback so we get notified when the
      // underlying surface is created and destroyed.
      mHolder = mSurfaceView.getHolder();
      mHolder.addCallback(this);
      mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  }
...
  public void setCamera(Camera camera) {
      mCamera = camera;
      if (mCamera != null) {
          mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
          requestLayout();
      }
   }
...
}

然后也实现SurfaceHolder.Callback的所有方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 2018-03-07
    • 2021-06-27
    • 1970-01-01
    相关资源
    最近更新 更多