皮皮网

【斗牛手机源码】【下线 源码】【pe 源码】cvcircle函数源码_cv2.circle函数

2024-12-24 13:57:37 来源:aide打开源码

1.cvHoughCircles函数函数
2.关于QBASIC
3.cvHoughCircles函数参数
4.OpenCV函数:提取轮廓相关函数使用方法

cvcircle函数源码_cv2.circle函数

cvHoughCircles函数函数

       CvHoughCircles函数是函数函数OpenCV库中一个重要的图像处理函数,主要用于在图像中检测圆形结构。源码这个函数接收几个关键参数,函数函数帮助我们从输入图像中寻找可能的源码圆形对象。

       首先,函数函数参数"image"是源码斗牛手机源码一个CvArr类型的指针,它代表了待处理的函数函数图像数据。这个图像可以是源码灰度图像或者彩色图像,但函数通常在二值化或边缘检测后用于圆形检测。函数函数

       接下来是源码"circle_storage",它是函数函数一个CvSeq类型的指针,用于存储检测到的源码圆形信息,如圆心坐标和半径。函数函数这个存储结构预先分配了内存空间,源码以便于处理可能存在的函数函数多个圆形。

       "method"参数定义了霍夫变换的下线 源码方法,可以是HOUGH_GRADIENT(梯度霍夫变换)或HOUGH_LINEMOD(线性霍夫变换)。不同方法适用于不同的边缘检测和圆形检测场景。

       "dp"表示参数空间的步长,它影响检测的精度和计算效率。dp值越大,检测的圆可能更精确,但计算量也更大。

       "min_dist"表示最小距离参数,用于避免检测到的圆形过于密集。如果两个圆形中心间的距离小于这个值,会被视为同一个圆形。

       "param1"和"param2"是霍夫变换的阈值参数,它们共同控制了圆形边缘的强度和方向。调整这两个参数可以优化检测结果。

       "min_radius"和"max_radius"定义了搜索的pe 源码圆形半径范围。函数只会在这个范围内寻找可能的圆形,这对于减少计算量和提高效率非常有帮助。

       总结来说,CvHoughCircles函数通过一系列参数的调整,能够有效地从输入图像中检测和识别圆形,是图像分析和机器视觉中不可或缺的一部分。

关于QBASIC

       ABSy=ABS(n)得到n的绝对值

        ASCy=ASC(S$)得到字符串头一个字符的ASCII码

        ATNy=ATN(n)得到反正切值(单位是弧度)

        CDBLy=CDBL(n)把n转化为双精度浮点格式

        CHR$S$=CHR$(n)得到ASCII码n对应的字符

        CINTy=CINT(n)对n进行舍入取整(奇凑偶

        CLNGy=CLNG(n)把一个数n转化为长整数

        COMMAND$S$=COMMAND$在DOS下启动程序时,获得命令行中的其余信息

        COSy=COS(n)得到自变量n的余弦值

        CSNGy=CSNG(n)把一个数值转化为单精度数

        CSRLINy=CSRLIN返回光标行数位置

        CVIV%=CVI(2字节的串)字符串转换为整型数

        CVSV!=CVS(4字节的串)字符串转换为单精度数

        CVLV&=CVL(4字节的串)字符串转换为长整数

        CVDV#=CVD(8字节的串)字符串转换为双精度数

        CVSMBFV!=CVSMBF(4字节MS字符串)转换成IEEE格式单精度数

        CVDMBFV#=CVDMBF(8字节MS字符串)转换成IEEE格式双精度数

        DATE$S$=DATE$把系统日期赋给变量S$

        ENVIRON$S$=ENVIRON$(X$)

        S$=ENVIRON$(n)得到环境表中的参数

        EOFy=EOF(filenum)遇到文件结束则返回真,否则为假

        ERDEVy=ERDEV返回设备驱动器错误码

        ERDEV$S$=DEDEV$返回设备驱动器错误信息

        ERRy=ERR返回错误的错误号

        ERLy=ERL返回出错处最近的行号

        EXPy=EXP(X)指数函数y=ex

        FILEATTRy=FILEATTR(filenum,attr)返回打开文件的信息

        FIXy=FIX(n)截掉小数部分进行取整

        FREy=FRE({ S$|-1|-2})得到可以被程序使用的剩余内存空间的大小

        FREEFILEy=FREEFILE返回下一个自由BASIC文件号

        HEX$S$=HEX$(n)把十进制数转换成相应十六进制格式字符串

        INKEY$S$=INKEY$从键盘上读数据但不显示

        INPy=INP(portno)从一个I/O端口读入一个字节

        INPUT$S$=INPUT$(m[,[#]n])从键盘或文件中读入指定数量的字符

        INSTRy=INSTR([n,]targetstring, patternsttring)字符串查找

        INTy=INT(n)得到一个不大于n的最大整数

        IOCTL$S$=IOCTL$[#]n从一个设备驱动器程序接收数据

        LBOUNDy=LBOUND(array[,n])返回数组array第n维的最小下标

        LCASE$S$=LCASE$(X$)把字符串X$的大写字母全变为小写

        LEFT$S$=LEFT$(X$,n)得到字符串X$最左边的n个字符

        LENy=LEN(S$)得到字符串S$的长度

        LOCy=LOC(n)得到文件中现在所处的位置(当前位置)

        LOFy=LOF(n)得到磁盘文件的长度或通讯缓冲区剩余空间大小

        LOGy=LOG(x)自然对数y=InX

        LPOSy=LPOS(printer)得到打印缓冲区中当前的位置

        LTRIM$S$=LTRIM$(x$)返回去掉前导空格的字符串复制品

        MID$S$=MID$(X$,n[,m])从X$的第n个字符开始取m个字符;省略m,则取完

        MKD$S$=MKD$(V#)把双精度数值转化为随机文件中输出字符串

        MKI$S$=MKI$(V%)把整数转换为字符串

        MKL$S$=MKL$(V&)把长整数转换为字符串

        MKS$S$=MKS$(V!)把单精度数转换为字符串

        MKSMBF$S$=MKSMBF$(V!)把单精度数转换为MS格式字符串

        MKDMBF$S$=MKDMBF$(V#)把双精度数转换为MS格式字符串

        OCT$S$=OCT$(n)得到数值n的八进制形式字符串,负数为其补码形式

        PEEKy=PEEK(offset)得到指定存储单元的值

        PENy=PEN(option)读取光笔状态

        PLAYy=PLAY(x)得到后台音乐缓冲区音符个数

        PMAPy=PMAP(i,option)把图形屏幕的物理坐标变为实用坐标或反之

        POINTcolor=POINT(x,y)

        y=POINT(n)得到一个象素的颜色

        得到前一个点的坐标

        POSy=POS(x)得到光标的列数位置

        RIGHT$S$=RIGHT$(x$,n)从字符串X$的右边取n个字符

        RNDy=RND(n)得到0到1之间的随机数,n=0则得到前一个RND值

        RTRIM$S$=RTRIM$(X$)返回一个去掉X$尾随空格的字符串

        SADDy=SADD(S$)返回S$字符串的地址

        SCREENy=SCREEN(row,column[,option])得到屏幕上指定字符的ASCII或属

        SEEKy=SEEK(filenum)返回当前文件位置

        SETMEMy=SETMEM(n)改变远堆集使用的内存大小

        SGNy=SGN(n)输出n的符号

        SINy=SIN(x)正弦值y=SinX

        SPACE$S$=SPACE$(n)输出长度为n的空格字符串

        SPCSPC(n)在PRINT语句中跳过n个空格

        SQRy=SQR(n)给出n的平方根

        STICKy=STICK(n)返回两个操纵杆的坐标

        STR$S$=STR$(n)返回一个表示n值的字符串

        STRIGy=STRIG(n)返回操纵杆触发状态

        STRING$S$=STRING$(n,x$)返回n个x$第一个字符组成的字符串

        TABTAB(column)将输出位置移到column列

        TANy=TAN(x)正切值y=tgX

        TIME$S$=TIME$获得当前时间

        TIMERy=TIMER输出自午夜开始后流逝的秒数

        UBOUNDy=UBOUND(array[,n])输出数组array第n维最大下标

        UCASE$S$=UCASE$(x$)把字符串x$中所有小写字母变成大写

        VALy=VAL(S$)输出字符串S$的相应数值

        VARPTRy=VARPTR(variable)返回变量的偏移地址

        VARSEGy=VARSEG(variable)返回变量的段地址

        VARPTR$S$=VARPTR$(variable)返回变量地址的字符串表示

        语句名 语句格式 功能

       BEEP BEEP 使喇叭发声

       BLOAD BLOAD filespc[,address] 把用BSAVE语句存贮的文件装入内存

       BSAVE BSAVE filespc,address,length 把某一内存区域中的内容存入磁盘

       CALL CALL 过程名[(形式参数表)] 调用一个过程

       CALLS CALLS 过程名[形式参数表] 把控制传给非BASIC语言写的过程

       CALL ABSOLUTE CALL ABSOLUTE address [(参数表)] 传送控制给一个机器语言过程

       CALL INTOLD CALL INTOLD(int_no, in_array(), out_array())

        CALL INTXOLD(int_no,in_array(), out_array()) 实现DOS功能调用

       CALL INTERRUPT CALL INTERRUPT(int_no, inregs, outregs)

        CALL INTERRUPTX(int_no, inregs, outregs) 结构化的DOS功能调用

       CHAIN CHAIN filespec 将控制由当前程序转到别的程序

       CHDIR CHDIR path 改变现行的目录(相当于DOS的CD)

       CIRCLE CIRCLE(x,y),r,[,c[,start,end,[,aspect]]] 画圆或圆的一部分

       CLEAR CLEAR 重新初始化全部变量,关闭文件和设置堆栈的大小

       CLOSE CLOSE [[#]n[,[#]n]...] 关闭文件。n是文件号;无选择时关闭所有文件

       CLS CLS 清屏幕

       COLOR COLOR [背景色][,[调色板] 设置图形颜色(随图形方式不同而不同

       COM COM(n){ ON|OFF|STOP} 允许,不允许或禁止指定口上的通讯事件捕捉

       COMMON COMMON 变量表 说明要传递给被链接程序的变量

       CONST CONST 常值名=常值表达式 说明用于代替数值或字符串的符号常数

       DATA DATA 常量[,常量]... 为READ语句准备数据

       DATE$ DATE$=S$ 根据S$中的内容设置系统日期

       DECLARE DECLARE { FUNCTION|SUB}过程名[(参数表)] 说明引用过程和检查参数类型

       DEF FN DEF FN

        DEF FN...END DEF 定义单行或多行函数

       DEF SEG DEF SEG[=n] 为需段地址语句定义数据段

       DEF type DEF type 字符范围 定义变量的缺省类型

       DIM DIM 变量 [AS类型] 说明变量并分配存贮空间

       DO...LOOP DO...LOOP 根据条件决定是否进行循环

       DRAW DRAW S$ 在显示器上画图

       END END { DEF | FUNCTION | IF| SELECT | SUB | TYPE} 结束程序.过程或程序块

       ENVIRON ENVIRON 含"="的字符串 修改DOS环境字符串表中的参数

       ERASE ERASE array,[array]... 重新初始化静态数组,重新为动态数组分配空间

       ERROR ERROR n 模拟产生BASIC错误 n

       EXIT EXIT { DEF | DO | FOR | FUNCTION | SUB } 跳出循环或程序块

       FIELD FIELD [#]filenum,宽度 AS 字符串变量... 在随机存贮文件缓冲器里为变量分配空间

       FILES FILES [filespec] 显示指定磁盘上文件(相当于DOS的DIR)

       FOR...NEXT FOR...NEXT 允许一批命令在循环中执行给定的次数

       FUNCTION FUNCTION...END FUNCTION 说明过程函数的名字,参数和代码

       GET GET [#]filenum[,recnum[,variable]]

        GET (x1,y1)-(x2,y2),array 把一磁盘文件读入随机存取缓冲器变量存储屏幕上的图像

       GOSUB

       RETURN GOSUB...RETURN 将控制转移到子程序和从子程序返回

       GOTO GOTO { 行号|行标号} 无条件转移到指定语句

       IF...THEN... ELSE... 根据逻辑表达式的值进行条件执行

       INPUT INPUT[;][提示字符串{ ;|,}]变量表 在程序运行期间从键盘输入数据

       INPUT# INPUT#filenum,变量表 从顺序存取装置或文件中读取数据

       IOCTL IOCTL[#]filenum,字符串 传送控制数据字符串到设备驱动器

       KEY KEY n,字符串

        KEY { ON|OFF|LIST} 把软键字符串值赋给功能键显示,清除或全显功能键

       KEY(n) KEY(n){ ON|OFF|STOP} 开启.关闭或停止捕捉指定键

       KILL KILL filespec 删去磁盘上的指定文件

       LET [LET]变量=表达示 赋值

       LINE LINE(x1,y1)-(x2,y2),color, BF, style 画线或方框

       LINE INPUT LINE INPUT[;][提示字符串 { ;|,}]字符串变量 输入一整行字符

       LINE INPUT# LINE INPUT #filenum,S$ 从顺序磁盘文件读一整行字符串到S$LOCATE LOCATE row,col,cursor,start,stop 将光标移到指定位置或改变光标属性

       LOCK ...

       UNLOCK 用另外的过程控制对打开文件的全部或部分的存取

       LPRINT 向打印机发送数据

       LPRINT USING 向打印机按格式发送数据

       LSET LSET 字段变量=S$ 以左对齐方式把字符串数据放入随机文件缓冲区中

       MID$ MID$(S$,n[,m])=r$ 用r$把S$中的第n个符开始替换m个字符,原长度不变

       MKDIR MKDIR path 用字符串path建立一个子目录

       NAME NAME 旧文件名 AS 新文件名 为文件改名

       ON ERROR ON ERROR GOTO { 行号|行标号} 设置错误陷阱

       ON even ON even GOSUB { 行号|行标号} 设置事件陷阱

       ON...GOSUB ON n GOSUB { 行号|标号表} 转到第N个标号所示子程序

       ON...GOTO ON n GOTO { 行号|标号表} 转到第n个标号所示语句

       OPEN OPEN filespec [FOR mode]AS [#]n [len=recordsize] 打开磁盘文件

       OPEN COM OPEN "COMn:[baud][,parity][,data][,stop][,option]" AS [#]n [LEN=num] 打开一通讯文件

       OPTION BASE OPTION BASE n 设置数组下标缺省最小值

       OUT OUT portno,n 把一个字节值n送到I/O端口

       PAINT PAINT (x,y)[,color][,boundary] 在图形屏幕上用颜色或图案填充封闭区域

       PALETTE PALETTE attribute,color 改变调色板中的颜色

       PALETTE USING PALETTE USING array 改变调色板中所有颜色

       PCOPY PCOPY源显示而,目的显示页 以全屏幕方式将一页拷贝到另一页上

       PEN { ON | OFF | STOP} 允许.禁止和暂停光笔事件捕捉

       PLAY PLAY 字符串 演奏字符串指定的音乐

       PLAY { ON | OFF | STOP} 允许.禁止和暂停对演奏事件的捕捉

       POKE POKE address,byte 将一字节写入指定内存单元

       PRESET PRESET (x,y)[,color] 在屏幕上画一点(缺省为背景色)

       PRINT 显示语句

       PRINT # 输出字符串到文件

       PRINT # USING 格式输出到文件

       PRING USING 格式显示

       PSET PSET (x,y)[,color] 在屏幕上画一点(缺省为前景色)

       PUT PUT [#]filenum[,[recnum] [,varable]]

       PUT (x,y) array,action 将变量或随机存贮缓冲器写入文件

        将由GET得到的图像放置在屏幕上

       RANDOMIZE RANDOMIZE [n] 预置(重新播种)随机数发生器

       READ READ 变量表 从DATA语句读数据并赋给变量

       REDIM REDIM 变量 AS 类型... 改变已为动态数组分配的空间

       REM REM remark 在程序里插入说明或注释

       RESET RESET 关闭全部磁盘文件

       RESTORE RESTORE { 行号|行标号} 允许从指定的行重读DATA语句

       RESUME RESUME { 行号|行标号|NEXT} 错误捕捉程序调用后继续执行程序

       RETURN RETURN { 行号|行标号} 控制从子程序里返回

       RMDIR RMDIR path 消去目录path(相当于DOS的RD)

       RSET RSET S$=X$ 把X$右对齐放在随机存贮缓冲器的字符器S$中

       RUN RUN [{ 行号|文件名}] 重新执行内存中程序或由文件名指定的程序

       SCREEN SCREEN [mode][,[colorswitch]][,[apage][,[vpage]] 设置显示屏幕

       SEEK SEEK [#]filenum,position 在文件里为下一个读写操作设定位置

       SELECT CASE 根据一个表达式决定执行n个语句块之一

       SHARED SHARED 变量 AS 类型... 说明共用变量

       SHELL SHELL 命令字符串 暂停BASIC程序,运行DOS的命令

       SOUND SOUND 频率,时间长度 从喇叭发声

       STATIC STATIC 变量表 说明为静态变量

       STOP STOP 终止程序执行

       STRIG STRIG { ON|OFF} 开启或关闭操纵杆的触发检查

       STRIG ON,OFF和STOP STRIG(n) { ON|OFF|STOP} 允许.关闭或暂停捕捉操纵杆动作

       SUB SUB...END SUB 标明子程序的开始和结尾

       SWAP SWAP 变量1,变量2 交换两个变量的值

       SYSTEM SYSTEM 关闭所有打开文件并把控制返回操作系统

       TIME$ TIME$=S$ 按字符串S$来设置时间

       TIMER { ON| OFF|STOP} 允许.禁止或轶计时事件捕捉

       TRON/TROFF TRON/TROFF 跟踪程序语句的执行

       TYPE TYPE...END TYPE 定义数据类型

       UNLOCK 释放对文件一部分的锁定

       VIEW VIEW [SCREEN](x1,y1)-(x2,y2),color,border 为图形输出定义屏幕边界

       VIEW PRINT VIEW PRING top TO bottom 设置屏幕上文本窗口边界

       WAIT WAIT portno,and_value,xor_valud 监视端口状态并暂停程序的执行

       WHILE...WEND 在条件为真时, 执行循环体内语句

       WIDTH WIDTH [设备][列数] 设置输出宽度

       WINDOW WINDOW [SCREEN](x1,y1)-(X2,y2) 定义当前窗口的广义坐标

       WRITE WRITE 表达式表 在屏幕上输出数据

       WRITE # WRITE #filenum,expressiolist 将数据写入顺序文件

       $DYNAMIC REM $DYNAMIC 默认用动态数组, 特点:可以利用redim重新定义数组大小

       $STATIC REM $STATIC 默认用静态数

       å½“然,如果你是初学者,很多语法都不需要会,初学者常用的

       FOR X=Y TO Z

       NEXT X

       è®¡æ•°å¾ªçŽ¯)

       IF THEN ELSE

       é€‰æ‹©è¯­å¥ï¼‰

       ç­‰ç­‰ã€‚

cvHoughCircles函数参数

       在处理图像上的圆检测时,cvHoughCircles函数提供了几个关键参数,以适应不同的应用场景。

       首先,image参数是输入的单通道(二值)图像,这个图像在函数处理过程中可能发生变化。函数会根据提供的参数来检测图像中的圆形轮廓。

       circle_storage用于存储检测到的圆,可以是hydra 源码内存中的线段序列(函数会返回这个序列),或者是一个特殊的CV_FC3型矩阵,其中包含圆心坐标(x, y)和半径信息。如果circle_storage是矩阵形式,且圆的数量超过矩阵的大小,函数会返回尽可能多的圆,但不会超过矩阵的尺寸限制。

       method参数目前仅支持CV_HOUGH_GRADIENT,这是一种基于HT的Hough变换方法,由[Yuen]描述。dp参数则是控制圆心定位的累加器分辨率,较大的dp值意味着累加器分辨率会低于输入图像,有助于减少噪声影响,但可能导致部分圆检测不准确。

       min_dist参数用于设定两个不同圆之间的最小允许距离,以区分可能的tfs 源码重复检测。设置合适的min_dist有助于提高圆检测的准确性。

       param1和param2是两个特别的参数。param1是Canny边缘检测的阈值上限,param2则是累加器的阈值。param1的值越大,边缘检测越严格,但可能漏掉一些边缘;param2的值越小,检测到的圆可能越多,但可能存在较多的假圆。

       最后,min_radius和max_radius分别定义了检测圆的最小和最大半径范围,这对于限制搜索空间,提高检测效率至关重要。

OpenCV函数:提取轮廓相关函数使用方法

       0、绪:

       步骤:

       一、findContours()查找轮廓;

       二、drawContours()画轮廓;

       三、轮廓填充;

       四、计算轮廓的面积和周长;

       五、提取轮廓凸包,矩形,最小外接矩形,外接圆

       findContours()查找轮廓: void findContours ( InputOutputArray image,//输入图像,必须是8位单通道二值图像 OutputArrayOfArrays contours,//检测到的轮廓,每个轮廓被表示成一个point向量 OutputArray hierarchy,//可选的输出向量,包含图像的拓扑信息。其中元素的个数和检测到的轮廓的数量相等 int mode,//说明需要的轮廓类型和希望的返回值方式 int method,//轮廓近似方法 Point offset = Point() ) 参数mode: ①mode的值决定把找到的轮廓如何挂到轮廓树节点变量(h_prev, h_next, v_prev, v_next)上,拓扑结构图如下; ②每种情况下,结构都可以看成是被横向连接(h_prev, h_next)联系和被纵向连接(v_prev, v_next)不同层次。 ③CV_RETR_EXTERNAL:只检测出最外轮廓即c0; CV_RETR_LIST:检测出所有的轮廓并将他们保存到表(list)中; CV_RETR_COMP:检测出所有的轮廓并将他们组织成双层的结构,第一层是外部轮廓边界,第二层边界是孔的边界; CV_RETR_TREE:检测出所有轮廓并且重新建立网状的轮廓结构; ④参数method: CV_CHAIN_CODE:用freeman链码输出轮廓,其他方法输出多边形(顶点的序列); CV_CHAIN_APPROX_NONE:将链码编码中的所有点转换为点; CV_CHAIN_APPROX_SIMPLE:压缩水平,垂直或斜的部分,只保存最后一个点; CV_CHAIN_APPROX_TC_L1,CV_CHAIN_QPPROX_TC_KCOS:使用Teh-Chin链逼近算法中的一个。 CV_LINK_RUNS:与上述的算法完全不同,连接所有的水平层次的轮廓。 注:findContours()查找时,这个图像会被直接涂改,因此如果是以后有用的图像,应该复制之后再进行查找;

       drawContours()绘制轮廓: void drawContours( InputOutputArray image,//要绘制轮廓的图像 InputArrayOfArrays contours,//所有输入的轮廓,每个轮廓被保存成一个point向量 int contourIdx,//指定要绘制轮廓的编号,如果是负数,则绘制所有的轮廓 const Scalar color,//绘制轮廓所用的颜色 int thickness = 1, //绘制轮廓的线的粗细,如果是负数,则轮廓内部被填充 int lineType = 8, /绘制轮廓线的连通性 InputArray hierarchy = noArray(),//关于层级的可选参数,只有绘制部分轮廓时才会用到 int maxLevel = INT_MAX,//绘制轮廓的最高级别,这个参数只有hierarchy有效的时候才有效 Point offset = Point() ) 注: ①maxLevel=0,绘制与输入轮廓属于同一等级的所有轮廓即输入轮廓和与其相邻的轮廓 maxLevel=1, 绘制与输入轮廓同一等级的所有轮廓与其子节点。 maxLevel=2,绘制与输入轮廓同一等级的所有轮廓与其子节点以及子节点的子节点

       轮廓填充: 步骤: a) 依次遍历轮廓点,将点绘制到img上; b) 使用floodFill以及一个种子点进行填充; 两种方法:自己编写程序;使用drawContours()函数; void drawMaxAreaLine(Mat dst, vectorPoint maxAreaPoints) { int step = dst.step; auto data = dst.data; for (int i = 0; i maxAreaPoints.size(); ++i) { *(data + maxAreaPoints[i].x + maxAreaPoints[i].y * step) = ; } } //孔洞填充算法 void fillHole(Mat src_Bw, Mat dst_Bw) { Size m_Size = src_Bw.size(); Mat Temp=Mat::zeros(m_Size.height+,m_Size.width+,src_Bw.type()); src_Bw.copyTo(Temp(Range(5, m_Size.height + 5), Range(5, m_Size.width + 5))); floodFill(Temp, Point(0, 0), Scalar()); Mat cutImg; Temp(Range(5, m_Size.height + 5), Range(5, m_Size.width + 5)).copyTo(cutImg); dst_Bw = src_Bw | (~cutImg); } 注:这里常会碰到种子点不好选取的问题,因为有时候所选择的种子点不能保证对所有轮廓都适用。也就是查找一个在轮廓内的点是存在一定难度的。 使用drawContours()就会很方便: vectorvectorPoint contours; contours.push_back(currentFrameEdge); Mat savedGrayMat = Mat::zeros(RectData[0].rows, RectData[0].cols, CV_8UC1); //drawMaxAreaLine(savedGrayMat, currentFrameEdge); //floodFill(savedGrayMat, Point(currentFrameEdge[0].x + 2, currentFrameEdge[0].y + 2), ); drawContours(savedGrayMat, contours, 0, Scalar(), CV_FILLED); imshow("savedGrayMat", savedGrayMat); waitKey();

       计算轮廓的面积和周长: ①计算轮廓面积: double contourArea(InputArray contour, bool oriented=false ) InputArray contour:输入的点,一般是图像的轮廓点; bool oriented=false: 表示某一个方向上轮廓的的面积值,顺时针或者逆时针,一般选择默认false; ②计算轮廓边长: double arcLength(InputArray curve, bool closed) InputArray curve:表示图像的轮廓; bool closed:表示轮廓是否封闭的; 注: ①contourArea计算整个或部分轮廓的面积; 在计算部分轮廓的情况时,由轮廓弧线和连接两端点的弦围成的区域总面积被计算,如图; ②轮廓的位置将影响区域面积的符号,因此函数范围的有可能是负值。可以在运行时使用fabs()来得到面积的绝对值;

       提取轮廓凸包,矩形,最小外接矩形,外接圆 ①convexhull():函数提取轮廓的凸包: 格式: void convexhul(InputArray points, OutputArray hull, bool clockwise=false, bool returnPoints=true) 参数: 第一个参数:要求凸包的点集 第二个参数:输出的凸包点,可以为vector,此时返回的是凸包点在原轮廓点集中的索引,也可以为vector,此时存放的是凸包点的位置 第三个参数:一个bool变量,表示求得的凸包是顺时针方向还是逆时针方向,true是顺时针方向; 第四个参数,第二个参数的返回类型是vector还是vector,可以忽略; ②boundingRect():计算轮廓外包矩形,矩形是与图像上下边界平行的; 格式: Rect boundingRect(InputArray points); 输入:二维点集,点的序列或向量 (Mat) 返回:Rect //寻找外包矩阵 Rect maxRect = boundingRect(contours[m_count]); //绘制外包矩阵 rectangle(contours_img_1, maxRect, Scalar(0, , 0)); ③minAreaRect():提取轮廓的最小外包矩形; 主要求包含点集最小面积的矩形,这个矩形是可以有偏转角度的,可以与图像的边界不平行; 格式: RotatedRect minAreaRect(InputArray points) 输入:二维点集,点的序列或向量 (Mat) 返回:RotatedRect ④minEnclosingcircle():提取轮廓的最小外包圆; 格式: void minEnclosingcircle(InputArray points,Point2f center,float radius) 输入: 二维点集:点的序列vector point 或向量 (Mat) , 圆心坐标; 半径;

       示例: #include opencv2/opencv.hpp #include opencv2/highgui/highgui.hpp #include opencv2/imgproc/imgproc.hpp #include "opencv2/contrib/contrib.hpp" #include iostream #include stdio.h using namespace cv; using namespace std; void KmeansFun(); void fillHole(Mat src_Bw, Mat dst_Bw); int main() { Mat src_img = imread("data\\.jpg",1); Mat src_img_1(src_img.rows,src_img.cols,CV_8UC1,Scalar(0)); cvtColor(src_img, src_img_1, CV_BGR2GRAY); GaussianBlur(src_img_1, src_img_1, Size(3, 3), 3, 3); Mat threshold_img(src_img.rows,src_img.cols,CV_8UC1,Scalar(0)); threshold(src_img_1, threshold_img, 0, , THRESH_OTSU); imshow("1",threshold_img); vector vectorPoint contours; vectorVec4i hierarchy; findContours( threshold_img, contours, hierarchy,//轮廓的继承关系 CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE ); Mat contours_img(src_img.rows,src_img.cols,CV_8U,Scalar(0)); if(!contours.empty() !hierarchy.empty()) { int idx = 0; for( ; idx = 0; idx = hierarchy[idx][0] ) { Scalar color(,,); //Scalar color( (rand()), (rand()), (rand()) );//随机生成颜色 drawContours( contours_img, contours, idx, color, 1, 8, hierarchy ); } } imshow("contours_img",contours_img); int m_count = 0; Mat contours_img_1(src_img.rows,src_img.cols,CV_8UC3,Scalar(0)); if(!contours.empty() !hierarchy.empty()) //计算轮廓的面积 { for (int i = 0; i (int)contours.size(); i++) { double g_dConArea = abs(contourArea(contours[i], false)); double g_dConLength = arcLength(contours[i],true); cout "用轮廓面积计算函数计算出来的第" i "个轮廓的面积为:" g_dConArea endl; cout "用轮廓面积计算函数计算出来的第" i "个轮廓的边长为:" g_dConLength endl; if (g_dConArea = g_dConArea ) { m_count = i; //Scalar color( (rand()), (rand()), (rand()) );//随机生成颜色 //drawContours(contours_img_1, contours, m_count, color, CV_FILLED, 8, hierarchy );//对轮廓内部着色 //计算凸包 //vectorint hull; //convexHull(Mat(contours[m_count]), hull, true); ////绘制凸包 //int hull_count = (int)hull.size(); //Point pt0 = contours[m_count][hull[hull_count - 1]]; //for (int i = 0;i hull_count;i++) //{ // Point pt = contours[m_count][hull[i]]; // line(contours_img_1, pt0, pt, Scalar(0, , 0), 1,8); // pt0 = pt; //} ////寻找外包矩阵 //Rect maxRect = boundingRect(contours[m_count]); ////绘制外包矩阵 //rectangle(contours_img_1, maxRect, Scalar(0, , 0)); ////寻找最小外包矩形 //RotatedRect minRect = minAreaRect(contours[m_count]); //Point2f fourPoint2f[4]; ////将minRect的四个顶点坐标值放到fourPoint的数组中 //minRect.points(fourPoint2f); ////根据得到的四个点的坐标 绘制矩形 //for (int i = 0; i 3; i++) //{ // line(contours_img_1, fourPoint2f[i], fourPoint2f[i + 1], Scalar(0,0,), 3); //} //line(contours_img_1, fourPoint2f[0], fourPoint2f[3], Scalar(0, 0, ), 3); //在生成的那些随机点中寻找最小包围圆形 Point2f center; //圆心 float radius; //半径 minEnclosingCircle(contours[m_count], center, radius); //根据得到的圆形和半径 绘制圆形 circle(contours_img_1, static_castPoint(center), (int)radius, Scalar( (rand()), (rand()), (rand()) ), 3); } } } imshow("src_img",src_img); imshow("contours_img-1",contours_img_1); waitKey(0); return 0; }