【问题标题】:real time video processing with android openCV使用 android openCV 进行实时视频处理
【发布时间】:2014-02-22 21:33:33
【问题描述】:

我是第一次使用 android 程序员。 我正在进行的项目需要我进行(简单?)实时视频处理。 该应用程序完成后需要执行以下操作: 当我们点击内置的相机应用程序时,它会打开。然后我继续选择视频录制选项。使用它我可以看到周围环境而无需记录。我想要完成的是将显示延迟几百毫秒。我的一位同事可以通过使用笔记本电脑网络摄像头和 openCV(用于计算机)的延迟选项轻松完成此操作。我正在尝试用安卓手机来完成同样的事情。

也许我在解释情况方面做得不好。请尽快回复。 我现在正在编写代码,并且作为第一次程序员需要一些时间。 很高兴开始使用 Android 编程!

【问题讨论】:

  • 听起来可行。只需将帧记录到内存中的环形缓冲区并按需重播
  • 当然可以。但这真的不是简单或微不足道的,我认为也不是有人能够在 StackOverflow 上用几行回复。作为第一次使用 Android 程序员,您将很难做到。
  • @Budius,为什么要吓唬他?实际上很容易。非常好的菜鸟项目恕我直言。

标签: android opencv video video-processing


【解决方案1】:

不知道这个任务是否真的需要 opencv(可能有点矫枉过正),但如果你选择它,它相当容易。

我们在这里所做的只是连续记录帧,并在某些事件上在实时/回放模式之间切换(此处为简单起见,onTouch):

package com.berak.echo;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.app.Activity;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;

import com.berak.echo.R;

public class EchoActivity extends Activity implements CvCameraViewListener2, OnTouchListener {
    CameraBridgeViewBase mOpenCvCameraView;
    List<Mat> ring = new ArrayList<Mat>(); // recording buffer
    int delay = 100;                       // delay == length of buffer
    boolean delayed = false;               // state

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_echo);
        mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.cam3_surface_view);
        mOpenCvCameraView.setCvCameraViewListener(this);
        mOpenCvCameraView.setOnTouchListener(this);    // setup as touchlistener
    }

    // lots of boilerplate, ugly, but needed.
    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
            case LoaderCallbackInterface.SUCCESS:
                mOpenCvCameraView.enableView();
                break;
            default:
                super.onManagerConnected(status);
                break;
            }
        }
    };   
    @Override
    public void onResume() {;
        super.onResume();
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_5,this, mLoaderCallback);
    }
    @Override
    public void onPause() {
        super.onPause();
        if (mOpenCvCameraView != null)
            mOpenCvCameraView.disableView();
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
    }   
    @Override
    public void onCameraViewStarted(int width, int height) { }   
    @Override
    public void onCameraViewStopped() { }


    // here's the bread & butter stuff:
    @Override
    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
        Mat mRgba = inputFrame.rgba();
        ring.add(mRgba.clone());            // add one at the end
        if ( ring.size() >= delay ) {       // pop one from the front
            ring.get(0).release();
            ring.remove(0);
        }

        Mat ret;
        String txt;
        if ( delayed && ring.size()>0 ) {   // depending on 'delayed' return either playback
            ret = ring.get(0);              // return the 'oldest'
            txt = "playback";
        } else {
            ret = mRgba;                    // or realtime frame
            txt = "realtime";
        }
        Core.putText(ret, txt, new Point(20,20), Core.FONT_HERSHEY_PLAIN, 1.2, new Scalar(200,0,0));
        return ret;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // just toggle between delayed an realtime view:
        delayed = ! delayed;
        return false;
    }    
}

【讨论】:

    猜你喜欢
    • 2014-09-04
    • 1970-01-01
    • 2014-04-01
    • 2012-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    相关资源
    最近更新 更多