gpt4 book ai didi

android - 如何从 Android 相机中找到帧的轮廓并将它们转换为 box2d 主体?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:58:50 24 4
gpt4 key购买 nike

使用 OpenFrameworks、OpenCV 和 Box2D,我能够以良好的帧率实现它。使用 Android 似乎是一项复杂得多的任务(部分原因是我是 JAVA 新手)。

我是这样开始的:

  1. 使用“OpenCV 示例 - 图像处理”并删除除“canny”效果之外的所有内容,这会生成非常适合找到轮廓的漂亮黑白图像。

    public Mat onCameraFrame(CvCameraViewFrame inputFrame)
    {
    mRgba = inputFrame.rgba();
    Imgproc.Canny(mRgbaInnerWindow, mIntermediateMat, 50, 100);
    Imgproc.cvtColor(mIntermediateMat, mRgbaInnerWindow, Imgproc.COLOR_GRAY2BGRA, 4);

    return mRgba;
    }
  2. 从“OpenCV Sample - color-blob-detection”中,我掌握了在 Mat 中查找轮廓的逻辑:

    // These two lines are actually in the function onCameraViewStarted
    mHierarchy = new Mat();
    CONTOUR_COLOR = new Scalar(255,0,0,255);

    // These lines are in function onCameraFrame
    List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
    Imgproc.findContours(mRgbaInnerWindow, contours, mHierarchy, Imgproc.RETR_EXTERNAL,
    Imgproc.CHAIN_APPROX_SIMPLE);
    Imgproc.drawContours(mIntermediateMat, contours, -1, CONTOUR_COLOR);

    所以,我当前的函数看起来像这样,但它不起作用:

    public Mat onCameraFrame(CvCameraViewFrame inputFrame)
    {
    mRgba = inputFrame.rgba();

    if ((mRgbaInnerWindow == null) || (mGrayInnerWindow == null) || (mRgba.cols() != mSizeRgba.width) || (mRgba.height() != mSizeRgba.height))
    CreateAuxiliaryMats();

    Imgproc.Canny(mRgbaInnerWindow, mIntermediateMat, 50, 100);
    //Imgproc.cvtColor(mIntermediateMat, mRgbaInnerWindow, Imgproc.COLOR_GRAY2BGRA, 4);

    List<MatOfPoint> contours = new ArrayList<MatOfPoint>();

    Imgproc.findContours(mRgbaInnerWindow, contours, mHierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
    //Imgproc.drawContours(mIntermediateMat, contours, -1, CONTOUR_COLOR);

    return mRgba;
    }
  3. 现在,这就是我被困的地方。我不断收到异常,我认为我没有使用正确的尺寸或将 Mat 转换为正确的颜色空间。这篇文章有一些见解,但我不知道它是否正确:OpenCV on Android findContours throws Exception

最佳答案

您好,我也是 openCV 的新手,但是这段代码可能会有所帮助,

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceView;
import org.opencv.android.*;
import org.opencv.core.*;
import org.opencv.imgproc.Imgproc;


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

public class MainActivity extends Activity implements CvCameraViewListener2{

private static final String TAG = MainActivity.class.getCanonicalName();

private CameraBridgeViewBase mOpenCvCameraView;

private Mat mRgba;
private Mat mIntermediateMat;
private Mat mGray;
Mat hierarchy;


List<MatOfPoint> contours;

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

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.java_surface_view);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);

mOpenCvCameraView.setCvCameraViewListener(this);

}

@Override
public void onResume() {
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this,
mLoaderCallback);
}

@Override
public void onPause() {
super.onPause();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}



@Override
public void onCameraViewStarted(int width, int height) {
mRgba = new Mat(height, width, CvType.CV_8UC4);
mIntermediateMat = new Mat(height, width, CvType.CV_8UC4);
mGray = new Mat(height, width, CvType.CV_8UC1);
hierarchy = new Mat();
}

@Override
public void onCameraViewStopped() {
mRgba.release();
mGray.release();
mIntermediateMat.release();
hierarchy.release();
}

@Override
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
mRgba = inputFrame.gray();
contours = new ArrayList<MatOfPoint>();
hierarchy = new Mat();

Imgproc.Canny(mRgba, mIntermediateMat, 80, 100);
Imgproc.findContours(mIntermediateMat, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0, 0));
/* Mat drawing = Mat.zeros( mIntermediateMat.size(), CvType.CV_8UC3 );
for( int i = 0; i< contours.size(); i++ )
{
Scalar color =new Scalar(Math.random()*255, Math.random()*255, Math.random()*255);
Imgproc.drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, new Point() );
}*/
hierarchy.release();
Imgproc.drawContours(mRgba, contours, -1, new Scalar(Math.random()*255, Math.random()*255, Math.random()*255));//, 2, 8, hierarchy, 0, new Point());
// Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2RGBA, 4);
return mRgba;
}

}

我知道这可能不是实现这一目标的最佳方式,但我们都在这里学习新方法:)

关于android - 如何从 Android 相机中找到帧的轮廓并将它们转换为 box2d 主体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16104744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com