CN117274364B - 基于OpenCV的区域面积计算方法、设备及存储介质 - Google Patents
基于OpenCV的区域面积计算方法、设备及存储介质 Download PDFInfo
- Publication number
- CN117274364B CN117274364B CN202311538103.9A CN202311538103A CN117274364B CN 117274364 B CN117274364 B CN 117274364B CN 202311538103 A CN202311538103 A CN 202311538103A CN 117274364 B CN117274364 B CN 117274364B
- Authority
- CN
- China
- Prior art keywords
- point
- area
- contour
- points
- node
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000004364 calculation method Methods 0.000 title claims description 26
- 238000000034 method Methods 0.000 claims abstract description 44
- 230000006870 function Effects 0.000 claims description 33
- 238000004590 computer program Methods 0.000 claims description 10
- 238000012216 screening Methods 0.000 claims description 6
- 238000010586 diagram Methods 0.000 description 13
- 238000004458 analytical method Methods 0.000 description 7
- 230000011218 segmentation Effects 0.000 description 6
- 238000004422 calculation algorithm Methods 0.000 description 5
- 238000012545 processing Methods 0.000 description 4
- 238000000547 structure data Methods 0.000 description 4
- 230000002093 peripheral effect Effects 0.000 description 2
- 238000012805 post-processing Methods 0.000 description 2
- 230000007704 transition Effects 0.000 description 2
- 230000001174 ascending effect Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 125000004122 cyclic group Chemical group 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T7/00—Image analysis
- G06T7/60—Analysis of geometric attributes
- G06T7/62—Analysis of geometric attributes of area, perimeter, diameter or volume
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T7/00—Image analysis
- G06T7/10—Segmentation; Edge detection
- G06T7/13—Edge detection
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02P—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN THE PRODUCTION OR PROCESSING OF GOODS
- Y02P90/00—Enabling technologies with a potential contribution to greenhouse gas [GHG] emissions mitigation
- Y02P90/30—Computing systems specially adapted for manufacturing
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Computer Vision & Pattern Recognition (AREA)
- General Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Geometry (AREA)
- Image Analysis (AREA)
Abstract
本申请公开了一种基于OpenCV的区域面积计算方法、设备及存储介质,方法包括:利用findContours函数获取目标图像区域的外轮廓和所述外轮廓包含的内轮廓,其中,所述内轮廓为孔洞的轮廓;确定所述外轮廓的面积和所述内轮廓的面积;基于所述外轮廓的面积和所述内轮廓的面积,确定所述目标图像区域的面积。本申请能够准确且快速地计算图像区域的面积。
Description
技术领域
本申请涉及图像处理技术领域,特别是涉及基于OpenCV的区域面积计算方法、设备及存储介质。
背景技术
在实际应用中,可以根据目标物与背景的灰度差异,对图像进行阈值分割得到二值化图像,在后处理阶段,可以利用OpenCV中的contourArea函数,得到连通区域的轮廓信息,之后利用这些轮廓信息进行对目标物更近一步的判断和筛选,比如面积、长、宽、周长等等。
但是,在利用OpenCV自带的contourArea函数计算面积时,由于contourArea函数在计算轮廓的面积时,是将轮廓中的边界像素点视为面积形状的顶点,并连接它们以形成封闭区域,进而可以按照格林公式进行计算,然而,该计算方法导致与区域真实的面积有差异。
发明内容
本申请提供了基于OpenCV的区域面积计算方法、设备及存储介质,能够提高地图构建的精准性。
第一方面,本申请提供一种基于OpenCV的区域面积计算方法,该方法包括:
利用findContours函数获取目标图像区域的外轮廓和外轮廓包含的内轮廓,其中,内轮廓为孔洞的轮廓;
确定外轮廓的面积和内轮廓的面积;
基于外轮廓的面积和内轮廓的面积,确定目标图像区域的面积。
其进一步的技术方案为,外轮廓包含的内轮廓的数量为0、1或多个,当外轮廓包含的内轮廓的数量为0时,则目标图像区域的面积为外轮廓的面积;
当外轮廓包含的内轮廓的数量为1个或多个时,基于外轮廓的面积和内轮廓的面积,确定目标图像区域的面积,包括:
确定内轮廓的周长,以及外轮廓与内轮廓之间的面积差;
将面积差与内轮廓的周长进行加和,得到目标图像区域的面积。
其进一步的技术方案为,确定外轮廓的面积,包括:
获取外轮廓中每一行起始点与每一行终止点分别对应的横坐标值;
基于所有终止点的横坐标值与所有起始点的横坐标值之间的差值进行加和,得到外轮廓的面积。
其进一步的技术方案为,获取外轮廓中每一行起始点与每一行终止点分别对应的横坐标值,包括:
获取外轮廓的轮廓点集,其中,轮廓点集包含多个轮廓点;
将每一轮廓点转换为对应的节点,其中,节点包括当前点、前相邻点和后相邻点;
基于当前点、前相邻点和后相邻点之间的位置关系,确定节点的类型,其中,节点的类型包括起始点、终止点和孤立点;
基于确定出的多个起始点和多个终止点,确定每一行起始点与每一行终止点分别对应的横坐标值。
其进一步的技术方案为,基于当前点、前相邻点和后相邻点之间的位置关系,确定节点的类型,包括:
在当前点、前相邻点和后相邻点的纵坐标值均相同时,若当前点的横坐标值小于后相邻点的横坐标值,则节点为起始点;否则节点为终止点;
在当前点、前相邻点和后相邻点的纵坐标值均不相同时,若后相邻点的纵坐标值大于前相邻点的纵坐标值,则节点为起始点;否则节点为终止点;
在当前点、前相邻点和后相邻点中任意两个纵坐标值相同时,则分别基于纵坐标值和横坐标值的比对,确定节点的类型。
其进一步的技术方案为,在当前点、前相邻点和后相邻点中任意两个纵坐标值相同时,则分别基于纵坐标值和横坐标值的比对,确定节点的类型,包括:
在当前点和前相邻点的纵坐标值相同时,若后相邻点的纵坐标值大于当前点的纵坐标值,且当前点的横坐标值小于前相邻点的横坐标值,则节点为起始点;否则节点为终止点;
在当前点和后相邻点的纵坐标值相同时,若前相邻点的纵坐标值小于当前点的纵坐标值,且当前点的横坐标值小于后相邻点的横坐标值,则节点为起始点;否则节点为终止点;
在前相邻点和后相邻点的纵坐标值相同时,若当前点的纵坐标值大于后相邻点的纵坐标值,且后相邻点的横坐标值大于等于前相邻点的横坐标值,则节点为孤立点。
其进一步的技术方案为,基于确定出的多个起始点和终止点,确定每一行起始点与每一行终止点分别对应的横坐标值,包括:
从确定出的多个起始点和终止点中筛选符合预设要求的目标起始点和目标终止点;
确定每一目标起始点与每一目标终止点分别对应的横坐标值。
其进一步的技术方案为,从确定出的多个起始点和终止点中筛选符合预设要求的目标起始点和目标终止点,包括:
若节点出现连续两个起始点加连续两个终止点的第一组合顺序时,则将第一组合顺序中间的起始点与终止点作为无效节点;和/或
在节点出现终止点先于起始点的第二组合顺序时,若第二组合顺序的起始点与第二组合顺序的起始点对应的后相邻点的当前点相同,则将第二组合顺序的起始点作为孤立点,且将第二组合顺序的起始点对应的后相邻点作为无效节点;
从确定出的多个起始点和终止点中筛除无效节点,得到符合预设要求的目标起始点和目标终止点。
第二方面,本申请提供了一种计算机设备,该计算机设备包括存储器及处理器,该存储器上存储有计算机程序,用于执行如本申请上述任一项方法的步骤。
第三方面,本申请还提供了一种计算机可读存储介质,该计算机可读存储介质存储有计算机程序,计算机程序在被处理器执行时,用于实现上述的基于OpenCV的区域面积计算方法。
本申请的有益效果是:区别于现有技术的情况,本申请通过利用findContours函数获取目标图像区域的外轮廓面积,由于外轮廓包围了目标区域,且findContours函数在计算轮廓面积时不会将最外层的边界像素点丢失,因此,可以提高区域面积计算的准确性,从而可以改善采用contourArea函数的相关做法因只考虑轮廓包围的凸包,而忽略了轮廓的外部边界导致容易丢失区域最外周的边界像素点,使得求得的面积比真实面积少的问题。
另外,由于图像区域中的图像是通过阈值分割出来的即二值化,在该过程中可能因为区域的灰度值和分割阈值导致区域出现孔洞,而本申请通过利用findContours函数获取外轮廓所包含的孔洞轮廓即内轮廓,并确定内轮廓的面积,根据外轮廓的面积和内轮廓的面积,进而当图像区域带有孔洞时,也可以准确且快速地确定出图像区域的面积。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。其中:
图1是本申请提供的基于OpenCV的区域面积计算方法第一实施例的流程示意图;
图2是当前点、前相邻点和后相邻点的位置示意图;
图3是当前点、前相邻点和后相邻点的位置示意图;
图4是当前点、前相邻点和后相邻点的位置示意图;
图5是当前点、前相邻点和后相邻点的位置示意图;
图6是当前点、前相邻点和后相邻点的位置示意图;
图7是当前点、前相邻点和后相邻点的位置示意图;
图8是当前点、前相邻点和后相邻点的位置示意图;
图9是当前点、前相邻点和后相邻点的位置示意图;
图10是当前点、前相邻点和后相邻点的位置示意图;
图11是当前点、前相邻点和后相邻点的位置示意图;
图12是本申请提供的基于OpenCV的区域面积计算方法第一实施例的结构示意图;
图13是本申请提供的计算机可读存储介质一实施例的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述。可以理解的是,此处所描述的具体实施例仅用于解释本申请,而非对本申请的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本申请相关的部分而非全部结构。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
在本文中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本申请的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域技术人员显式地和隐式地理解的是,本文所描述的实施例可以与其它实施例相结合。
在实际应用中,可以根据目标物与背景的灰度差异,对图像进行阈值分割得到二值化图像,在后处理阶段,可以利用OpenCV中的contourArea函数,得到连通区域的轮廓信息,之后利用这些轮廓信息进行对目标物更近一步的判断和筛选,比如面积、长、宽、周长等等。
但是,在利用OpenCV自带的contourArea函数计算面积时,由于contourArea函数在计算轮廓的面积时,是将轮廓中的边界像素点视为面积形状的顶点,并连接它们以形成封闭区域,进而可以按照格林公式进行计算,然而,该计算方法导致与区域真实的面积有差异。
示例性地,contourArea函数在计算轮廓面积时是使用使用格林公式,具体的计算可以参考以下:
。
其中,格林公式的应用是需要满足条件:封闭且正向、被积函数在D上是连续。
由于contourArea函数会将连通域边界像素中心点连接起来形成一个轮廓,而像素点只能表示为离散的点,将相邻的像素点直接连接起来形成的轮廓可能不完全覆盖边界上的像素点,轮廓边界像素点没有完全被连通起来,那么最外层的边界像素点可能会被忽略,从而导致计算得到的面积比实际面积小一圈。
示例性地,当连通区域只有两个像素点时,使用contourArea函数计算出的面积为0,而实际面积为2。
当连通区域的长宽均为4时,使用contourArea函数计算出的面积为9.而实际面积为16。
即使用contourArea函数计算轮廓面积时,会导致计算得到的面积比实际面积小。
因此,为了解决现有技术中因采用contourArea函数计算轮廓的面积导致计算出的面积与区域真实的面积有差异,不准确的技术问题,本申请提供了一种基于OpenCV的区域面积计算方法,具体参阅以下实施例。
下面对本申请提供的基于OpenCV的区域面积计算方法进行详细的介绍。具体请参阅图1,图1是本申请提供的基于OpenCV的区域面积计算方法第一实施例的流程示意图。方法应用于处理器,方法包括:
步骤101:利用findContours函数获取目标图像区域的外轮廓和外轮廓包含的内轮廓。
其中,内轮廓为孔洞的轮廓,外轮廓代表目标图像区域的边界,在OpenCV中外轮廓是按照逆时针排列,内轮廓是按照顺时针排列。通常,一个目标图像区域对应一个外轮廓,可以利用findContours函数使用循环遍历的方式获取目标图像区域包含的每一外轮廓点的坐标,创建一个空的轮廓点集合即轮廓点集P(Point),用来存储所有的外轮廓点。
其中,在遍历外轮廓点的过程中,将每个点的坐标添加到轮廓点集合后,可以使用列表(List)或数组等数据结构来保存轮廓点集P(Point)。
在一些实施例中,可以通过设置OpenCV的检索模式来决定获取的轮廓种类。其中,OpenCV的检索模式可以包括CV RETR EXTERNAL、CV_RETR LIST、CV RETR TREE。
比如CV RETR EXTERNAL:只检测最外围轮廓即外轮廓,包含在外围轮廓内的内轮廓则被忽略。
CV_RETR LIST:检测所有的轮廓,包括外轮廓和内轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系。
CV RETR TREE:检测所有轮廓,所有轮廓建立一个等级树结构。外轮廓包含内轮廓,内轮廓还可以继续包含内嵌轮廓等。
其中,OpenCV的检索模式可以根据实际需要进行调整设置。
另外,需要说明的是,在利用findContours函数获取目标图像区域的外轮廓和外轮廓包含的内轮廓时,可以根据OpenCV中的层级结构数据区分内轮廓和外轮廓。
具体可以是当层级结构数据的H参数中第3个数值不为-1时,则为外轮廓;当层级结构数据的H参数中第4个数值不为-1时,则为内轮廓。
示例性地,比如H参数为[-1,-1,1,-1],则可以认为是外轮廓;比如H参数为[-1,-1,-1,0],则可以认为是内轮廓。
步骤102:确定外轮廓的面积和内轮廓的面积。
可以通过根据外轮廓点的相关坐标值进行相应的运算进而得到外轮廓的面积,而由于在OpenCV中外轮廓是按照逆时针排列,内轮廓是按照顺时针排列,因此,内轮廓的面积计算方式可以参考外轮廓的面积计算方式。
如果存在多个内轮廓,则需要分别计算每个内轮廓的面积,并将它们累加得到总的内轮廓面积。
步骤103:基于外轮廓的面积和内轮廓的面积,确定目标图像区域的面积。
其中,当外轮廓不包含内轮廓时,则目标图像区域的面积为外轮廓的面积,当外轮廓包含内轮廓时,说明该目标图像区域出现孔洞,孔洞是指在目标物体内部存在的空洞或空心区域,因此,可以先计算孔洞的面积,比如基于内轮廓的面积可以得到孔洞的面积,再将外轮廓的面积和内轮廓的面积进行相应运算,得到目标图像区域的面积。
虽然在OpenCV中,也可以间接得到区域的真实面积,比如先生成一张空图,再利用drawContours函数和countNonZero函数计算面积,虽然该方法可以提高面积计算的准确性,但是该方法不仅比较繁琐而且耗时,并且在遇到带孔洞区域时,该方法的计算步骤会更加复杂。
因此该实施例通过利用findContours函数获取目标图像区域的外轮廓面积,由于外轮廓包围了目标区域,且findContours函数在计算轮廓面积时不会将最外层的边界像素点丢失,因此,可以提高区域面积计算的准确性,从而可以改善采用contourArea函数的相关做法因只考虑轮廓包围的凸包,而忽略了轮廓的外部边界导致容易丢失区域最外周的边界像素点,使得求得的面积比真实面积少的问题。
另外,由于图像区域中的图像是通过阈值分割出来的即二值化,在该过程中可能因为区域的灰度值和分割阈值导致区域出现孔洞,而本申请通过利用findContours函数获取外轮廓所包含的孔洞轮廓即内轮廓,并确定内轮廓的面积,根据外轮廓的面积和内轮廓的面积,进而当图像区域带有孔洞时,也可以准确且快速地确定出图像区域的面积。
对于第一实施例中各个步骤的具体实施方式,可以结合参考以下实施例。
比如,在一些实施例中,确定外轮廓的面积可以通过以下步骤:
步骤1021:获取外轮廓中每一行起始点与每一行终止点分别对应的横坐标值。
具体地,在一些实施例中,步骤1021可以采用以下流程:
1)获取外轮廓的轮廓点集,其中,轮廓点集包含多个轮廓点。
2)将每一轮廓点转换为对应的节点,其中,节点包括当前点、前相邻点和后相邻点。
示例性地,可以将轮廓点集P(Point)按照PointNode的节点结构依次改写一遍,具体可以参考以下:
structPointNode
{
cv::PointcurrentPoint;
cv::PointprePoint;
cv::PointnextPoint;
}。
其中currentPoint表示当前点,prePoint表示相邻的前一个点即前相邻点,nextPoint表示相邻的后一个点即后相邻点,通过改写以将每一轮廓点转换为对应的节点,最后得到所有轮廓点分别对应的节点。
3)基于当前点、前相邻点和后相邻点之间的位置关系,确定节点的类型,其中,节点的类型包括起始点、终止点和孤立点。
其中,可以按照节点的currentPoint纵坐标y值递增的顺序,依次将每行的轮廓点对应的节点保存起来,如果某个节点的prePoint和nextPoint都处在同一行,即y值相同,则该节点不保存。
由于节点的prePoint和nextPoint都处在同一行,即y值相同,则它们之间的连线可以被视为是该行与相邻两行之间的交界线。在轮廓线上,与交界线相交的节点通常是轮廓线真正的关键点,而与交界线平行的节点则可能只是过渡点或中间节点,如果将这些过渡点或中间节点也保存下来,可能会对路径规划或地图连通性分析等任务产生干扰或误导,因此该节点不保存。
另外,可以根据当前点、前相邻点和后相邻点三者的纵坐标值y的关系(比如三者的y值相同,三者的y值均不相同、三者中的两个y值相同),对上述保存好的节点进行分类,以确定每个节点对应的类型,其中,具体可以参考3-1)至3-3)以及图2至图,图2至图中的圆形表示节点pnd的currentPoint,三角形表示节点pnd的prePoint,正方形表示节点pnd的nextPoint,另外,图2至图中,从上往下表示y值逐渐递增,从左往右表示x值逐渐递增。
3-1)在当前点、前相邻点和后相邻点的纵坐标值均相同时,若当前点的横坐标值小于后相邻点的横坐标值,则节点为起始点;否则节点为终止点;
其中,当节点pnd的currentPoint、prePoint、nextPoint均在同一行时,表示三者的y值相同。
具体地,如图2所示,图2中的圆形、三角形和正方形都位于同一行,表示,表示节点pnd的currentPoint、prePoint、nextPoint三者的y值相同。另外,三角形和正方形在同一列,表示prePoint、nextPoint的纵坐标值x相同,圆形在三角形和正方形的左边,表示currentPoint的纵坐标值x小于prePoint、nextPoint的纵坐标值x,即图2中的currentPoint的x值小于nextPoint的x值时,可以认为该节点pnd是起始点。
如图3所示,圆形在三角形和正方形的右边,表示currentPoint的纵坐标值x大于prePoint、nextPoint的纵坐标值x,因此可认为该节点pnd是终止点。
3-1)的代码如下:
if((pnd.nextPoint.x==pnd.prePoint.x))
{
if(pnd.currentPoint.x<pnd.nextPoint.x)
{
IsStartPoint=true;
}
else
{
IsEndPoint=true;
}
}。
3-2)在当前点、前相邻点和后相邻点的纵坐标值均不相同时,若后相邻点的纵坐标值大于前相邻点的纵坐标值,则节点为起始点;否则节点为终止点。
其中,当节点pnd的currentPoint、prePoint、nextPoint均不在同一行时,表示三者的y值均不相同。
如图4所示,三角形在圆形上面,圆形在正方形上面,表示prePoint的y值小于currentPoint的y值小于nextPoint的y值,即nextPoint的y值大于prePoint的y值,因此该节点pnd是起始点。
如图5所示,正方形在三角形上面,表示nextPoint的y值小于prePoint的y值,因此该节点pnd是终止点。
3-2)代码如下:
if(pnd.nextPoint.y>pnd.prePoint.y)
{
IsStartPoint=true;
}
else
{
IsEndPoint=true;
}。
3-3)在当前点、前相邻点和后相邻点中任意两个纵坐标值相同时,则分别基于纵坐标值和横坐标值的比对,确定节点的类型。
3-3-1)在前相邻点和后相邻点的纵坐标值相同时,若当前点的纵坐标值大于后相邻点的纵坐标值,且后相邻点的横坐标值大于等于前相邻点的横坐标值,则节点为孤立点。
其中,当节点pnd的prePoint、nextPoint在同一行,表示二者y值相同,但与currentPoint的y值不相同。
如图6所示,三角形和正方形在同一行,均位于圆形上面,且从左往右依次为三角形、圆形和正方形,表示prePoint的x值小于currentPoint的x值小于nextPoint的x值,nextPoint的y值与prePoint的y值相同,均小于currentPoint的y值。
即满足currentPoint的y值大于nextPoint的y值,且同时nextPoint的x值大于等于prePoint的x值的情况,因此可以认为此节点pnd是孤立点。
参照上述附图的分析,可知图7中,currentPoint的y值小于nextPoint的y值,且同时nextPoint的x值小于等于prePoint的x值,则认为此节点pnd是孤立点。
3-3-1)代码如下:
if(pnd.currentPoint.y>pnd.nextPoint.y)
{
if(pnd.nextPoint.x>=pnd.prePoint.x)
{
IsIsolatePoint=true;
}
}
else(pnd.currentPoint.y<pnd.nextPoint.y)//<
{
if(pnd.nextPoint.x<=pnd.prePoint.x)
{
IsIsolatePoint=true;
}
}。
3-3-2)在当前点和后相邻点的纵坐标值相同时,若前相邻点的纵坐标值小于当前点的纵坐标值,且当前点的横坐标值小于后相邻点的横坐标值,则节点为起始点;否则节点为终止点。
其中,当节点pnd的currentPoint、nextPoint在同一行,表示两者y值相同,但与prePoint的y值不相同。
参阅图8,可知prePoint的y值小于currentPoint的y值,同时currentPoint的x值小于nextPoint的x值,则认为节点pnd是起始点。
参阅图9,可知prePoint的y值大于currentPoint的y值,同时currentPoint的x值大于nextPoint的x值,则认为节点pnd是终止点。
3-3-2)代码如下:
if(pnd.prePoint.y<pnd.currentPoint.y)
{
if(pnd.nextPoint.x>pnd.currentPoint.x)
IsStartPoint=true;
}
else
{
if(pnd.nextPoint.x<pnd.currentPoint.x)
IsEndPoint=true;
}。
3-3-1)在当前点和前相邻点的纵坐标值相同时,若后相邻点的纵坐标值大于当前点的纵坐标值,且当前点的横坐标值小于前相邻点的横坐标值,则节点为起始点;否则节点为终止点。
其中,当节点pnd的currentPoint、prePoint在同一行,表示两者y值相同,但与nextPoint的y值不相同。
参阅图10,可知nextPoint的y值大于currentPoint的y值,同时currentPoint的x值小于prePoint的x值,则认为节点pnd是起始点。
参阅图11,可知nextPoint的y值小于currentPoint的y值,同时currentPoint的x值大于prePoint的x值,则认为节点pnd是终止点。
3-3-1)的代码如下:
if(pnd.nextPoint.y>pnd.currentPoint.y)
{
if(pnd.currentPoint.x<pnd.prePoint.x)
IsStartPoint=true;
}
else
{
if(pnd.currentPoint.x>pnd.prePoint.x)
IsEndPoint=true;
}。
4)基于确定出的多个起始点和多个终止点,确定每一行起始点与每一行终止点分别对应的横坐标值。
4-1)从确定出的多个起始点和终止点中筛选符合预设要求的目标起始点和目标终止点,具体如下:
(1)若节点出现连续两个起始点加连续两个终止点的第一组合顺序时,则将第一组合顺序中间的起始点与终止点作为无效节点。
其中,第一组合顺序可以为起始点-起始点-终止点-终止点,对于路径规划或地图连通性分析等应用场景,节点表示了地图上的位置,边表示了位置之间的连通关系,而起始点-起始点-终止点-终止点的情形意味着在地图上存在两条路径,它们都从起始点出发,经过一些节点后最终到达终止点。这样在计算路径时会出现问题,可能使得算法得出非预期的结果。因此,将中间的起始点-终止点转为无效节点,这些无效节点在后续的算法处理中会被忽略,不影响实际的计算结果,从而保证算法的正确性和可靠性。
(2)在节点出现终止点先于起始点的第二组合顺序时,若第二组合顺序的起始点与第二组合顺序的起始点对应的后相邻点的当前点相同,则将第二组合顺序的起始点作为孤立点,且将第二组合顺序的起始点对应的后相邻点作为无效节点。
示例性地,第二组合顺序为终止点-起始点,当起始点的后相邻点与当前起始点的当前点相同时,意味着这两个节点在地图上具有相同的位置。在路径规划或地图连通性分析等应用场景中,起始点通常表示出发点,而相邻后一节点表示下一个要到达的位置。如果这两个节点位置相同,那么该起始点实际上并没有连接到其他的有效节点上,可以被视为孤立点。
由于孤立点是与其他节点没有连接关系的单独存在的节点,在路径规划或地图连通性分析中,这些孤立点通常对结果没有影响,因为它们并不参与路径的计算或连通性的判断。因此,可以将视为孤立点的起始点及后相邻点作为无效节点,由于模型只需处理有效节点,不会将无效节点考虑在路径规划、地图连通性分析或其他相关任务的计算中,因此,可以减少计算开销和资源消耗,同时,通过排除孤立点,算法可以更准确地分析地图的连通性和路径的可行性,从而得到更可靠的结果,即提高算法的高效性和准确性。
除此之外,还有以下的第3种情况可以认为是无效节点。
(3)当孤立点位于起始点和终止点的中间时,由于路径规划或地图连通性分析的目的是找到起始点到终止点之间的有效路径,而位于起始点和终止点之间的孤立点对于计算有效路径或确定连通性并没有实际贡献,因此可以认为该孤立点是无效节点,后续不作考虑。
而当孤立点位于当前行的首尾位置时,因为首尾位置的孤立点通常表示起始点或终止点,在路径规划中,起始点和终止点是关键的起止位置,需要被纳入计算,因此,则认为该孤立点是有效的,需要将这些位于当前行首尾的孤立点视为有效节点可以确保起始点和终止点在路径规划中得到正常处理。
从确定出的多个起始点和终止点中筛除无效节点,得到符合预设要求的目标起始点和目标终止点。
也就是从所有的起始点和终止点中排除4-1)中上述三种特殊情况出现的无效节点,则剩下的即为符合预设要求的目标起始点和目标终止点。
4-2)确定每一目标起始点与每一目标终止点分别对应的横坐标值。
步骤1022:基于所有终止点的横坐标值与所有起始点的横坐标值之间的差值进行加和,得到外轮廓的面积,可以参考以下公式:
。
其中,cei是终止点的x坐标,csi是起始点的x坐标即横坐标值,需要注意的是,上述确定出的有效孤立点也需要代入公式进行计算,有效孤立点表示终止点和起始点相同,因此有效孤立点的面积为1。
步骤103:基于外轮廓的面积和内轮廓的面积,确定目标图像区域的面积。
由于目标图像区域中的图是通过二值化即阈值分割出来的,在该过程中,可能因目标图像区域的灰度值和分割阈值的关系,导致得到的二值化图像可能出现一些孔洞,因此,在计算目标图像区域的面积时,需要判断目标图像区域是否出现孔洞即判断外轮廓是否包含内轮廓。
当外轮廓包含的内轮廓的数量为0时,表示该目标图像区域不出现孔洞,因此,外轮廓的面积即为目标图像区域的面积,则可以直接采用以下公式:
。
当外轮廓包含内轮廓时,表示该目标图像区域出现孔洞,且包含的内轮廓的数量为孔洞的个数,一般地,一个外轮廓可以包含1个或多个内轮廓。
由于当孔洞被包含在物体内部时,如果不减去孔洞的面积,则会导致最终计算出来的面积比物体实际的面积大。因此,在目标图像区域出现孔洞的情况下,可以先确定内轮廓的周长,以及外轮廓与内轮廓之间的面积差;然后将面积差与内轮廓的周长进行加和,得到目标图像区域的面积,具体参考以下公式:
。
其中areaouter指外轮廓的面积,areainner指的是内轮廓的面积,Cinner指的是内轮廓的周长。
需要说明的是,在计算内轮廓面积的过程中多算了内轮廓的周长,具体可以参考以下:
findContour函数的检测原理:图像经过二值化处理,得到一张灰度值只有0和1的图像,轮廓出现在0和1的交界处,轮廓的位置是算在1上。其中,获取轮廓点具体可以是:先找到一个轮廓点p,在p的邻域找下一个轮廓点q,更新p的位置,一直重复该步骤,直到找到所有的轮廓点,并且每找一个轮廓点,则将该点位置做标记,防止重复遍历。
其中,灰度值只有0和1的图像中,1表示白色区域即图12中的W区域,0表示黑色区域即图12中的V区域(图12仅标出部分黑色区域),内轮廓(即图12中的B处)和外轮廓(即图12中的A处)均在白色区域和黑色区域的交界处,目标图像区域的面积为白色区域的面积。本申请在计算目标图像区域的面积时先分别计算外轮廓面积和内轮廓面积(即黑色区域的面积),然后在通过计算外轮廓面积与内轮廓面积的差值得到目标图像区域的面积。由于黑色区域上的内轮廓位置是应该算在白色区域和黑色区域交界处中的白色位置上的,但是在计算内轮廓面积(即黑色区域的面积)时,也将内轮廓位置(即内轮廓的周长)一起包含计算了,而黑色区域的真实面积是等于内轮廓的面积减内轮廓的周长,因此,本申请在计算黑色区域面积的过程中多算了内轮廓的周长。
即目标图像区域的面积本来是等于外轮廓面积与内轮廓面积的差值,但是由于在计算内轮廓面积的过程中多算了内轮廓的周长,使得在计算外轮廓面积减去内轮廓面积时多减了内轮廓的周长,因此需要在计算完面积差值时再加上内轮廓的周长,才为目标图像区域真实的面积。
该实施例通过利用findContours函数获取目标图像区域的外轮廓面积,由于外轮廓包围了目标区域,且findContours函数在计算轮廓面积时不会将最外层的边界像素点丢失,因此,可以提高区域面积计算的准确性,从而可以改善采用contourArea函数的相关做法因只考虑轮廓包围的凸包,而忽略了轮廓的外部边界导致容易丢失区域最外周的边界像素点,使得求得的面积比真实面积少的问题。
另外,由于图像区域中的图像是通过阈值分割出来的即二值化,在该过程中可能因为区域的灰度值和分割阈值导致区域出现孔洞,而本申请通过利用findContours函数获取外轮廓所包含的孔洞轮廓即内轮廓,并确定内轮廓的面积,根据外轮廓的面积和内轮廓的面积,进而当图像区域带有孔洞时,也可以准确且快速地确定出图像区域的面积。
本申请提供的电子设备包括存储器和处理器,其中,存储器上存储有计算机程序;处理器用于执行计算机程序时实现前述任意一个方法实施例提供的设备的解析方法的控制方法。
请参阅图13,图13是本申请提供的计算机可读存储介质一实施例的结构示意图,计算机可读存储介质90用于存储计算机程序91,计算机程序91在被处理器执行时,用于实现以下的方法步骤:
利用findContours函数获取目标图像区域的外轮廓和外轮廓包含的内轮廓,其中,内轮廓为孔洞的轮廓;确定外轮廓的面积和内轮廓的面积;基于外轮廓的面积和内轮廓的面积,确定目标图像区域的面积。
可以理解的,计算机程序91在被处理器执行时,还用于实现本申请中任一实施例的技术方案。
在本申请所提供的几个实施方式中,应该理解到,所揭露的方法以及设备,可以通过其它的方式实现。例如,以上所描述的设备实施方式仅仅是示意性的,例如,模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。
作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施方式方案的目的。
另外,在本申请各个实施方式中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
上述其他实施方式中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本申请各个实施方式方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,RandomAccessMemory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上仅为本申请的实施方式,并非因此限制本申请的专利范围,凡是利用本申请说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本申请的专利保护范围内。
Claims (6)
1.一种基于OpenCV的区域面积计算方法,其特征在于,所述方法包括:
利用findContours函数获取目标图像区域的外轮廓和所述外轮廓包含的内轮廓,其中,所述内轮廓为孔洞的轮廓;
确定所述外轮廓的面积和所述内轮廓的面积,其中,确定所述外轮廓的面积,包括:获取所述外轮廓的轮廓点集,其中,所述轮廓点集包含多个轮廓点;
将每一所述轮廓点转换为对应的节点,其中,所述节点包括当前点、前相邻点和后相邻点,所述节点的类型包括起始点、终止点和孤立点;
在所述当前点、所述前相邻点和所述后相邻点的纵坐标值均相同时,若所述当前点的横坐标值小于所述后相邻点的横坐标值,则所述节点为起始点;否则所述节点为终止点;
在所述当前点、所述前相邻点和所述后相邻点的纵坐标值均不相同时,若所述后相邻点的纵坐标值大于所述前相邻点的纵坐标值,则所述节点为起始点;否则所述节点为终止点;
在所述当前点和所述前相邻点的纵坐标值相同时,若所述后相邻点的纵坐标值大于所述当前点的纵坐标值,且所述当前点的横坐标值小于所述前相邻点的横坐标值,则所述节点为起始点;否则所述节点为终止点;
在所述当前点和所述后相邻点的纵坐标值相同时,若所述前相邻点的纵坐标值小于所述当前点的纵坐标值,且所述当前点的横坐标值小于所述后相邻点的横坐标值,则所述节点为起始点;否则所述节点为终止点;
在所述前相邻点和所述后相邻点的纵坐标值相同时,若所述当前点的纵坐标值大于所述后相邻点的纵坐标值,且所述后相邻点的横坐标值大于等于所述前相邻点的横坐标值,则所述节点为孤立点;
基于确定出的多个所述起始点和多个所述终止点,确定每一所述起始点与每一所述终止点分别对应的横坐标值;
基于所有所述终止点的横坐标值与所有所述起始点的横坐标值之间的差值进行加和,得到所述外轮廓的面积;
基于所述外轮廓的面积和所述内轮廓的面积,确定所述目标图像区域的面积。
2.根据权利要求1所述的方法,其特征在于,所述外轮廓包含的内轮廓的数量为0、1或多个;
当所述外轮廓包含的所述内轮廓的数量为0时,则所述目标图像区域的面积为所述外轮廓的面积;
当所述外轮廓包含的所述内轮廓的数量为1个或多个时,所述基于所述外轮廓的面积和所述内轮廓的面积,确定所述目标图像区域的面积,包括:
确定所述内轮廓的周长,以及所述外轮廓与所述内轮廓之间的面积差;
将所述面积差与所述内轮廓的周长进行加和,得到所述目标图像区域的面积。
3.根据权利要求1所述的方法,其特征在于,所述基于确定出的多个所述起始点和所述终止点,确定每一所述起始点与每一所述终止点分别对应的横坐标值,包括:
从所述确定出的多个所述起始点和所述终止点中筛选符合预设要求的目标起始点和目标终止点;
确定每一所述目标起始点与每一所述目标终止点分别对应的横坐标值。
4.根据权利要求3所述的方法,其特征在于,所述从所述确定出的多个所述起始点和所述终止点中筛选符合预设要求的目标起始点和目标终止点,包括:
若所述节点出现连续两个起始点加连续两个终止点的第一组合顺序时,则将所述第一组合顺序中间的所述起始点与所述终止点作为无效节点;和/或
在所述节点出现终止点先于起始点的第二组合顺序时,若所述第二组合顺序的起始点与所述第二组合顺序的起始点对应的后相邻点的当前点相同,则将所述第二组合顺序的起始点作为孤立点,且将所述第二组合顺序的起始点对应的所述后相邻点作为无效节点;
从所述确定出的多个所述起始点和所述终止点中筛除所述无效节点,得到符合预设要求的目标起始点和目标终止点。
5.一种计算机设备,其特征在于,所述计算机设备包括存储器及处理器,所述存储器上存储有计算机程序,所述处理器执行所述计算机程序时实现如权利要求1-4中任一项所述的方法。
6.一种计算机可读存储介质,其特征在于,所述存储介质存储有计算机程序,所述计算机程序当被处理器执行时可实现如权利要求1-4中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311538103.9A CN117274364B (zh) | 2023-11-17 | 2023-11-17 | 基于OpenCV的区域面积计算方法、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311538103.9A CN117274364B (zh) | 2023-11-17 | 2023-11-17 | 基于OpenCV的区域面积计算方法、设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117274364A CN117274364A (zh) | 2023-12-22 |
CN117274364B true CN117274364B (zh) | 2024-03-22 |
Family
ID=89202933
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311538103.9A Active CN117274364B (zh) | 2023-11-17 | 2023-11-17 | 基于OpenCV的区域面积计算方法、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117274364B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107220973A (zh) * | 2017-06-29 | 2017-09-29 | 浙江中烟工业有限责任公司 | 基于Python+OpenCV的六边形中空滤棒快速检测方法 |
CN115861368A (zh) * | 2022-11-10 | 2023-03-28 | 维库(厦门)信息技术有限公司 | 一种针对多类图像的多类轮廓跟踪方法、装置和介质 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2009037283A (ja) * | 2007-07-31 | 2009-02-19 | Ricoh Co Ltd | 画像処理装置及びこれを備えた画像読取装置、並びに、画像処理方法及び画像処理プログラム |
-
2023
- 2023-11-17 CN CN202311538103.9A patent/CN117274364B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107220973A (zh) * | 2017-06-29 | 2017-09-29 | 浙江中烟工业有限责任公司 | 基于Python+OpenCV的六边形中空滤棒快速检测方法 |
CN115861368A (zh) * | 2022-11-10 | 2023-03-28 | 维库(厦门)信息技术有限公司 | 一种针对多类图像的多类轮廓跟踪方法、装置和介质 |
Non-Patent Citations (2)
Title |
---|
Iris Location Algorithm Based on Separating the Inner and Outer Edges;Lu Jinhua et al;《Electric Power Science and Engineering》;20160828;第32卷(第8期);第65-69页 * |
基于扫描线方法的多边形面积公式自动获取算法;王谦 等;《工程勘察》;20200301(第3期);第45-48页 * |
Also Published As
Publication number | Publication date |
---|---|
CN117274364A (zh) | 2023-12-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11709058B2 (en) | Path planning method and device and mobile device | |
JP6972757B2 (ja) | 制御プログラム、制御方法、及び情報処理装置 | |
CN107945150B (zh) | 基因测序的图像处理方法及系统及计算机可读存储介质 | |
US20190206052A1 (en) | Carpal segmentation and recognition method and system, terminal and readable storage medium | |
Miranda et al. | Riverbed: A novel user-steered image segmentation method based on optimum boundary tracking | |
CN110390306B (zh) | 直角车位的检测方法、车辆和计算机可读存储介质 | |
KR101130963B1 (ko) | 형태와 특징 정보를 이용한 비정형 객체 추적 장치 및 그 방법 | |
CN103295227B (zh) | 一种基于梯度方向分割的圆检测方法 | |
CN114782499A (zh) | 一种基于光流和视图几何约束的图像静态区域提取方法及装置 | |
CN111932552B (zh) | 一种主动脉建模的方法及装置 | |
CN106204540A (zh) | 视觉检测方法 | |
CN115308770A (zh) | 一种基于拟合图形的动态障碍物检测方法 | |
CN109784328B (zh) | 定位条码的方法、终端及计算机可读存储介质 | |
CN117274364B (zh) | 基于OpenCV的区域面积计算方法、设备及存储介质 | |
CN111141768B (zh) | 原油驱替中岩石润湿性变化的获取方法及装置 | |
CN115937825B (zh) | 在线俯仰角估计的bev下鲁棒车道线生成方法及装置 | |
JP2005165969A (ja) | 画像処理装置、及び方法 | |
CN111178111A (zh) | 二维码检测方法、电子设备、存储介质及系统 | |
CN113516765B (zh) | 一种地图管理方法、地图管理装置及智能设备 | |
CN107615333B (zh) | 图像的斑点处理方法 | |
JP2021182243A (ja) | 画像判定装置、方法、及びプログラム | |
CN108492307B (zh) | 一种磁共振adc图像分割方法及使用该方法的磁共振系统 | |
KR20100009451A (ko) | 영상의 그라운드 라인 결정 방법 | |
KR102102369B1 (ko) | 정합 성능 추정 방법 및 장치 | |
CN111476821B (zh) | 基于在线学习的目标跟踪方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |