微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从Android相机中找到框架的轮廓并将其转换为box2d实体?

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

这就是我的开始:

>使用“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;
}

>从“OpenCV Sample – color-blob-detection”中我抓住了在Mat中找到轮廓的逻辑:

// These two lines are actually in the function onCameraviewStarted
mHierarchy = new Mat();
CONTOUR_COLOR = new Scalar(255,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,-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,100);
    //Imgproc.cvtColor(mIntermediateMat,4);

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

    Imgproc.findContours(mRgbaInnerWindow,Imgproc.CHAIN_APPROX_SIMPLE);
    //Imgproc.drawContours(mIntermediateMat,CONTOUR_COLOR);

    return mRgba;
}

>现在,这就是我被困的地方.我不断得到例外,我认为我没有使用正确的尺寸或将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,CvType.CV_8UC4);
    mGray = new Mat(height,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,80,100);
     Imgproc.findContours(mIntermediateMat,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,i,color,2,8,new Point() );
     }*/
     hierarchy.release();
     Imgproc.drawContours(mRgba,new Scalar(Math.random()*255,Math.random()*255));//,new Point());
    // Imgproc.cvtColor(mIntermediateMat,mRgba,Imgproc.COLOR_GRAY2RGBA,4);
    return mRgba;
}

}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Android 通过adb shell命令查看内存,CPU,启动时间,电量等信息 by:授客 QQ:1033553122 1、 查看内存信息 1)查看所有内存信息 命令: dumpsys meminfo 例: C:\Users\laiyu&gt;adb shell shell@android:/ $
Monkey Android app稳定性测试工具之Monkey使用教程 by:授客 QQ:1033553122 由于篇幅问题,仅提供百度网盘下载链接: Android app稳定性测试工具之Monkey使用教程.pdf
Android 常见adb命令 by:授客 QQ:1033553122 1、 查看所有已链接的设备 命令: adb devices 例: C:\Users\laiyu&gt;adb devices List of devices attached 5d3b5aac device 设备命令 2、 复制
这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android岛屿数量算...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Andro...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android数据压缩的方法是什么”文章能帮助大家解决疑惑...
这篇“Android怎么使用Intent传大数据”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅...