【问题标题】:OpenCv Camera View providing Mat object getting wrong dataOpenCv Camera View 提供 Mat 对象获取错误数据
【发布时间】:2014-01-28 20:58:29
【问题描述】:

我正在尝试使用 OpenCv4android 为 android 开发增强现实应用程序。我需要处理相机帧缓冲区。为了查看帧缓冲矩阵的内容是什么,我将 Mat 对象转换为 Bitmap 并写了一个 png 图像。我得到的只是一大块绿色像素。相机缓冲区应该没问题,因为 opencv 正在渲染它。我的代码如下。

public class OpenGLSurfaceWithCameraTest extends Activity implements CvCameraViewListener2{


private static final String  TAG = "OpenGLSurfaceWithCamera";
Mat mRgba;

boolean flag = true;

private CameraBridgeViewBase cameraPreview;

private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS:
            {
                Log.i(TAG, "OpenCV loaded successfully");
                cameraPreview.enableView();
            } break;
            default:
            {
                super.onManagerConnected(status);
            } break;
        }
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera_with_opengl);


    cameraPreview = (CameraBridgeViewBase)findViewById(R.id.camera_view_opengl);


    cameraPreview.setCvCameraViewListener(this);

}

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    if(cameraPreview != null){
        cameraPreview.disableView();
    }
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
}

@Override
public void onCameraViewStarted(int width, int height) {
    // TODO Auto-generated method stub
    mRgba =  new Mat(height, width, CvType.CV_8UC4);
}

@Override
public void onCameraViewStopped() {
    // TODO Auto-generated method stub
    mRgba.release();

}

@Override
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    // TODO Auto-generated method stub
    mRgba = inputFrame.rgba();


    Mat tmp = new Mat(mRgba.rows(), mRgba.cols(), CvType.CV_8UC1, new Scalar(4));
    Imgproc.pyrDown(mRgba, tmp);
    Imgproc.pyrDown(tmp, tmp);


    Bitmap bitmap = Bitmap.createBitmap(tmp.cols(), tmp.rows(), Config.ARGB_8888);

    Utils.matToBitmap(tmp, bitmap);

    if(flag){
    try {
        File root = null;
        String state = Environment.getExternalStorageState();
        if(state.equals(Environment.MEDIA_MOUNTED)){
            root = new File(Environment.getExternalStorageDirectory(), "aqib");
            if(root == null){
                Log.e(TAG, "root is null");
            }
            if(!root.exists()){
                root.mkdirs();
            }
        }

        if(root.exists()){
            Log.e(TAG, "root exists");
        }
        File file = new File(root, "test.png");
        OutputStream stream = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
        stream.close();
        flag = false;
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        Log.e(TAG, e.getMessage());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

    bitmap.recycle();
    return mRgba;
}

}

谁能建议我如何获得相机帧缓冲区的正确输出,以便我可以使用它在 opengl 中进行处理?

【问题讨论】:

  • 我知道出了什么问题,但首先,你想通过两次调用 pyrdown 来完成什么?转换为位图只是为了调试目的吗?
  • 是的,这是为了测试我实际得到的东西..... :) @RuiMarques
  • 但是你为什么要调用 pyrdown 两次呢?
  • pyrdown 函数对图像进行采样,我这样做只是为了调试目的,如果我在它工作正常时调用它。但如果我不调用它,输出就会变成黑色图像。调用两次只是采样多一点.... :) 无论如何,我解决了这个问题,至少现在,第一帧总是一个绿色矩阵,我不知道为什么。但是从第二帧开始,它给出了正确的输出.. :) @RuiMarques
  • 我知道 pyrdown 是做什么的,我试图检查你的目标是什么。我认为您的问题出现在第二个 pyrdown 上,您使用相同的图像作为输入和输出,尝试使用另一个 Mat 图像进行输出。 @aqib-ashef

标签: android opencv camera buffer frame


【解决方案1】:

显然,在我的情况下,第一帧始终是绿色帧。尝试从 10th 或类似的时间开始编写框架,并且成功了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 2017-02-25
    • 2012-11-12
    • 2014-02-02
    • 2013-01-01
    • 1970-01-01
    相关资源
    最近更新 更多