我正在编写一个可以在驾驶模拟器中检测车道的应用程序.环境相对简单,大多是直的多车道道路,几乎没有曲率.目前,我可以使用(经典)Hough变换成功检测到线条,但问题是HT自然也会检测到不是车道的线条.
我怎样才能更有选择性?我没有绘制水平线,但仍然有一些线路进入.理想情况下,我想检测车辆行驶的车道边界.以下是环境的典型图像
这是我到目前为止所做的事情:
成像阈值的原因如下.如果你看一下上面链接的环境照片,你会看到一条平行于道路的灰色线条.因为它是一条连续线 - 与车道标记不同 - HT最终检测到它.我不能基于渐变来排除它,因为它具有与车道标记相同的梯度.通过阈值处理,我可以删除它,因此只检测作为实际车道标记的线.
这是上述操作的结果
我知道这个问题有很多解决方案,我已经阅读了无数的论文,但它们似乎都处理的环境比这复杂得多,而且/或者只是简单的方式.为了它的价值,仅仅一个多月前,我没有ComputerVision的背景,所以这对我来说都是非常新的.
更新1:
我想用更好的术语来说,我正在寻找一种模拟车道的方法,以便不包括不适合模型的线.不幸的是,我不知道从哪里开始使用模型.有什么建议?
为了它的价值,我已经设法识别出车辆在其中行驶的车道,并且可以排除不属于"主动"车道的额外线路,可以这么说.希望这张照片会有所帮助
它不完美,但我猜它.在建模之后,我的最终目标是生成车辆的航向/位置.但我只是想首先获得相对强大的车道检测.我希望有一种相对简单的技术可以帮助实现这一点(不依赖于系统的参数,例如视场的焦距).
我正在尝试实现Cascaded Hough Transform(我已经实现了'普通'版本.)但我无法理解以下内容:
在图像上应用HT后,我在霍夫空间中留下了直线.HT的级联版本要求我将霍夫空间分成3个子空间,以便解决无界值的问题.
我该怎么做呢?
这是霍夫空间如何分裂的图片: 
为了在保持对称空间对偶性的同时恢复参数空间的有界性,我们将(a,b) - 空间分成三个有界子空间,如下图所示.第一个子空间也有坐标a和b,但仅适用于| a | <= 1和| b | <= 1.如果| a | > 1和| b | <= | a | ,点(a,b)在第二个子空间中出现,坐标为1/a和b/a.如果,最后,| b | > 1和| a | <| b |,我们使用坐标为1/b和a/b的第三个子空间.
这是我感到非常困惑的地方,假设我在霍夫空间中有一条线.如果它违反了|将如何拆分 a | <= 1和| b | <= 1?
我是否只是遍历线中的所有像素,如果有问题的像素的坐标大于| a | <= 1和| b | <= 1,我在第二个子空间中绘制它?
如果在Stack Overlow上不欢迎这类问题,我深表歉意 - 是否有其他网站可以提出有关算法的问题?
我刚刚恢复了一个旧项目的工作,并一直在考虑重写它的一些部分.
我的问题涉及如何构建我的程序.我一直在努力遵循MVC范式.我将从解释事物的位置开始:程序操纵4种类型的图像:偏差,黑暗,平场和灯光.我有一个叫做的类Image可以代表所有这些.从光中减去偏差和暗,然后将光除以平场.最初,我打算使用2个类,一个名为CalibrationImage,另一个名为Light.但差异只是一种方法,它将是我上面提到的分裂函数.否则,他们是一样的.所以我决定不再为此目的设两门课.
该程序的第二个主要类涉及处理多个Image对象 - 这个类被称为ImageStacker.截至目前,它将Image对象保存在可变数组中.它可以对此阵列执行各种操作,例如堆叠所有图像,校准它们等.
此类还充当NSTableView主窗口中对象的数据源.我不是认为没有一个可变数组,我应该有4个数组,每个数组都保持指定一种类型的图像(比如,一个用于Lights的数组,另一个用于Darks等).一旦程序开始实际工作,它将是Darks,Flat Fields和Bias框架.然后,它将校准Lights数组中保存的每个对象,然后将它们堆叠起来.我觉得这为程序提供了合乎逻辑的进展.它也有点容易想象.
这是一个很好的程序设计吗?它遵循MVC吗?我认为,我的观点是NSTableView,控制器是NSApplication和模型ImageStacker.但是,Image感觉它不是MVC的一部分,但我不知道如何在没有它的情况下编写程序.
我想开发一个可以追踪和追踪道路的系统.最初,我只想处理定义明确的道路,之后可能会对没有明确定义的道路进行跟踪.
我面临的问题是我不知道从哪里开始.我是图像处理的新手,我希望能得到一些关于从哪里开始以及阅读有关该主题的书籍的指示.我是一个'经验丰富'的程序员(我可以很好地用C和Python编程,并且可以处理C++和Objective-C),所以代码本身并不是一个大问题 - 它只是"我从哪里开始?什么我读过吗?" 这让我很困惑.如果它对我有帮助,我也会学习另一种语言.
我会很感激有关这方面的任何指示/建议.
我正在连接一个测试一组电线的程序,用于开路或短路.该程序在AVR上运行,将测试向量(步进'1')驱动到导线上并接收结果.它将该结果向量与已存储在SD卡或外部EEPROM中的预期数据进行比较.
这是一个例子,假设我们有一组8条线,所有这些线都是直通的,即它们没有连接点.因此,如果我们驱动0b00000010,我们应该收到0b00000010.
假设我们收到0b11000010.这意味着线7,8和线2之间存在短路.我可以通过0b00000010 ^ 0b11000010 = 0b11000000检测我感兴趣的位.这告诉我显然线7和8有故障,但我如何在大位阵列中有效地找到这些'1'的位置.使用位掩码只需8线即可轻松完成此操作,但我正在开发的系统必须能够处理多达300线(位).在我开始使用如下的宏并测试300*300位数组中的每个位之前,我想问一下是否有更优雅的解决方案.
#define BITMASK(b) (1 << ((b) % 8))
#define BITSLOT(b) ((b / 8))
#define BITSET(a, b) ((a)[BITSLOT(b)] |= BITMASK(b))
#define BITCLEAR(a,b) ((a)[BITSLOT(b)] &= ~BITMASK(b))
#define BITTEST(a,b) ((a)[BITSLOT(b)] & BITMASK(b))
#define BITNSLOTS(nb) ((nb + 8 - 1) / 8)
Run Code Online (Sandbox Code Playgroud)
只是为了进一步说明如何检测开路.预期数据:0b00000010,接收数据:0b00000000(导线未拉高).0b00000010 ^ 0b00000000 = 0b0b00000010 - 导线2打开.
注意:我知道测试300线不是AVR Mega 1281内部的微小RAM可以处理的东西,这就是为什么我将它分成组,即测试50线,比较,显示结果然后前进.
我使用C的switch语句为嵌入式系统实现了一个简单的状态机.我知道如果我使用具有查找表的函数指针会更好,但我将其保存为下一步.
我的状态机具有以下状态:
当系统启动时,它进入启动状态,配置端口,初始化显示,并与SPI总线上连接的IC进行握手,以确保一切正常.如果是,则系统进入空闲状态.如果没有,它进入启动错误状态,在LCD上显示错误,标记变量然后进入空闲状态.
在空闲状态下,程序轮询微控制器上的3个引脚,检查是否按下3个按钮之一(检查,编程,复制到存储器).根据按下的按钮,它进入适当的状态,执行一些代码,更新LCD然后返回到空闲状态.注意:如果系统中出现硬件故障,系统不关心是否按下按钮.启动错误状态标记一个名为hardware_fault的变量,如果设置该变量,则确保空闲状态不会干扰轮询任何输入按钮.
这是我第一次实现状态机,我只是不确定这是不是一个好的设计.我还没有看到任何FSM的例子,他们在空闲状态下轮询输入.相反,似乎大多数例子本质上都是顺序的(例如计数器).所以,我的问题是,我的设计合理吗?它可以工作,但正如大家都知道的那样,设计不好,然后有好的设计.
我正在开发一种可以测试大量电线(最多360个)的嵌入式系统 - 本质上是一个连续性检查系统.系统通过在测试向量中计时并从另一端读取输出来工作.然后将输出与存储结果(将在SD卡上)进行比较,该结果告诉输出应该是什么.测试向量只是一个步行,所以不需要将它们存储在任何地方.这个过程有点像:
我的硬件包含一个大型移位寄存器,用于输入AVR微控制器.对于每个测试向量(也可能是360位),我需要读取360位.因此,对于360线,数据总量将是360*360 = 16kB左右.我已经知道我不能在一个通做到这一点(即读取整个数据,然后进行比较),所以它必须通过测试向量测试向量.
由于没有固有类型可以容纳如此大的数字,我打算使用长度为360位的位数组.现在,我的问题是,我应该如何将这个位数组存储在txt文件中?
一种方法是存储原始值,即在每行存储我从移位寄存器读入的原始二进制数据.因此,对于8线,它将是0b10011010.但是对于高达360线的线路来说这可能会变得很难看 - 每条线路都包含360个字节.
另一种方法是存储十六进制值 - 这只是8位的两个字符(上面的9A)和360位的大约90个字符.这会,但是,需要我在文本阅读 - 逐行 - 并转换位阵列中表示的十六进制值,不知何故.
那么这个问题的最佳解决方案是什么?我需要解决方案完全"确定性" - 我不能调用malloc等.从我读过的内容来看,它们在嵌入式系统中有点禁忌.
摘要
我需要存储无法用任何传统变量类型表示的大值.目前我打算将这些值存储在一个bitarray中.将这些值存储在SD卡上的文本文件中的最佳方法是什么?