1.cvHoughCircles函数函数
2.å
³äºQBASIC
3.cvHoughCircles函数参数
4.OpenCV函数:提取轮廓相关函数使用方法
cvHoughCircles函数函数
CvHoughCircles函数是函数函数OpenCV库中一个重要的图像处理函数,主要用于在图像中检测圆形结构。源码这个函数接收几个关键参数,函数函数帮助我们从输入图像中寻找可能的源码圆形对象。
首先,函数函数参数"image"是源码机构控股源码一个CvArr类型的指针,它代表了待处理的函数函数图像数据。这个图像可以是源码灰度图像或者彩色图像,但函数通常在二值化或边缘检测后用于圆形检测。函数函数
接下来是源码"circle_storage",它是函数函数一个CvSeq类型的指针,用于存储检测到的源码圆形信息,如圆心坐标和半径。函数函数这个存储结构预先分配了内存空间,源码以便于处理可能存在的函数函数多个圆形。
"method"参数定义了霍夫变换的vggnet源码下载方法,可以是HOUGH_GRADIENT(梯度霍夫变换)或HOUGH_LINEMOD(线性霍夫变换)。不同方法适用于不同的边缘检测和圆形检测场景。
"dp"表示参数空间的步长,它影响检测的精度和计算效率。dp值越大,检测的圆可能更精确,但计算量也更大。
"min_dist"表示最小距离参数,用于避免检测到的圆形过于密集。如果两个圆形中心间的距离小于这个值,会被视为同一个圆形。
"param1"和"param2"是霍夫变换的阈值参数,它们共同控制了圆形边缘的强度和方向。调整这两个参数可以优化检测结果。
"min_radius"和"max_radius"定义了搜索的jgit源码下载圆形半径范围。函数只会在这个范围内寻找可能的圆形,这对于减少计算量和提高效率非常有帮助。
总结来说,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用于存储检测到的圆,可以是源码网络验证内存中的线段序列(函数会返回这个序列),或者是一个特殊的CV_FC3型矩阵,其中包含圆心坐标(x, y)和半径信息。如果circle_storage是矩阵形式,且圆的数量超过矩阵的大小,函数会返回尽可能多的圆,但不会超过矩阵的尺寸限制。
method参数目前仅支持CV_HOUGH_GRADIENT,这是一种基于HT的Hough变换方法,由[Yuen]描述。dp参数则是控制圆心定位的累加器分辨率,较大的dp值意味着累加器分辨率会低于输入图像,有助于减少噪声影响,但可能导致部分圆检测不准确。
min_dist参数用于设定两个不同圆之间的最小允许距离,以区分可能的tld MATLAB源码重复检测。设置合适的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; }