掌桥专利:专业的专利平台
掌桥专利
首页

线条检测方法及装置、芯片、设备、存储介质

文献发布时间:2023-06-19 18:37:28


线条检测方法及装置、芯片、设备、存储介质

技术领域

本申请涉及图像处理技术,涉及但不限于线条检测方法及装置、芯片、设备、存储介质。

背景技术

线特征检测算法在图像领域应用广泛,检出的线特征(如线段)作为后续算法的底层算子,在多个领域具有一定的应用潜力。例如,线特征用于人脸反畸变、线特征追踪匹配或三维(Three Dimensional,3D)特征重建等。相对点特征而言,线特征具备更强的局部不变和尺度鲁棒等性质,在近年的无人驾驶激光和视觉导航(navigation)、城市建图(mapping)、增强现实(Augmented Reality,AR)/虚拟现实(Virtual Reality,VR)以及计算机视觉(Computer Vision,CV)算法领域中,线特征提取被作为一个非常重要的算法方向。其中,精准度更高的线特征对于提高应用的性能是有益的。

发明内容

有鉴于此,本申请提供的线条检测方法及装置、芯片、设备、存储介质,能够得到更为准确的线条检测结果,从而利于提升基于线特征的应用场景性能。

第一方面,本申请实施例提供一种线条检测方法,包括:根据与当前像素不同行的前级相邻像素的步进记录、以及具有所述步进记录的前级相邻像素与所述当前像素的位置关系,从所述当前像素和所述当前像素的下一行像素中,确定出待加入所述线条的目标像素;所述目标像素为边缘像素;基于确定所述目标像素为所述线条的终点,至少输出所述线条的起点坐标和终点坐标;其中,所述当前像素和具有所述步进记录的前级相邻像素为边缘像素,所述步进记录至少包括对应检测的线条的起点坐标、第一方向标记和第二方向标记,所述第一方向标记表示所述线条的线条类型为第一类型,所述第二方向标记用于表示所述线条的当前检测方向;

如此,通过步进记录记录当前正在检测的线条是第一类型的线条还是第二类型的线条(即第一方向标记);在进行线条生长(也即线条检测)时根据第一方向标记确定是采用第二类型的线条的检测规则还是第一类型的线条的检测规则;从而,能够得到更为准确的线条检测结果,从而利于提升基于线特征的应用场景的性能。

第二方面,本申请实施例提供另一种线条检测方法,包括:在当前像素的水平左相邻像素和/或水平右相邻像素为非边缘像素的情况下,根据与当前像素不同行的前级相邻像素的步进记录、以及具有所述步进记录的前级相邻像素与所述当前像素的位置关系,确定所述当前像素是否增加为所述线条的目标像素;基于确定所述当前像素增加为所述目标像素且满足线条终止条件,将所述当前像素作为所述线条的终点,输出所述线条的起点坐标和终点坐标;其中,所述当前像素和具有所述步进记录的前级相邻像素为边缘像素,所述步进记录至少包括对应检测的线条的起点坐标、第一方向标记和第二方向标记,所述第一方向标记表示所述线条的线条类型为第二类型,所述第二方向标记表示所述线条的当前检测方向。

第三方面,本申请实施例提供又一种线条检测方法,包括:基于确定与当前像素不同行的前级相邻像素的步进记录记录的第一方向标记表示所述线条的线条类型为第一类型的线条,执行第一类型的线条检测的方法中的步骤;基于确定所述第一方向标记表示所述线条的线条类型为第二类型,执行第二类型的线条的检测方法中的步骤;其中,所述当前像素和具有所述步进记录的前级相邻像素为边缘像素,所述步进记录至少包括对应检测的线条的起点坐标、第一方向标记和第二方向标记,所述第一方向标记表示所述线条的线条类型,所述第二方向标记表示所述线条的当前检测方向。

第四方面,本申请实施例提供一种线条检测装置,包括:第一确定模块,配置为根据与当前像素不同行的前级相邻像素的步进记录、以及具有所述步进记录的前级相邻像素与所述当前像素的位置关系,从所述当前像素和所述当前像素的下一行像素中,确定出待加入所述线条的目标像素;所述目标像素为边缘像素;其中,所述当前像素和具有所述步进记录的前级相邻像素为边缘像素,所述步进记录至少包括对应检测的线条的起点坐标、第一方向标记和第二方向标记,所述第一方向标记表示所述线条的线条类型为第一类型,所述第二方向标记用于表示所述线条的当前检测方向;第一输出模块,配置为基于确定所述目标像素为所述线条的终点,至少输出所述线条的起点坐标和终点坐标。

第五方面,本申请实施例提供另一种线条检测装置,包括:第二确定模块,配置为在当前像素的水平左相邻像素和/或水平右相邻像素为非边缘像素的情况下,根据与所述当前像素不同行的前级相邻像素步进记录、以及具有所述步进记录的前级相邻像素与所述当前像素的位置关系,确定所述当前像素是否增加为所述线条的目标像素;其中,所述当前像素和具有所述步进记录的前级相邻像素为边缘像素,所述步进记录至少包括对应检测的线条的起点坐标、第一方向标记和第二方向标记,所述第一方向标记表示所述线条的线条类型为第二类型,所述第二方向标记表示所述线条的当前检测方向;第二输出模块,基于确定所述当前像素增加为所述目标像素且满足线条终止条件,将所述当前像素作为所述线条的终点,输出所述线条的起点坐标和终点坐标。

第六方面,本申请实施例提供一种芯片,包括处理器和存储器;其中,所述处理器,配置为执行本申请实施例所述的线条检测方法;所述存储器,配置为存储所述处理器在执行所述线条检测方法的过程中所需的输入数据和输出数据。

第七方面,本申请实施例提供一种电子设备,包括存储器和处理器,所述存储器存储有可在处理器上运行的计算机程序,所述处理器执行所述程序时实现本申请实施例所述的方法。

第八方面,本申请实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现本申请实施例提供的所述的方法。

应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。

附图说明

此处的附图被并入说明书中并构成本说明书的一部分,这些附图示出了符合本申请的实施例,并与说明书一起用于说明本申请的技术方案。显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。

图1A为本申请实施例提供的线条检测方法的实现流程示意图;

图1B为边缘图像的概念示意图;

图2为本申请实施例提供的前级相邻像素以及后级相邻像素与当前像素的位置关系示意图;

图3为本申请实施例提供的当前像素所处像素场景的示意图;

图4为本申请实施例提供的当前像素与具有步进记录的前级相邻像素的位置关系示意图;

图5为本申请实施例提供的线条检测方法的部分实现流程示意图;

图6为本申请实施例提供的线条检测方法的部分实现流程示意图;

图7为本申请实施例提供的当前像素所处像素场景的示意图;

图8为本申请实施例提供的线条检测方法的部分实现流程示意图;

图9为本申请实施例提供的线条检测方法的实现流程示意图;

图10为本申请实施例提供的横向线条检测中步进记录的生成规则示意图;

图11为本申请实施例提供的横向线条检测中当前像素的周围像素情况的示意图;

图12为本申请实施例提供的当前像素所处场景属于类型A的一种示例示意图;

图13为本申请实施例提供的当前像素所处场景属于类型A的另一种示例示意图;

图14为本申请实施例提供的当前像素所处场景属于类型A的又一种示例示意图;

图15为本申请实施例提供的当前像素所处场景属于类型A的再一种示例示意图;

图16为本申请实施例提供的当前像素所处场景属于类型B的示例的生长规则示意图;

图17为本申请实施例提供的当前像素所处场景属于类型B的示例的生长规则示意图;

图18为本申请实施例提供的当前像素所处场景属于类型B的示例的生长规则示意图;

图19为本申请实施例提供的当前像素所处场景属于类型B的示例的生长规则示意图;

图20为本申请实施例提供的当前像素所处场景属于类型B的示例的生长规则示意图;

图21为本申请实施例提供的线条检测方法的实现流程示意图;

图22为本申请实施例提供的线条检测方法的实现流程示意图;

图23为本申请实施例提供的3*3的窗口示意图;

图24为本申请实施例提供的一种场景下的竖向线条生成规则示意图;

图25为本申请实施例提供的边缘图像的部分像素的示意图;

图26为本申请实施例提供的另一场景下的竖向线条生成规则示意图;

图27为本申请实施例提供的又一场景下的竖向线条生成规则示意图;

图28为本申请实施例提供的竖向线条检测方法的整体实现流程示意图;

图29为本申请实施例提供的类型B的示例示意图;

图30为本申请实施例提供的类型D的示例示意图;

图31为本申请实施例提供的横向线条检测方法的整体实现流程示意图;

图32为本申请实施例提供的线条检测装置的结构示意图;

图33为本申请实施例提供的线条检测装置的结构示意图;

图34为本申请实施例提供的芯片结构示意图;

图35为本申请实施例提供的电子设备的结构示意图;

图36为本申请实施例的电子设备的硬件实体示意图。

具体实施方式

为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请的具体技术方案做进一步详细描述。以下实施例用于说明本申请,但不用来限制本申请的范围。

除非另有定义,本文所使用的所有的技术和科学术语与属于本申请的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本申请实施例的目的,不是旨在限制本申请。

在以下的描述中,涉及到“一些实施例”、“本实施例”、“本申请实施例”以及举例等等,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。

需要指出,本申请实施例所涉及的术语“第一、第二、第三、第四”等是为了区别类似或不同的对象,不代表针对对象的特定排序,可以理解地,“第一、第二、第三、第四”等在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本申请实施例能够以除了在这里图示或描述的以外的顺序实施。

本申请实施例提供一种线条检测方法,该方法应用于电子设备,该电子设备在实施的过程中可以为各种类型的具有信息处理能力的设备,例如所述电子设备可以包括手机、平板电脑、个人计算机、电视机、投影仪、摄像机等。该方法所实现的功能可以通过电子设备中的处理器调用程序代码来实现,当然程序代码可以保存在计算机存储介质中,可见,该电子设备至少包括处理器和存储介质。

在本申请实施例中,提供两种线条类型的检测方法,这两种线条类型分别为第一类型的线条(即竖向线条)和第二类型的线条(即横向线条)。当然,在本申请实施例中所指的竖向线条并非是仅包括严格意义上的平行于像素坐标系的纵轴的线条,还包括与纵轴具有一定夹角的线条;同样地,所指的横向线条并非是仅包括严格意义上的平行于像素坐标系的横轴的线条,还包括与横轴具有一定夹角的线条。需要说明的是,本申请中所述的线条既可以是直线,也可以是曲线。

如下首先对第一类型的线条的检测方法进行说明,图1A为本申请实施例提供的竖向线条检测方法的实现流程示意图,如图1A所示,该方法可以包括以下步骤101至步骤103:

步骤101,确定与当前像素不同行的前级相邻像素存在步进记录;

其中,所述当前像素和具有所述步进记录的前级相邻像素为边缘像素,所述步进记录至少包括对应检测的线条的起点坐标、第一方向标记和第二方向标记,所述第一方向标记表示所述线条的线条类型为第一类型,所述第二方向标记用于表示所述线条的当前检测方向;其中,所述线条的当前检测方向并非是指像素的检测方向,而是理解为所述线条的当前生长方向;

步骤102,根据所述步进记录、以及具有所述步进记录的前级相邻像素与所述当前像素的位置关系,从所述当前像素和所述当前像素的下一行像素中,确定出待加入所述线条的目标像素;所述目标像素为边缘像素;即目标像素为该线条的新增像素,也可以理解为当前线条生长至该目标像素;

步骤103,基于确定所述目标像素为所述线条的终点,终止所述线条的生长,至少输出所述线条的起点坐标和终点坐标,继续进行线条检测。

在本申请实施例中,提供了一种线条检测方法,在该方法中,通过步进记录记录当前正在生长的线条是第一类型的线条还是第二类型的线条(即第一方向标记);在进行生长/检测时根据第一方向标记确定是采用第一类型的线条的检测规则还是第二类型的线条的检测规则;基于此,能够得到更为准确的线条检测结果,从而利于提升基于线特征的应用场景的性能。

以下分别对上述竖向线条检测方法/第一类型的线条的检测方法中的各个步骤的进一步的可选的实施方式以及相关名词等进行说明。

在步骤101中,确定与当前像素不同行的前级相邻像素存在步进记录;其中,所述步进记录至少包括对应检测的线条的起点坐标、第一方向标记和第二方向标记,所述第一方向标记表示所述线条的线条类型为第一类型,所述第二方向标记用于表示所述线条的当前检测方向;所述当前像素和具有所述步进记录的前级相邻像素为边缘像素。

需要说明的是,对应检测的线条也可以描述为当前正在生长的线条。可以理解地,线条检测的基本原理为按照某种搜索规则/检测规则对边缘图像中像素值进行遍历搜索,从而确定符合线条特征的边缘像素的连通域,将该连通域称为线条。基于此,当前正在生长的线条即为当前已确定的且未结束搜索的边缘像素的连通域。

可以理解地,所谓边缘图像,是指对原始图像进行边缘提取后得到的图像。通常将边缘定义为图像中灰度发生急剧变化的区域边界(边缘像素即为该区域边界上的像素),而灰度变化的情况可以用图像灰度分布的梯度来反映。例如,图1B所示,可以根据图像的sobel垂直梯度对原始图像(也即原图)111进行边缘检测,得到边缘图像114的部分边缘信息(即112中的白色像素),以及根据图像的sobel水平梯度对原始图像(也即原图)111进行边缘检测,得到边缘图像114的另一部分边缘信息(即113中的白色像素)。

第二方向标记用于表示当前正在生长/增长/检测的线条的当前生长/检测方向;该当前生长方向可以是具有所述步进记录的前级相邻像素与其所在线条上的前一边缘像素的相对方向;或者,该当前生长方向也可以是具有所述步进记录的前级相邻像素与其所在线条的起点的相对方向。

在本申请实施例中,所述前级相邻像素与执行步骤101的模块一次读取的数据大小有关。在一些实施例中,该模块获取第一窗口大小的边缘特征数据,所述边缘特征数据包括指示所述当前像素和所述当前像素的相邻像素是否是边缘像素的数值;其中,所述当前像素的相邻像素包括前级相邻像素和后级相邻像素。

那么,与当前像素不同行的前级相邻像素则为第一窗口内的像素。举例而言,如图2所示,假设在进行线条检测时对边缘图像是自上而下、从左到右扫描的,第一窗口的大小为3*3,图中的一个最小方格代表一个像素,像素o为当前像素;那么,与当前像素o不同行的前级相邻像素包括像素a、像素b和像素c;另外,像素d也是当前像素o的前级相邻像素;也就是说,当前像素的前级相邻像素是指与当前像素相邻的已被遍历/检测过的像素;“前级”可以理解为遍历/检测像素的时刻在当前像素之前。像素e、像素f、像素g和像素h是当前像素o的后级相邻像素;也就是说,当前像素的后级相邻像素是指与当前像素相邻的未被遍历/检测过的像素;“后级”可以理解为遍历/检测像素的时刻在当前像素之后。可见,当前像素的相邻像素包括像素a至像素h。

可以理解地,所谓前级相邻像素是指已经遍历过的像素(即已经被作为当前像素进行线条检测的像素),所谓后级相邻像素则是指还未被遍历的像素。

在本申请实施例中,无需缓存边缘图像整帧图像数据,而是基于第一窗口内的数据即可实现步骤101至步骤103;如此,一方面降低了线条检测方法硬件化实现的资源成本,无需使用较大容量的缓存器即可缓存用以实现步骤101至步骤103所需的数据;另一方面,由于在得到第一窗口大小的数据即可开始对边缘图像的线条检测,而无需等待边缘图像的整帧图像缓存完毕,因此提高了线条检测的效率。

在步骤102中,根据所述步进记录、以及具有所述步进记录的前级相邻像素与所述当前像素的位置关系,从所述当前像素和所述当前像素的下一行像素中,确定出待加入所述线条的目标像素;所述目标像素为边缘像素。

可以理解地,所谓目标像素即为可以作为正在生长的线条的下一生长点的像素,也就是能够加入该线条的像素。

在一些实施例中,可以这样实现步骤102:根据所述位置关系以及所述步进记录中的第一方向标记和第二方向标记,从所述当前像素的下一行像素中,确定候选像素;不同的所述第二方向标记和/或不同的所述位置关系,对应的候选像素不同;根据所述候选像素的边缘特征数据,确定所述目标像素;其中,所述边缘特征数据包括指示所述候选像素是否是边缘像素的数值;如此,由于不同的第二方向标记和/或不同的所述位置关系,对应的候选像素是不同的,而不是采用一致的候选像素,因此,整体上缩短了确定目标像素的速度,进而提升了线条检测效率。

举例而言,如图3所示,其中箭头是指第二方向标记表示的当前生长方向,

为了获得更为精准的竖向线条,在本申请实施例中,对于

对于

步骤1021a,根据所述第一方向标记和所述第二方向标记,从所述当前像素的下一行像素中,确定候选像素。

不同的第二方向标记,对于竖向线条检测而言,其对应的候选像素是不同的。由于在前文提到的图3中已经做了举例说明,因此这里不再赘述。

步骤1022a,确定所述候选像素中是否有至少一个像素为边缘像素;如果是,执行步骤1023a;否则,执行步骤1024a;

可以理解地,在具有所述步进记录的前级相邻像素在当前像素的正上方的情况下,步骤1021a和步骤1022a可以理解为先确定该线条是否可以向下生长,即下一行像素中作为候选像素的像素如果存在边缘像素,则优先往向下生长(即执行步骤1023a);如此,使得输出的竖向线条尽可能是和像素坐标系的纵轴相平行的,也就是尽可能地得到精度更高的竖线特征。

步骤1023a,从所述至少一个为边缘像素的候选像素中,确定出一个像素作为所述目标像素。

在为边缘像素的候选像素为两个或两个以上的情况下,可以从中选取任一候选像素作为目标像素;也可以按照预先定义的选择策略进行目标像素的选择。

示例性地,如果当前像素的正下方的像素(是指候选像素)为边缘像素,优先将该像素作为目标像素;如果当前像素的左下方和右下方的像素(是指候选像素)均为边缘像素,优先将其中与当前生长方向一致的相对方向的像素作为目标像素;其中,该相对方向是指左下方或右下方。

当然,在边缘像素的候选像素为一个的情况下,将该像素作为目标像素。

步骤1024a,确定所述当前像素的水平右相邻像素是否为边缘像素;如果是,执行步骤1025a;否则,执行步骤1026a;

步骤1025a,终止所述线条的生长,将具有所述步进记录的前级相邻像素作为所述线条的终点,至少输出所述线条的起点坐标和终点坐标;

步骤1026a,终止所述线条的生长,将所述当前像素作为所述目标像素以及作为所述线条的终点。

可以理解地,在本申请实施例中,优先判断自当前像素是否可以往下生长;如果不可以往下生长,则判断自当前像素是否可以往右生长,即确定当前像素的水平右相邻像素是否为边缘像素;如果可以往右生长,则终止线条的生长,此时不是将当前像素作为该线条的终点,而是将具有步进记录的前级相邻像素作为该线条的终点;如果不可以往右生长,才将当前像素作为线条的终点;如此,使得竖向线条不占用横向线条的像素,得到的竖向线条精度更高。

对于

步骤1021b,根据所述第一方向标记和所述第二方向标记,从所述当前像素的下一行像素中,确定候选像素。

举例而言,如图7所示,其中箭头是指第二方向标记表示的当前生长方向,

对应的候选像素为P4、P5和P6。与

步骤1022b,确定所述候选像素中是否有至少一个像素为边缘像素;如果是,执行步骤1023b;否则,执行步骤1024b;

步骤1023b,从所述至少一个为边缘像素的候选像素中,确定出一个像素作为所述目标像素。

可以理解地,在具有所述步进记录的前级相邻像素在当前像素的左上方的情况下,步骤1021b和步骤1022b也是先确定该线条是否可以向下生长,即下一行像素中作为候选像素的像素如果存在边缘像素,则优先往向下生长(即执行步骤1023b);如此,使得输出的竖向线条与像素坐标系的纵轴的夹角尽可能地小,即尽可能地使输出的竖向线条接近垂直于像素坐标系的横轴,得到精度更高的竖线特征。

步骤1024b,确定所述当前像素是否可以作为目标像素;如果是,执行步骤1025b;否则,执行步骤1026b;

步骤1025b,终止所述线条的生长,将所述目标像素作为所述线条的终点;

步骤1026b,终止所述线条的生长,将具有所述步进记录的前级相邻像素作为所述线条的终点,至少输出所述线条的起点坐标和终点坐标。

对于

步骤1021c,确定所述当前像素的水平右相邻像素是否为非边缘像素;如果是,执行步骤1022c;否则,执行步骤1028c;

步骤1022c,根据所述第一方向标记和所述第二方向标记,从所述当前像素的下一行像素中,确定候选像素;

步骤1023c,确定所述候选像素中是否有至少一个像素为边缘像素;如果是,执行步骤1024c;否则,执行步骤1025c;

即,基于确定所述当前像素的水平右相邻像素和所述当前像素的下一行像素均为非边缘像素,执行步骤1025c。

步骤1024c,从所述至少一个为边缘像素的候选像素中,确定出一个像素作为所述目标像素。

在本申请实施例中,对于

步骤1025c,确定所述当前像素是否可作为目标像素;如果是,执行步骤1026c;否则,执行步骤1027c;

也就是,基于确定所述当前像素的水平右相邻像素和所述当前像素的下一行像素均为非边缘像素,以及所述当前像素可作为目标像素,执行步骤1026c;

基于确定所述当前像素的水平右相邻像素和所述当前像素的下一行像素均为非边缘像素,以及所述当前像素不可作为目标像素,执行步骤1027c。

步骤1026c,终止所述线条的生长,将所述目标像素作为所述线条的终点;

步骤1027c,终止所述线条的生长,将具有所述步进记录的前级相邻像素作为所述线条的终点,至少输出所述线条的起点坐标和终点坐标;

步骤1028c,确定所述当前像素的下一行像素中是否有至少一个像素为边缘像素;如果是,执行步骤1027c;否则,执行步骤1020c;

即,基于确定所述当前像素的下一行像素中的任一像素和所述当前像素的水平右相邻像素均为边缘像素,执行步骤1029c;

基于确定所述当前像素的水平右相邻像素为边缘像素以及所述当前像素的下一行像素均为非边缘像素,执行步骤1020c。

步骤1029c,终止所述线条的生长,将具有所述步进记录的前级相邻像素作为所述线条的终点,至少输出所述线条的起点坐标和终点坐标。

步骤1020c,终止所述线条的生长,将具有所述步进记录的前级相邻像素作为所述线条的终点,至少输出所述线条的起点坐标和终点坐标。

对于

在步骤103中,基于确定所述目标像素为所述线条的终点,终止所述线条的生长,至少输出所述线条的起点坐标和终点坐标。

在本申请实施例中,对于终止线条生长的条件不做限定,可以是各种各样的。终止线条生长的条件可以是该线条上的边缘像素数目等于预设阈值,也可以是上述将目标像素作为线条的终点的条件。

在一些实施例中,所述方法还包括:基于确定所述目标像素不可作为所述线条的终点,生成所述目标像素的步进记录;以及确定所述线条的下一目标像素,直至确定出所述线条的终点为止。

在一些实施例中,对于第一类型的线条,在线条检测过程中,需生成构成线条的每一边缘像素的步进记录,其中包括该线条的起点和终点;这样,构成检测出的线条的每一边缘像素均记录有对应的步进记录/步进信息。对于线条的起点的步进记录,可以设置为初始值。可以理解,在确定线条的下一目标像素时(即当前时刻),前一时刻检测出的目标像素成为了当前像素的前级相邻像素,该像素的步进记录中至少记录了所在线条的起点坐标、第一方向标记和表示当前检测方向/该线条的当前生成方向的第二方向标记。

如下对横向线条的检测方法进行说明,图9为本申请实施例提供的横向线条检测方法的实现流程示意图,如图9所示,该方法可以包括以下步骤901至步骤903:

步骤901,确定与当前像素不同行的前级相邻像素存在步进记录;

其中,所述当前像素和具有所述步进记录的前级相邻像素为边缘像素,所述步进记录至少包括对应检测的线条的起点坐标、第一方向标记和第二方向标记,所述第一方向标记表示所述线条的线条类型为横向线条,所述第二方向标记表示所述线条的当前生长方向;

步骤902,在当前像素的水平左相邻像素和/或水平右相邻像素为非边缘像素的情况下,根据所述步进记录、以及具有所述步进记录的前级相邻像素与所述当前像素的位置关系,确定所述当前像素是否增加为所述线条的目标像素;如果是,执行步骤903;否则,结束生长,将具有所述步进记录的前级相邻像素作为所述线条的终点,输出该线条的起点坐标和终点坐标;

步骤903,基于确定所述当前像素增加为所述目标像素且满足线条终止条件,终止所述线条的生长,将所述当前像素作为所述线条的终点,输出所述线条的起点坐标和终点坐标。

在本申请实施例中,提供了一种线条检测方法,在该方法中,通过步进记录记录当前正在生长的线条是第一类型的线条还是第二类型的线条(即第一方向标记);在进行生长时根据第一方向标记确定是采用第一类型的线条的检测规则还是第二类型的线条的检测规则;基于此,能够得到更为准确的线条检测结果,从而利于提升基于线特征的应用场景的性能。

以下分别对上述横向线条检测方法/第二类型的线条的检测方法中的各个步骤的进一步的可选的实施方式以及相关名词等进行说明。

在步骤901中,确定与当前像素不同行的前级相邻像素存在步进记录。

需要说明的是,对于上述竖向线条而言,其线条上的每一像素都具有一个步进记录。而对于横向线条而言,并非其线条上的每个像素均对应有步进记录。如图10所示,对于同一行上的多个连续的边缘像素,可以仅在沿生长方向的末端设置一个步进记录。图10中

在一些实施例中,所述方法还包括:获取第二窗口大小的边缘特征数据,所述边缘特征数据包括指示所述当前像素和所述当前像素的相邻像素是否是边缘像素的数值;其中,所述当前像素的相邻像素包括前级相邻像素和后级相邻像素。关于第二窗口的说明可以参考上文对第一窗口的说明而理解。

在步骤902中,在当前像素的水平左相邻像素和/或水平右相邻像素为非边缘像素的情况下,根据所述步进记录、以及具有所述步进记录的前级相邻像素与所述当前像素的位置关系,确定所述当前像素是否增加为所述线条的目标像素。

横向线条的生长规则如下:

第一优先级:优先沿水平方向生长,直到不能生长;第二优先级:左上优先于右上;其中,第一优先级高于第二优先级。

横向线条检测方法相比于竖向线条检测方法较为复杂,根据当前像素的周围像素情况(其中当前像素为边缘像素),包括4种类型,如图11所示,即类型A至类型B。为增加方案的可读性,在图11中,

对于类型A(当前像素的水平左相邻像素和水平右相邻像素均为非边缘像素),如果与当前像素不同行的前级相邻像素存在步进记录,则根据所述步进记录、以及具有所述步进记录的前级相邻像素与所述当前像素的位置关系,确定所述当前像素是否增加为所述线条的目标像素。

具体地,如图12所示,基于确定当前像素的左上方的前级相邻像素存在步进记录,其余不同行的前级相邻像素为非边缘像素,以及步进记录记录的第一方向标记表示对应检测的线条为横向线条以及第二方向标记表示当前生长方向为水平方向(即水平指向的箭头)或水平左(即斜下指向的箭头),则确定当前像素可以增加为对应检测线条的目标像素。

又如图13所示,基于确定当前像素的右上方的前级相邻像素存在步进记录,其余不同行的前级相邻像素为非边缘像素,以及步进记录记录的横向线条检测和当前生长方向为水平方向(即水平指向箭头)或水平右(即斜下指向的箭头),则确定当前像素可以增加为对应检测线条的目标像素。

再如图14所示,基于确定所述当前像素的具有所述步进记录的前级相邻像素包括两个,且分别位于所述当前像素的两个对角方向(即一个在当前像素的左上方,另一个在当前像素的右上方),确定所述当前像素可增加为所述线条的目标像素,以及根据优先读取的前级相邻像素的步进记录,生成所述当前像素的步进记录。例如,从存储器中读取数据的顺序是从左到右,则根据当前像素的左上方前级相邻像素的步进记录生成当前像素的步进记录;反之,若从存储器中读取数据的顺序是从右到左,则根据当前像素的右上方前级相邻像素的步进记录生成当前像素的步进记录。

又如,基于确定所述当前像素的具有所述步进记录的前级相邻像素位于所述当前像素的垂直方向,终止所述线条的生长,将具有所述步进记录的前级相邻像素作为所述线条的终点,输出所述线条的起点坐标和终点坐标。若从存储器中读取数据的顺序是从上到下,如图15所示,该垂直方向上的具有步进记录的前级相邻像素位于当前像素的正上方,对于这种场景,则不支持生长,也就是将具有所述步进记录的前级相邻像素作为所述线条的终点,输出所述线条的起点坐标和终点坐标。

对于类型B(当前像素的水平左相邻像素为非边缘像素,当前像素的水平右相邻像素为边缘像素)或者类型D(当前像素的水平左相邻像素为边缘像素,当前像素的水平右相邻像素为非边缘像素),如果与当前像素不同行的前级相邻像素存在步进记录,则当前像素可以增加为目标像素,根据所述步进记录、以及具有所述步进记录的前级相邻像素与所述当前像素的位置关系,生成当前像素的步进记录。

进一步地,在一些实施例中,基于确定当前不满足线条终止条件以及所述目标像素为所在行的第一端点像素时,按照所述当前生长方向指向的水平方向,自所述第一端点像素搜索所述水平方向上的第二端点像素;其中,所述第一端点像素与所述第二端点像素连接的水平线上的像素均为边缘像素;

在与所述第二端点像素不同行的前级相邻像素具有步进记录的情况下,根据所述第二端点像素的前级相邻像素的步进记录,生成所述当前像素的步进记录,以及根据所述当前像素的前级相邻像素的步进记录,生成所述第二端点像素的步进记录;由此可见,本申请实施例提供的线条检测方法支持对交叉线的检测,从而对于提高应用场景的性能是有益的。

例如图16所示的场景,其中若从存储器中读取数据的顺序(即扫描方向)为从左至右,则第一端点像素可以理解为左端点,即Type(B)-Case(1)中或Type(B)-Case(2)中的

图16中的箭头表示当前生长方向,假设扫描方向是从左至右,则:当前生长方向指向的水平方向为水平向右;D继承左上的步进记录(即第二端点像素继承第一端点像素的左上前级相邻像素的步进记录);B继承右上的步进记录(即第一端点像素继承第二端点像素的右上前级相邻像素的步进记录)。

在一些实施例中,在与第二端点像素不同行的前级相邻像素不具有步进记录的情况下,根据所述当前像素的前级相邻像素的步进记录,生成所述第二端点像素的步进记录;以及在与第二端点像素不同行的前级相邻像素不具有步进记录,且与所述当前像素不同行的后级相邻像素为边缘像素的情况下,将所述第二端点像素作为新的线条的起点,生成所述当前像素的步进记录,用以记录所述新的线条的信息;其中,为边缘像素的所述后级相邻像素与所述当前像素的具有所述步进记录的前级相邻像素在同一列。在该实施例中,提供了支持另一种交叉线情况的检测方法。

例如图17所示的场景,对于第一端点像素和第二端点像素的理解,参考对图16中的左端点和右端点的说明而理解。图17中的箭头表示当前生长方向,假设扫描方向是从左至右,则:当前生长方向指向的水平方向为水平向右;对于左端点所在场景为Type(B)-Case(1)所示的场景,右端点所在场景为Type(D)-Case(3)或Type(D)-Case(4)所示的场景,D继承左上的步进记录(即第二端点像素继承第一端点像素的左上前级相邻像素的步进记录),以及对B(即第一端点像素)不做处理;对于左端点所在场景为Type(B)-Case(2)所示的场景,右端点所在场景为Type(D)-Case(3)或Type(D)-Case(4)所示的场景,D继承左上的步进记录,将D作为新线条的起点,生成B的步进记录,用以记录新线条的信息。

在一些实施例中,在与所述当前像素不同行的前级相邻像素不具有步进记录的情况下,将所述当前像素作为所在行的第一端点像素,按照线条检测方向指向的水平方向,自所述第一端点像素搜索所述水平方向上的第二端点像素;其中,所述第一端点像素与所述第二端点像素连接的水平线上的像素均为边缘像素;在与所述当前像素不同行的前级相邻像素不具有步进记录,以及所述第二端点像素不同行的前级相邻像素具有步进记录,以及与所述第二端点像素不同行的后级相邻像素为边缘像素的情况下,根据与所述第二端点像素不同行的前级相邻像素的步进记录,生成所述当前像素的步进记录;以及将所述当前像素作为新的线条的起点,生成所述第二端点像素的步进记录,用以记录所述新的线条的信息;其中,为边缘像素的所述后级相邻像素与所述第二端点像素的具有所述步进记录的前级相邻像素在同一列。在该实施例中,提供了支持又一种交叉线情况的检测方法。

举例而言,如图18所示的场景,对于第一端点像素和第二端点像素的理解,参考对图16中的左端点和右端点的说明而理解。假设扫描方向是从左至右,则:对于左端点所在场景为Type(B)-Case(3)或Type(B)-Case(4)所示的场景,右端点所在场景为Type(D)-Case(2)所示的场景,B继承右上的步进记录(左端点继承右端点的右上相邻像素的步进记录);B(左端点)作为新线条的起点,生成D(右端点)的步进记录,用于记录该新线条的信息。

在一些实施例中,在与所述第一端点像素不同行的前级相邻像素不具有步进记录,以及与所述第二端点像素不同行的前级相邻像素具有步进记录,以及与所述第二端点像素不同行的后级相邻像素为非边缘像素的情况下,根据与所述第二端点像素不同行的前级相邻像素的步进记录,生成所述当前像素的步进记录;其中,为非边缘像素的所述后级相邻像素与所述第二端点像素的具有所述步进记录的前级相邻像素在同一列。

例如图19所示的场景,对于第一端点像素和第二端点像素的理解,参考对图16中的左端点和右端点的说明而理解。假设扫描方向是从左至右,则:B(左端点)继承右上的步进记录,即左端点继承右端点的右上相邻像素的步进记录。

在一些实施例中,在与所述第一端点像素不同行的前级相邻像素不具有步进记录,以及与所述第二端点像素不同行的前级相邻像素不具有步进记录的情况下,将所述第二端点像素作为新的线条的起点,生成所述当前像素的步进记录,用以记录所述新的线条的信息;在与所述第一端点像素不同行的前级相邻像素不具有步进记录,以及与所述第二端点像素不同行的前级相邻像素不具有步进记录,以及与所述第二端点像素不同行的后级相邻像素为边缘像素的情况下,将所述当前像素作为新的线条的起点,生成所述第二端点像素的步进记录,用以记录所述新的线条的信息;其中,自所述第二端点像素至为边缘像素的所述后级相邻像素的方向与自所述当前像素至所述第二端点像素的方向的夹角小于90度。

例如图20所示的场景,对于第一端点像素和第二端点像素的理解,参考对图16中的左端点和右端点的说明而理解。对于左端点所在场景为Type(B)-Case(3)或Type(B)-Case(4)所示的场景,右端点所在场景为Type(D)-Case(3)所示的场景,B作为新线条的起点,生成D的步进记录,用以记录该新线条的信息。对于左端点所在场景为Type(B)-Case(4)所示的场景,右端点所在场景为Type(D)-Case(3)或Type(D)-Case(4)所示的场景,D作为新线条的起点,生成B的步进记录,用以记录该新线条的信息。

对于类型C(当前像素的水平左相邻像素和水平右相邻像素均为边缘像素),横向线条生长的第一优先级是水平方向生长,所以当一个边缘像素的水平左相邻像素和水平右相邻像素均为边缘像素时,就只可能是水平向左或者水平向右生长,可以不生成步进记录,对上方可能的三个具有步进记录的相邻像素都可以不用关注。

在步骤903中,基于确定所述当前像素增加为所述目标像素且满足终止条件,终止所述线条的生长,将所述当前像素作为所述线条的终点,输出所述线条的起点坐标和终点坐标。

基于此,如果边缘图像还未遍历完,则按照扫描顺序继续遍历下一像素,直至遍历完边缘图像中的所有边缘像素为止。

下面将说明本申请实施例在一个实际的应用场景中的示例性应用。

1、线条检测算法的整体流程描述如下:

图21为线条检测算法的整体流程实现示意图,如图21所示,包括如下步骤2101至步骤2107:

步骤2101,根据上一帧图像对当前帧图像进行直方图均衡(Histogram Statisticand Normalization),使得该图像的灰度均匀分布。该步骤为可选预处理,主要针对高光或阴暗环境,目标为使得图像增强对比度,使得边缘区域的梯度相较原始图像增加,从而更容易被边缘检测算法识别。

步骤2102,对步骤2101的输出图像进行低通滤波(Low Pass Filter)。该低通滤波采用的卷积核类型可以为高斯滤波(Gaussian Blur),目的是为了降低图像的高频噪声,并且使得边缘区域更加平滑,减少边缘毛刺。

步骤2103,对步骤2102的输出图像进行梯度计算(Gradient Calculation)。可以采用Sobel滤波器对该图像进行梯度计算,本质为梯度筛选,分为横向梯度筛选和纵向梯度筛选两个步骤,每一个像素的最终梯度值由横向梯度与纵向梯度的和或欧氏距离决定。

步骤2104,对步骤2103的输出结果进行非极大值抑制,以实现边缘细化(EdgeThinning)。可以采用NMS滤波器实现,该滤波器的工作原理为:对每一个像素,判断其是否相对上、下、左、右相邻像素为极大值,去除非极大值的边缘像素,使得图像梯度缓变区域的边缘像素宽度维持在单个像素,这对于后续的线条检测效果有一定的优化作用。

步骤2105,对步骤2104的输出结果进行双阈值滤波,设置边缘阈值(EdgeThreshold),包括高梯度阈值G2和低梯度阈值G1,当像素的梯度值大于G2时,保留该像素为边缘像素,当像素的梯度值小于G1时,不认为该像素为边缘像素,当像素的梯度值在G1和G2之间时,如果周围有已经被筛选为边缘像素的像素点,或有未判断像素的梯度值大于G1时,则认为该像素应当被认为是边缘。

步骤2106,根据步骤2105得到的结果进行Step-Length线条分割算法(Step LineSegmentation)。该算法将在下面展开详述,经过图像边缘检测得到的边缘图像(即步骤2105得到的结果)为该算法的输入,该算法的输出结果包括检测到的线条起始点的坐标、线条的终止点的坐标和线条的平均强度。

步骤2107,对步骤2106输出的线条分割结果进行重复线条去除(DuplicateRemoval)。即,遍历步骤2106输出的线条,当出现完全一样的线条或者首尾调换的线条时,应仅保留单一线条;当判断两条线条有足够接近的线条端点且方向偏差小于阈值时,应合并两条线条保留合并线条。

2、Step-Length核心算法细节描述:

对于Step-Length核心算法,如图22所示,其中在3*3的窗口(window)221中,区域222是动态记录步进信息的,该步进信息存储在FIFO 223中,该步进信息包括:起点的x坐标和起点的y坐标、ori方向标记(水平或垂直或未定义(horizontal or vertical orundef),也就是第一方向标记的一种示例)、pdir父节点方向标记(左或右或未定义(leftor right or undef),也就是第二方向标记的一种示例)、length(即线条的斜率表征)、cstep(在vertical方向连续生长的次数累计)、confidence sum(梯度的累加值)、pixelnum(像素点个数)、x index(记录一个record对应的x方向坐标)和line coordinates sum(直线重心表征)。输入边缘特征图是经过步骤2105处理之后的结果。Line info是线条生长算法的输出,包括:起点和终点坐标以及线条的平均强度(confidence)。对边缘特征图从左到右、从上到下扫描,一旦发现是边缘像素并且可以形成step_record,那么就会动态记录下来,同时推进横线(即第二类型的线条)和竖线(即第一类型的线条)的生长算法,满足line_end的条件,那么就会进入Line info的buffer,并通过AXI接口写到DDR中去。

以下在描述竖线和横线的生长算法之前,为了清楚理解本算法,附图中

3、对于竖线的生长算法细节描述如下:

对于竖线和横线的生长算法,其基本规则(Basic Rule)如下1)至4)中的描述:

1)一个像素,最多允许一个横向线条的步进记录(horizontal step-record)和一个竖向线条的步进记录(vertical step-record)。未定义的步进记录(Undef step-record)在确定是横向线条检测还是竖向线条检测之前,也放入竖向线条的步进记录中;

2)两个竖向线条交叉于一点,只能保留其中一条可以继续生长,另一条必然被打断;

3)一条竖向线条(vertical Line)和一条横向线条(horizontal Line)交叉,可以互不干涉地生长;

4)两条横向线条交叉,如果左/右方向相同,则必然会打断其中一条线条;如果左右方向不同,则需要根据实际情况来确定是否都能生长,具体参考下文对横向线条的生长算法的描述。

示例性地,3*3窗口的结构如图23所示,其中,P[i,j]为当前像素,R[i-1]、R[i]、R[i+1]和P[i-1,j]为P[i,j]的前级相邻像素(Precedent Regions,PRs),R[i-1]和R[i]为边缘像素;P[i+1,j]、P[i-1,j+1]、P[i,j+1]和P[i+1,j+1]为P[i,j]的后级相邻像素(Succeeding Points,SPs),P[i+1,j]、P[i,j+1]和P[i+1,j+1]为边缘像素。

对于边缘图像,扫描顺序从左到右,从上到下推进的过程中,和前级PRs比较的来确定步进记录是否需要刷新,和后级SPs比较来确定是否要终止这条线条的生长。

硬件实现时,步进记录需要刷新的场景如下:为了加快速度,有三条通道(path)并行处理,同时得出三条通道的结果。合计有6种生长的场景(case)。其生长优先级分别是A1>B1>C1>A2>B2>C2。

如图24所示,对于具有步进记录的前级相邻像素在当前像素的正上方的场景,包括如下步骤241至步骤244:

步骤241,确定自当前像素是否可以向下生长;如果是,执行步骤242;否则,执行步骤243;

步骤242,根据当前像素的正上方的相邻像素的步进记录,生成当前像素的下一行中可作为目标像素的步进记录;例如图24中所示的A1场景;如图25所示,假设读取的特征数据包括像素P1至像素P6的数据,其中P2为当前像素,确定目标像素的逻辑如下式(1)所示:

A1=(((pdir==undef)&(p4|p5|p6))||((pdir==left)&(p5|p6))||((pdir==right)&(p5|p4))) (1);

其中,pdir==undef表示当前生长方向为竖直向下,即图3所示的场景二;pdir==left表示当前生长方向为左下,即图3所示的场景一;pdir==right表示当前生长方向为右下,即图3所示的场景三。

步骤243,确定自当前像素是否可以向水平右生长;如果可以,不生长(例如图24中所示的不生长场景),将该正上方的相邻像素作为正在生长的线条的终点;否则,执行步骤244;

步骤244,将当前像素作为目标像素,根据其正上方的相邻像素的步进记录,生成当前像素的步进记录。例如图24中所示的A2场景,依然以图25为例,对于A2场景,确定目标像素的逻辑如下式(2)所示:

A2=(((pdir==undef)&~(p4|p5|p6)&~p3)||((pdir==left)&~(p5|p6)&~p3)||((pdir==right)&~(p5|p4))) (2);

如图26所示,对于具有步进记录的前级相邻像素在当前像素的左上方的场景,包括如下步骤261至步骤263:

步骤261,确定自当前像素是否可以向下生长;如果可以,则执行步骤262;否则,执行步骤263;

步骤262,根据当前像素的左上方的相邻像素的步进记录,生成当前像素的下一行中可作为目标像素的步进记录;例如图26中所示的B1场景,依然以图25为例,对于B1场景,确定目标像素的逻辑如下式(3)所示:

B1=(((pdir==undef)&(p4|p5|p6))||((pdir==left)&(p5|p6))) (3);

步骤263,确定当前像素是否可以作为目标像素;如果可以,执行步骤264;否则,不生长(例如图26中所示的不生长场景),将在当前像素的左上方的相邻像素作为正在生长的线条的终点;

步骤264,根据当前像素的左上方的相邻像素的步进记录,生成当前像素的步进记录;例如图26中所示的B2场景,依然以图25为例,对于B2场景,确定目标像素的逻辑如下式(4)所示:

B2=(((pdir==undef)&~(p4|p5|p6))||((pdir==left)&~(p5|p6))) (4);

如图27所示,对于具有步进记录的前级相邻像素在当前像素的右上方的场景,包括如下步骤271至步骤276:

步骤271,确定自当前像素是否可以向水平右生长;如果可以,不生长(例如图27中所示的不生长场景),将该具有步进记录的前级相邻像素作为对应线条的终点;否则,执行步骤272;

步骤272,确定自当前像素是否可以向下生长;如果可以,执行步骤273;否则,执行步骤274;

步骤273,根据当前像素的右上方的相邻像素的步进记录,生成当前像素的下一行中可作为目标像素的步进记录;例如图27中所示的C1场景,依然以图25为例,对于C1场景,确定目标像素的逻辑如下式(5)所示:

C1=(((pdir==undef)&(p4|p5|p6)&~(p3&(p5|p6)))||((pdir==right)&(p4|p5)&~(p3&(p5|p6)))) (5);

步骤274,确定自当前像素的水平右相邻像素向水平右生长;如果可以,不生长(例如图27中所示的对应场景),将当前像素的右上方的相邻像素作为对应线条的终点;否则,执行步骤275;

步骤275,确定当前像素是否可以作为目标像素;如果可以,执行步骤276;否则,不生长,将当前像素的右上方的相邻像素作为对应线条的终点;

步骤276,根据当前像素的右上方的相邻像素的步进记录,生成当前像素的步进记录;例如图27所示的对应场景C2,依然以图25为例,对于C2场景,确定目标像素的逻辑如下式(6)所示:

C2=(((pdir==right)&~(p4|p5)&~(p3&(p5|p6))) (6);

对于竖向线条检测的整体算法的实现流程,如图28所示,包括如下步骤281至步骤284:

步骤281,确定当前像素是否为边缘像素;如果是,执行步骤282;否则,结束对应线条的生长,继续遍历下一像素;

步骤282,确定是否可以生长为A1至C2中的至少一种;如果可以,执行步骤283;

步骤283,继承前级相邻像素的信息(即步进记录);然后进入步骤284;

步骤284,和后级相邻像素进行比较,以确定是否终止相应线条的生长;如果是,终止该线条的生长,输出该线条的相关信息;否则,继续遍历下一像素。

4、横向线条的生长算法细节描述如下:

横向线条的步进记录(step_record)包括图10所示的3种情况。对于垂直线(即竖向线条),线条上的每个像素都生成了一个步进记录。但是,对于水平线(即横向线条),并非线条上的每个像素都会有步进记录。对于同一水平线上的几个连续边缘像素,在行尾只会有一个步进记录。所谓行尾如图10所示,是指对于同一水平线上的几个连续像素中沿生长方向/检测方向上的末尾像素。

可以理解,对于第二类型的线条,也就是横向线条,在线条的检测过程中,对于检测出的线条的同一水平线上的几个连续像素,可以只生成首部或尾部(即行首或行尾)像素的步进记录。可以理解,在横向线条的检测方法中,所述的前级相邻像素在之前的某一时刻也是被检测出的目标像素,因此该前级相邻像素的步进记录的生成方法与目标像素的步进记录生成方法相同,步进记录中记录的第二方向标记可能是不同的。

在水平右或水平未定义的情况下,由于图像是从左向右传输的,因此与线的生长方向相反。遇到一个水平边缘像素的最左边的边缘像素,不知道往右生长会遇到什么样的情况。此时,将生成一个步进记录。首先在步进记录的FIFO中占据一个位置,记录下SRAM的地址。以后可以修改此步骤记录。它可能继承一个水平的右或未定义的步进记录,它可能是一个新的水平未定义的线条的左端,或者它可能被丢弃。

横线的生长规则如下:

1、第一优先级:优先沿水平方向生长,直到不能生长;

2.第二优先级:左上优先于右上。

横向情况更为复杂。首先,根据目前的像素情况,如图11所示,分4类来讨论,对于类型A和C,前文已经进行了详细介绍,这里不再对其进行描述。

对于类型B,如图29所示,例如分为case(1a)、case(1b)、case(2a)和case(2b)四种情况。这四种情况,当前像素的左上角或正上方的相邻像素有步进记录,且记录的当前生长方向为水平左(即斜向下箭头)或水平-未定义(即水平指向的箭头),则:

1)这两行可以增长,左上角的两个步进记录称为前级步进记录(previous step-record)。参考上面水平线的步进记录位置,当前像素不会直接继承之前的步进记录,所以需要暂时保存之前的步进记录。

2)生成一个暂时的步进记录(temporal step-record),记录索引,标记为无效,放入FIFO,同时用寄存器保存一份。如果这个水平边的最右端可以从上一行继承一个步进记录,或者如果需要从右到左新建一行,那么需要刷新这个暂时的步进记录,否则不需要更新时间步骤记录(已经无效的标签)。

对于类型D,如图30所示,例如分为case(1a)、case(1b)、case(2a)、case(2b)、case(3)和case(4)这6种情况。

对于横向线条检测的整体算法的实现流程,如图31所示,包括如下步骤311至步骤313:

步骤311,确定当前像素是否为边缘像素;如果是,执行步骤312;否则,结束对应线条的生长,继续遍历下一像素;

步骤312,如果当前像素的周围像素情况是类型A,按照类型A的生长规则进行生长;如果当前像素的周围像素情况是类型B,按照类型B的生长规则进行生长;如果当前像素的周围像素情况是类型C,按照类型C的生长规则进行生长;如果当前像素的周围像素情况是类型D,按照类型D的生长规则进行生长;

步骤313,和后级相邻像素进行比较,以确定是否终止相应线条的生长;如果是,终止该线条的生长,输出该线条的相关信息;否则,继续遍历下一像素。

上述线条检测算法可以在芯片做硬件实现,一帧图像的处理时间缩短至10ms,可以满足高帧率视频的匹配要求。

上述线条检测算法支持大部分的交叉线条场景,算法对于交叉线条的鲁棒性大幅度提升。

在本申请实施例中,提供了完备的横线和竖线的生长算法,以及横竖交叉的两个优化算法;其中,在扫描到横线左侧时先插入一个空step-record,在横线末尾补齐参数;横线和竖线检测分开处理,互不干涉,可以支持交叉。

本申请实施例再提供一种线条检测方法,包括:确定与当前像素不同行的前级相邻像素存在步进记录;其中,所述当前像素和具有所述步进记录的前级相邻像素为边缘像素,所述步进记录至少包括对应检测的线条的起点坐标、第一方向标记和第二方向标记,所述第一方向标记表示所述线条的线条类型,所述第二方向标记表示所述线条的当前生长方向;基于确定所述第一方向标记表示所述线条的线条类型为竖向线条,执行如前述实施例所述的竖向线条检测方法中的步骤;基于确定所述第一方向标记表示所述线条的线条类型为横向线条,执行如前述实施例所述的横向线条检测方法中的步骤。

需要说明的是,在本申请中,“生长”一词形象地描述了线条的检测过程,即通过检测/遍历搜索像素的像素值,从而从一个边缘像素逐步扩大/生长为具有一定长度的连通域/线条的过程。

应当注意,尽管在附图中以特定顺序描述了本申请中方法的各个步骤,但是,这并非要求或者暗示必须按照该特定顺序来执行这些步骤,或是必须执行全部所示的步骤才能实现期望的结果。附加的或备选的,可以省略某些步骤,将多个步骤合并为一个步骤执行,以及/或者将一个步骤分解为多个步骤执行等;或者,将不同实施例中步骤组合为新的技术方案。

基于前述的实施例,本申请实施例提供一种线条检测装置,该装置包括所包括的各模块、以及各模块所包括的各单元,可以通过处理器来实现;当然也可通过具体的逻辑电路实现;在实施的过程中,处理器可以为AI加速引擎(如NPU等)、GPU、中央处理器(CPU)、微处理器(MPU)、数字信号处理器(DSP)或现场可编程门阵列(FPGA)等等。

图32为本申请实施例提供的线条检测装置的结构示意图,如图32所示,线条检测装置320包括:

第三确定模块321,配置为确定与当前像素不同行的前级相邻像素存在步进记录;其中,所述当前像素和具有所述步进记录的前级相邻像素为边缘像素,所述步进记录至少包括对应检测的线条的起点坐标、第一方向标记和第二方向标记,所述第一方向标记表示所述线条的线条类型为第一类型,所述第二方向标记用于表示所述线条的当前检测方向;

第一确定模块322,配置为根据所述步进记录、以及具有所述步进记录的前级相邻像素与所述当前像素的位置关系,从所述当前像素和所述当前像素的下一行像素中,确定出所述线条的目标像素;所述目标像素为边缘像素;

第一输出模块323,配置为基于确定所述目标像素为所述线条的终点,至少输出所述线条的起点坐标和终点坐标。

在一些实施例中,第一确定模块322,配置为根据所述位置关系以及所述步进记录中的第一方向标记和第二方向标记,从所述当前像素的下一行像素中,确定候选像素;不同的所述第二方向标记和/或不同的所述位置关系,对应的候选像素不同;根据所述候选像素的边缘特征数据,确定所述目标像素;其中,所述边缘特征数据包括指示所述候选像素是否是边缘像素的数值。

在一些实施例中,第一确定模块322,配置为在所述位置关系为具有所述步进记录的前级相邻像素在所述当前像素的正上方的情况下,根据所述第一方向标记和所述第二方向标记,从所述当前像素的下一行像素中,确定候选像素;在至少一个所述候选像素为边缘像素的情况下,从所述至少一个为边缘像素的候选像素中,确定出一个像素作为所述目标像素。

在一些实施例中,第一确定模块322,配置为在每一所述候选像素均为非边缘像素的情况下,确定所述当前像素的水平右相邻像素是否为边缘像素;基于确定所述当前像素的水平右相邻像素为边缘像素,将具有所述步进记录的前级相邻像素作为所述线条的终点,通过第一输出模块323至少输出所述线条的起点坐标和终点坐标;基于确定所述当前像素的水平右相邻像素为非边缘像素,将所述当前像素作为所述目标像素以及作为所述线条的终点。

在一些实施例中,第一确定模块322,配置为在所述位置关系为具有所述步进记录的前级相邻像素在所述当前像素的左上方的情况下,根据所述第一方向标记和所述第二方向标记,从所述当前像素的下一行像素中,确定候选像素;在至少一个所述候选像素为边缘像素的情况下,从所述至少一个为边缘像素的候选像素中,确定出一个像素作为所述目标像素。

在一些实施例中,第一确定模块322,配置为在每一所述候选像素均为非边缘像素的情况下,确定所述当前像素是否可以作为目标像素;基于确定所述当前像素可作为所述目标像素,将所述目标像素作为所述线条的终点;基于确定所述当前像素不可作为所述目标像素,将具有所述步进记录的前级相邻像素作为所述线条的终点,通过第一输出模块323至少输出所述线条的起点坐标和终点坐标。

在一些实施例中,第一确定模块322,配置为在所述位置关系为具有所述步进记录的前级相邻像素在所述当前像素的右上方的情况下,基于确定所述当前像素的水平右相邻像素为非边缘像素,根据所述第一方向标记和所述第二方向标记,从所述当前像素的下一行像素中,确定候选像素;在至少一个所述候选像素为边缘像素的情况下,从所述至少一个为边缘像素的候选像素中,确定出一个像素作为所述目标像素。

在一些实施例中,第一确定模块322,配置为基于确定所述当前像素的下一行像素中的任一像素和所述当前像素的水平右相邻像素均为边缘像素,将具有所述步进记录的前级相邻像素作为所述线条的终点,通过第一输出模块323至少输出所述线条的起点坐标和终点坐标。

在一些实施例中,第一确定模块322,配置为基于确定所述当前像素的水平右相邻像素为边缘像素以及所述当前像素的下一行像素均为非边缘像素,将具有所述步进记录的前级相邻像素作为所述线条的终点,通过第一输出模块323至少输出所述线条的起点坐标和终点坐标;基于确定所述当前像素的水平右相邻像素和所述当前像素的下一行像素均为非边缘像素,以及所述当前像素可作为目标像素,将所述目标像素作为所述线条的终点;基于确定所述当前像素的水平右相邻像素和所述当前像素的下一行像素均为非边缘像素,以及所述当前像素不可作为目标像素,将具有所述步进记录的前级相邻像素作为所述线条的终点,通过第一输出模块323至少输出所述线条的起点坐标和终点坐标。

在一些实施例中,第一确定模块322,配置为基于确定所述目标像素不可作为所述线条的终点,生成所述目标像素的步进记录;以及确定所述线条的下一目标像素,直至确定出所述线条的终点为止。

在一些实施例中,线条检测装置320还包括数据获取模块,配置为:获取第一窗口大小的边缘特征数据,所述边缘特征数据包括指示所述当前像素和所述当前像素的相邻像素是否是边缘像素的数值;其中,所述当前像素的相邻像素包括前级相邻像素和后级相邻像素。

在一些实施例中,第一确定模块322,配置为在具有所述步进记录的前级相邻像素的数目大于1的情况下,针对具有步进记录的不同前级相邻像素,并行确定对应的线条的目标像素。

以上装置实施例的描述,与上述竖向线条检测的方法实施例的描述是类似的,具有同该方法实施例相似的有益效果。对于本申请装置实施例中未披露的技术细节,请参照本申请竖向线条检测的方法实施例的描述而理解。

本申请实施例再提供一种线条检测装置,图33为本申请实施例提供的线条检测装置的结构示意图,如图33所示,线条检测装置330包括:

第四确定模块331,配置为确定与当前像素不同行的前级相邻像素存在步进记录;其中,所述当前像素和具有所述步进记录的前级相邻像素为边缘像素,所述步进记录至少包括对应检测的线条的起点坐标、第一方向标记和第二方向标记,所述第一方向标记表示所述线条的线条类型为第二类型,所述第二方向标记表示所述线条的当前检测方向;

第二确定模块332,配置为在当前像素的水平左相邻像素和/或水平右相邻像素为非边缘像素的情况下,根据所述步进记录、以及具有所述步进记录的前级相邻像素与所述当前像素的位置关系,确定所述当前像素是否增加为所述线条的目标像素;

第二输出模块333,基于确定所述当前像素增加为所述目标像素且满足线条终止条件,将所述当前像素作为所述线条的终点,输出所述线条的起点坐标和终点坐标。

在一些实施例中,第二确定模块332,配置为:基于确定不满足所述线条终止条件以及所述目标像素为所在行的第一端点像素时,按照所述当前检测方向指向的水平方向,自所述第一端点像素搜索所述水平方向上的第二端点像素;其中,所述第一端点像素与所述第二端点像素连接的水平线上的像素均为边缘像素;在与所述第二端点像素不同行的前级相邻像素具有步进记录的情况下,根据所述第二端点像素的前级相邻像素的步进记录,生成所述当前像素的步进记录,以及根据所述当前像素的前级相邻像素的步进记录,生成所述第二端点像素的步进记录。

在一些实施例中,第二确定模块332,配置为:在与所述第二端点像素不同行的前级相邻像素不具有步进记录的情况下,根据所述当前像素的前级相邻像素的步进记录,生成所述第二端点像素的步进记录;以及在与所述第二端点像素不同行的前级相邻像素不具有步进记录,且与所述当前像素不同行的后级相邻像素为边缘像素的情况下,将所述第二端点像素作为新的线条的起点,生成所述当前像素的步进记录,用以记录所述新的线条的信息;其中,为边缘像素的所述后级相邻像素与所述当前像素的具有所述步进记录的前级相邻像素在同一列。

在一些实施例中,第二确定模块332,配置为:在与所述当前像素不同行的前级相邻像素不具有步进记录的情况下,将所述当前像素作为所在行的第一端点像素,按照线条检测方向指向的水平方向,自所述第一端点像素搜索所述水平方向上的第二端点像素;其中,所述第一端点像素与所述第二端点像素连接的水平线上的像素均为边缘像素;在与所述当前像素不同行的前级相邻像素不具有步进记录,以及所述第二端点像素不同行的前级相邻像素具有步进记录,以及与所述第二端点像素不同行的后级相邻像素为边缘像素的情况下,根据与所述第二端点像素不同行的前级相邻像素的步进记录,生成所述当前像素的步进记录;以及将所述当前像素作为新的线条的起点,生成所述第二端点像素的步进记录,用以记录所述新的线条的信息;其中,为边缘像素的所述后级相邻像素与所述第二端点像素的具有所述步进记录的前级相邻像素在同一列。

在一些实施例中,第二确定模块332,配置为:在与所述第一端点像素不同行的前级相邻像素不具有步进记录,以及与所述第二端点像素不同行的前级相邻像素具有步进记录,以及与所述第二端点像素不同行的后级相邻像素为非边缘像素的情况下,根据与所述第二端点像素不同行的前级相邻像素的步进记录,生成所述当前像素的步进记录;其中,为非边缘像素的所述后级相邻像素与所述第二端点像素的具有所述步进记录的前级相邻像素在同一列。

在一些实施例中,第二确定模块332,配置为:在与所述第一端点像素不同行的前级相邻像素不具有步进记录,以及与所述第二端点像素不同行的前级相邻像素不具有步进记录的情况下,将所述第二端点像素作为新的线条的起点,生成所述当前像素的步进记录,用以记录所述新的线条的信息。

在一些实施例中,第二确定模块332,配置为:在与所述第一端点像素不同行的前级相邻像素不具有步进记录,以及与所述第二端点像素不同行的前级相邻像素不具有步进记录,以及与所述第二端点像素不同行的后级相邻像素为边缘像素的情况下,将所述当前像素作为新的线条的起点,生成所述第二端点像素的步进记录,用以记录所述新的线条的信息;其中,自所述第二端点像素至为边缘像素的所述后级相邻像素的方向与自所述当前像素至所述第二端点像素的方向的夹角小于90度。

在一些实施例中,所述线条优先沿水平方向更新/生长,直到不能更新/生长。

在一些实施例中,第二确定模块332,配置为:在所述当前像素的水平左相邻像素和水平右相邻像素为非边缘像素的情况下,基于确定所述当前像素的具有所述步进记录的前级相邻像素位于所述当前像素的垂直方向,将具有所述步进记录的前级相邻像素作为所述线条的终点,通过第二输出模块333输出所述线条的起点坐标和终点坐标。

在一些实施例中,第二确定模块332,配置为:在所述当前像素的水平左相邻像素和水平右相邻像素为非边缘像素的情况下,基于确定所述当前像素的具有所述步进记录的前级相邻像素包括两个,且分别位于所述当前像素的两个对角方向,确定所述当前像素可增加为所述线条的目标像素,以及根据优先读取的前级相邻像素的步进记录,生成所述当前像素的步进记录。

在一些实施例中,线条检测装置330还包括获取模块,配置为获取第二窗口大小的边缘特征数据,所述边缘特征数据包括指示所述当前像素和所述当前像素的相邻像素是否是边缘像素的数值;其中,所述当前像素的相邻像素包括前级相邻像素和后级相邻像素。

以上对装置330的实施例的描述,与上述横向线条检测的方法实施例的描述是类似的,具有同该方法实施例相似的有益效果。对于本申请装置实施例中未披露的技术细节,请参照本申请横向线条检测的方法实施例的描述而理解。

需要说明的是,本申请实施例提供线条检测装置320与线条检测装置330可以是同一装置,也可以是不同装置;是同一装置时,第一确定模块321与第四确定模块331为同一模块,第一确定模块322与第二确定模块332为同一模块,第一输出模块323与第二输出模块333为同一模块;是不同装置时,各个模块互相独立,两个装置可以并行运行。

在本申请实施例中,对线条检测装置的模块划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。也可以采用软件和硬件结合的形式实现。

需要说明的是,本申请实施例中,如果以软件功能模块的形式实现上述的方法,并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得电子设备执行本申请各个实施例所述方法的全部或部分。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read Only Memory,ROM)、磁碟或者光盘等各种可以存储程序代码的介质。这样,本申请实施例不限制于任何特定的硬件和软件结合。

本申请实施例提供一种芯片,图34为本申请实施例提供的芯片结构示意图,如图34所示,芯片340包括处理器341和存储器342;其中,处理器341配置为执行本申请实施例所述的线条检测方法;存储器342,配置为存储所述处理器在执行线条检测方法的过程中所需的输入数据和输出数据。

本申请实施例提供一种电子设备,图35为本申请实施例提供的电子设备的结构示意图,如图35所示,电子设备350包括芯片340和电源模块341;其中,电源模块341用于为芯片340供电。

本申请实施例提供一种电子设备,图36为本申请实施例的电子设备的硬件实体示意图,如图36所示,所述电子设备360包括存储器361和处理器362,所述存储器361存储有可在处理器362上运行的计算机程序,所述处理器362执行所述程序时实现上述实施例中提供的方法中的步骤。

需要说明的是,存储器361配置为存储由处理器362可执行的指令和应用,还可以缓存在处理器362以及电子设备360中各模块待处理或已经处理的数据(例如,图像数据、音频数据、语音通信数据和视频通信数据),可以通过闪存(FLASH)或随机访问存储器(RandomAccess Memory,RAM)实现。

本申请实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述实施例中提供的方法中的步骤。

本申请实施例提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述方法实施例提供的方法中的步骤。

这里需要指出的是:以上存储介质和设备实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本申请存储介质、存储介质和设备实施例中未披露的技术细节,请参照本申请方法实施例的描述而理解。

应理解,说明书通篇中提到的“一个实施例”或“一实施例”或“一些实施例”意味着与实施例有关的特定特征、结构或特性包括在本申请的至少一个实施例中。因此,在整个说明书各处出现的“在一个实施例中”或“在一实施例中”或“在一些实施例中”未必一定指相同的实施例。此外,这些特定的特征、结构或特性可以任意适合的方式结合在一个或多个实施例中。应理解,在本申请的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。上文对各个实施例的描述倾向于强调各个实施例之间的不同之处,其相同或相似之处可以互相参考,为了简洁,本文不再赘述。

本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如对象A和/或对象B,可以表示:单独存在对象A,同时存在对象A和对象B,单独存在对象B这三种情况。

需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者设备中还存在另外的相同要素。

在本申请所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个模块或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或模块的间接耦合或通信连接,可以是电性的、机械的或其它形式的。

上述作为分离部件说明的模块可以是、或也可以不是物理上分开的,作为模块显示的部件可以是、或也可以不是物理模块;既可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部模块来实现本实施例方案的目的。

另外,在本申请各实施例中的各功能模块可以全部集成在一个处理单元中,也可以是各模块分别单独作为一个单元,也可以两个或两个以上模块集成在一个单元中;上述集成的模块既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。

本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(Read Only Memory,ROM)、磁碟或者光盘等各种可以存储程序代码的介质。

或者,本申请上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得电子设备执行本申请各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储设备、ROM、磁碟或者光盘等各种可以存储程序代码的介质。

本申请所提供的几个方法实施例中所揭露的方法,在不冲突的情况下可以任意组合,得到新的方法实施例。

本申请所提供的几个产品实施例中所揭露的特征,在不冲突的情况下可以任意组合,得到新的产品实施例。

本申请所提供的几个方法或设备实施例中所揭露的特征,在不冲突的情况下可以任意组合,得到新的方法实施例或设备实施例。

以上所述,仅为本申请的实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。

技术分类

06120115631501