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,检测到的直线都是有距离和坐标点的。

opencv直线检测在c#、Android和ios下的实现方法的更多相关文章

  1. Cocos2d-x在win32,android和IOS下的文件读写问题

    最近在学习和使用Cocos2d-x框架,虽然说的是跨平台,但是在用VS进行开发,然后移植到android或IOS下,也可能会出现各种问题,需要做细微的调整. 例如我在做文件读写操作的时候,很可能在wi ...

  2. 请问如何查询一个APP的Android和iOS下载量?

    作者:Jasmine Jiang链接:http://www.zhihu.com/question/28533067/answer/87871598来源:知乎著作权归作者所有,转载请联系作者获得授权. ...

  3. 【转】【Android】Android不同版本下Notification创建方法

    使用 new Notification(int icon, CharSequence tickerText, long when)构造函数时,Eclipse却提示:" The constru ...

  4. Android不同版本下Notification创建方法

    项目环境 Project Build Target:Android 6.0 问题: 使用 new Notification(int icon, CharSequence tickerText, lon ...

  5. OpenCV 直线检测

    /*------------------------------------------------------------------------------------------*\ This ...

  6. iOS 下 Podfile 使用方法

    配置 Podlist Pod 是 iOS 下包管理工具,类似于 JavaScript 里的 npm 或 yarn. 创建 Podfile 创建 Podfile 有两种方式: 打开 Terminal,在 ...

  7. Android不刷机下的app2sd方法(dex cache占空间解决篇)

    抱着5年的HTC G7这个古董,一直没有想法去换换. 近期微信.支付宝什么的apk应用都開始走程序巨型化,一次性就来个50MB的空间占用,让还是Android 2.2的手机怎样吃的消? 看看100多M ...

  8. Android+openCV人脸检测2(静态图片)

    前几篇文章中有提到对openCV环境配置,这里再重新梳理导入和使用openCV进行简单的人脸检测(包括使用级联分类器) 一 首先导入openCVLibrary320 二 设置gradle的sdk版本号 ...

  9. Python+OpenCV图像处理(十四)—— 直线检测

    简介: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线 ...

随机推荐

  1. CSS3 使用自定义字体

    CSS3 @font-face 规则 在 CSS3 之前,web 设计师必须使用已在用户计算机上安装好的字体.通过 CSS3,web 设计师可以使用他们喜欢的任意字体.当您您找到或购买到希望使用的字体 ...

  2. ThinkPHP3.2 G函数代码及 使用方法

    ThinkPHP3.2 G函数代码及 使用方法 代码: // 内存是否可调用 define('MEMORY_LIMIT_ON',function_exists('memory_get_usage')) ...

  3. jQuery原型属性和方法总结

    从大四下学期开始了解jquery源码相关的东西,在回校参加毕业典礼(准确的说是参加补考挂科太多)期间便开始借着<jQuery>内幕学习jquery源码,然后在博客园写笔记也已经两个月了,也 ...

  4. CSS学习总结(二)

    一.id及class选择符 id和class的名称是由用户自定义的.id号可以唯一地标识html元素,为元素指定样式.id选择符以#来定义. 1.id选择符   注:在网页中,每个id名只能是唯一不重 ...

  5. CoreDataManager-OC版-兼容iOS10以前的版本

    头文件: #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> /** CoreData管理器 */ ...

  6. Scrum三大角色特点

    灵感来自于一段冷笑话: 一天,一头猪和一只鸡在路上散步,鸡看了一下猪说,“嗨,我们合伙开一家餐馆怎么样?”,猪回头看了一下鸡说,“好主意,那你准备给餐馆起什么名字呢?”,鸡想了想说“餐馆名字叫火腿和鸡 ...

  7. Gradle常用命令

    使用cmd进入Android studio项目的根目录就可以执行一些gradle相关命令 gradle -v 查看版本 (如果你是第一次执行会去下载Gradle,这个过程如果不FQ非常慢) gradl ...

  8. UIButton、UILabel、UITextField 初学者需要了解的基本定义和常用设置

     以下是三个IOS开发中最常用的控件,作为IOS基础学习教程知识 ,初学者需要了解其基本定义和常用设置,以便在开发在熟练运用. UIButton按钮 第一.UIButton的定义 UIButton * ...

  9. C语言中的循环结构与选择结构

    1. 为什么使用循环? 重复执行某段代码 2. while(条件){ 循环体: } 当条件成立的时候就执行循环体,条件不成立,就退出循环,继续执行while后面的语句 3. for ( 初始表达式 : ...

  10. art.dialog.art 中,将子页面窗口中的值传递给父框架中

    artDialog.open.origin.document.getElementById('父元素ID').value=document.getElementById('子页面元素ID').valu ...