zoukankan      html  css  js  c++  java
  • opencv直线检测在c#、Android和ios下的实现方法

    opencv直线检测在c#、Android和ios下的实现方法

    本文为作者原创,未经允许,不得转载 ;原文由作者发表在博客园:http://www.cnblogs.com/panxiaochun/p/5512142.html

    c#实现方法

    LineSegment2D[][] lines = rgbRect.HoughLines(10, 150, 10, (Math.PI), 10, 0, 50);
    for (int i = 0; i < lines[0].Length; i++)
    {
          rgbImage.Draw(line[0][i], new Rgb(System.Drawing.Color.Red), 1);
    }
    

    c#下的实现方法很简单,opencv的很多方法都被封装在对象里面,只要让对象自己执行执行检测就行,比如上面的rgbRect是个image<rgb,byte>类的对象,让它自己执行霍夫直线检测,其中第一第二个参数是canny的阈值,c++下实现直线检测前要进行canny,在这里直接设置就行,只需要调用一次。

    找到的直线是一个二维数组,但是,数组里面只有一行多列:[0][n],例如lines[0][0]是找到的第一条直线,其中lines[0][0].P1是第一条线的一个点的坐标,lines[0][0].P2是第一条线的第二个点的坐标

    注意:opencv找到的直线不是按照坐标系的x轴从小到大存放的,而是找到的直线的先后顺序,也就是存放在数组里的第一条线的x轴能会比第二条线的x轴的坐标要大.

    Android实现方法

    Mat imageBuffer = new Mat(rgbImage.width(),rgbImage.height(),CvType.CV_8UC1);
    
    Imgproc.Canny( rgbImage, imageBuffer,30, 150);
    Mat lines = new Mat();
    Mat rgbRect = imageBuffer.clone();
    Imgproc.HoughLinesP(rgbRect, lines, 10, (Math.PI), 10, 0, 50);
    
    double[] linePoints = new double[4];
    for(int i = 0 ; i < lines.rows;i++){
    	linePoints = lines.get(i, 0);
        Imgproc.line(rgbImage, new Point(linePoints[0],linePoints[1]), new Point(linePoints[2], linePoints[3]), new Scalar(255,0,0), 1);
    }
    

    Android的直线检测是存放在一个CV_32SC4的Mat矩阵中,这个矩阵是N行1列的,行数代表找到的直线条数,每个通道按照x1、y1、x2、y2、存放直线的坐标,通过get(row,col)可以得到矩阵的每个点的数值,存放在一个double数组里就可以得到直线位置。

    android的直线检测前要先进行canny ,但是并不能像c#和c++版那样把canny的输出对象设置为输出对象,在c#和c++版下是可以的,所以必须得新建一个Mat存放canny后的图像

    ios实现方法

    cv::canny(rgbRect,rgbRect,50,150);
    std::vector<cv::Vec4i> lines;
    cv::HoughLinesP(rgbRect, lines, 1, CV_PI, 10,10,50);
    for( size_t i = 0; i < lines.size(); i++ )
    {
      line( rgbImage, cv::Point(lines[i][0], lines[i][1]),
      cv::Point(lines[i][2], lines[i][3]), cv::Scalar(0,0,255), 1, 8 ); 
    }
    

    ios版其实是在c++下实现的,检测到的直线是存放在一个std::vectorcv::Vec4i的容器里,每个元素里存放4个浮点数,也是按照x1、y1、x2、y2的方式存放

    ios版和c#canny不需要新建一个存放输出对象,可以直接把输入图像设置为输出图像

    以上的直线检测都是用霍夫概率直线检测houghLinesP,检测到的直线都是有距离和坐标点的。

  • 相关阅读:
    【软件】Linux图形软件VNC&X11
    【C++语法】STL
    【C++语法】Type & Value Category
    【C++语法】关键字
    【C++语法】C++语法目录
    【算法·Algorithms】 Sort
    【代码·Patten】theme: Calculator
    centos MIT 6.828 qemu 安装问题
    【归纳】Layui table.render里的json后台传入
    【归纳】springboot中的IOC注解:注册bean和使用bean
  • 原文地址:https://www.cnblogs.com/panxiaochun/p/5512142.html
Copyright © 2011-2022 走看看