Android平台上基于OpenCV的道路循迹

本文介绍了如何在Android平台上使用OpenCV通过摄像头捕捉道路图像,提取道路线并进行道路中心线定位,适用于小车或飞行器循迹。文章详细讨论了避免使用Android API获取视频流的原因,选择了OpenCV的VideoCapture,并通过HoughLineP进行直线检测。作者还分享了处理道路线分组和角度校正的思路,以及实时显示和反馈的方法。源代码已开源在GitHub。
摘要由CSDN通过智能技术生成

转载请注明本文出自SilenceDut的CSDN博客(http://blog.csdn.net/ls5222325/article/details/46441693),请尊重他人的辛勤劳动成果,谢谢!
最近实现了利用OpenCV在Android平台上通过摄像头拍摄道路图像提取道路线(两条直线的方程)并得到道路的中心线位置,反馈出道路信息和摄像头当前相对道路的信息可用于小车循迹,四旋翼飞行器循迹等。在这个过程中遇到了很多坑,又一步步的爬出,所以记录下以便以后回顾也希望能帮到需要的人。
之前也看过很多关于道路循迹的文章,但只是通过调用Canny等取边缘算子得到道路的边缘然后进行Hough变换得到边缘的直线,但存在的问题是得到的边缘直线有很多条,而且只是显示出直线,后续无法做任何事情,因为得到道路线的目的是为了后续的循迹,所以这种做法的没有太大的意义。先上张效果图。

黄线显示的是两条道路线!

实现
首先进行OpenCV的配置,配置的过程看这里http://blog.csdn.net/nailperry/article/details/42834413,写的很详细了,免Cygwin的。
具体的主要实现部分代码如下:

public class CannySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable{
   
    private static final String TAG = "CannySurfaceView::SurfaceView";
    private SurfaceHolder       mHolder;
    private VideoCapture        mCamera;
    private Mat rgbMat;
    private Mat mShow;  
    private Mat lines ;
    private List<Line> mLines = new ArrayList<Line>();
    private Line[] twoLines = new Line[2];     

    public CannySurfaceView(Context context) {
        super(context);
        mHolder = getHolder();
        mHolder.addCallback(this);
    }

    public boolean openCamera() {
        Log.i(TAG, "openCamera");     
        synchronized (this) {
            releaseCamera();
            mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID);
            if (!mCamera.isOpened()) {
                mCamera.release();
                mCamera = null;
                Log.e(TAG, "Failed to open native camera");
                return false;
            }
        }
        return true;
    }

    public void releaseCamera() {
        Log.i(TAG, "releaseCamera");
        synchronized (this) {
            if (mCamera != null) {
             mCamera.release();
             mCamera = null;
            }
        }
    }
    public void setupCamera(int width, int height) {
        Log.i(TAG, "setupCamera("+width+", "+height+")");
        if (mCamera != null && mCamera.isOpened()) {
            List<Size> sizes =     mCamera.getSupportedPreviewSizes();
            int mFrameWidth = width;
            int mFrameHeight = height;

            // selecting optimal camera preview size
            {
                double minDiff = Double.MA
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值