| ±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËOpenCV ÖеÄÂÖÀª£¬Ñ§Ï°ÌáȡһЩ¾³£Ê¹ÓõĶÔÏóÌØÕ÷, Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°£¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
21 OpenCV ÖеÄÂÖÀª
21.1 ³õʶÂÖÀª
Ä¿±ê
Àí½âʲôÊÇÂÖÀª
ѧϰÕÒÂÖÀª£¬»æÖÆÂÖÀªµÈ
º¯Êý£ºcv2.findContours()£¬cv2.drawContours()
21.1.1 ʲôÊÇÂÖÀª
ÂÖÀª¿ÉÒÔ¼òµ¥ÈÏΪ³É½«Á¬ÐøµÄµã£¨Á¬×ű߽磩Á¬ÔÚÒ»ÆðµÄÇúÏߣ¬¾ßÓÐÏàͬ¡¢µÄÑÕÉ«»òÕ߻Ҷȡ£ÂÖÀªÔÚÐÎ×´·ÖÎöºÍÎïÌåµÄ¼ì²âºÍʶ±ðÖкÜÓÐÓá£
ΪÁ˸ü¼Ó׼ȷ£¬ÒªÊ¹ÓöþÖµ»¯Í¼Ïñ¡£ÔÚѰÕÒÂÖÀªÖ®Ç°£¬Òª½øÐÐãÐÖµ»¯´¦Àí¡¢»òÕß
Canny ±ß½ç¼ì²â¡£
²éÕÒÂÖÀªµÄº¯Êý»áÐÞ¸ÄÔʼͼÏñ¡£Èç¹ûÄãÔÚÕÒµ½ÂÖÀªÖ®ºó»¹ÏëʹÓÃÔʼͼ¡¢ÏñµÄ»°£¬ÄãÓ¦¸Ã½«ÔʼͼÏñ´æ´¢µ½ÆäËû±äÁ¿ÖС£
ÔÚ OpenCV ÖУ¬²éÕÒÂÖÀª¾ÍÏñÔÚºÚÉ«±³¾°Öг¬°×É«ÎïÌå¡£ÄãÓ¦¸Ã¼Çס£¬¡¢ÒªÕÒµÄÎïÌåÓ¦¸ÃÊǰ×É«¶ø±³¾°Ó¦¸ÃÊǺÚÉ«¡£
ÈÃÎÒÃÇ¿´¿´ÈçºÎÔÚÒ»¸ö¶þֵͼÏñÖвéÕÒÂÖÀª£º
º¯Êý cv2.findContours() ÓÐÈý¸ö²ÎÊý£¬µÚÒ»¸öÊÇÊäÈëͼÏñ£¬µÚ¶þ¸öÊÇÂÖÀª¼ìË÷ģʽ£¬µÚÈý¸öÊÇÂÖÀª½üËÆ·½·¨¡£·µ»ØÖµÓÐÈý¸ö£¬µÚÒ»¸öÊÇͼÏñ£¬µÚ¶þ¸öÊÇÂÖÀª£¬µÚÈý¸öÊÇ£¨ÂÖÀªµÄ£©²ãÎö½á¹¹¡£ÂÖÀª£¨µÚ¶þ¸ö·µ»ØÖµ£©ÊÇÒ»¸ö
PythonÁÐ±í£¬ÆäÖд洢ÕâͼÏñÖеÄËùÓÐÂÖÀª¡£Ã¿Ò»¸öÂÖÀª¶¼ÊÇÒ»¸ö Numpy Êý×飬°üº¬¶ÔÏó±ß½çµã£¨x£¬y£©µÄ×ø±ê¡£
×¢Ò⣺ÎÒÃǺó±ß»á¶ÔµÚ¶þºÍµÚÈý¸ö²ÎÊý£¬ÒÔ¼°²ã´Î½á¹¹½øÐÐÏêϸ½éÉÜ¡£ÔÚÄÇ֮ǰ£¬Àý×ÓÖÐʹÓõIJÎÊýÖµ¶ÔËùÓÐͼÏñ¶¼ÊÇÊÊÓõġ£
21.1.2 ÔõÑù»æÖÆÂÖÀª
º¯Êý cv2.drawContours() ¿ÉÒÔ±»ÓÃÀ´»æÖÆÂÖÀª¡£Ëü¿ÉÒÔ¸ù¾ÝÄãÌṩµÄ±ß½çµã»æÖÆÈκÎÐÎ×´¡£ËüµÄµÚÒ»¸ö²ÎÊýÊÇÔʼͼÏñ£¬µÚ¶þ¸ö²ÎÊýÊÇÂÖÀª£¬Ò»¸ö
Python ÁÐ±í¡£µÚÈý¸ö²ÎÊýÊÇÂÖÀªµÄË÷Òý£¨ÔÚ»æÖƶÀÁ¢ÂÖÀªÊǺÜÓÐÓ㬵±ÉèÖÃΪ -1 ʱ»æÖÆËùÓÐÂÖÀª£©¡£½ÓÏÂÀ´µÄ²ÎÊýÊÇÂÖÀªµÄÑÕÉ«ºÍºñ¶ÈµÈ¡£
ÔÚÒ»·ùͼÏñÉÏ»æÖÆËùÓеÄÂÖÀª£º
import numpy
as np
import cv2
im = cv2.imread('test.jpg')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
»æÖƶÀÁ¢ÂÖÀª£¬ÈçµÚËĸöÂÖÀª£º
img = cv2.drawContour(img, contours, -1, (0,255,0),
3)
µ«ÊÇ´ó¶àÊýʱºò£¬ÏÂÃæµÄ·½·¨¸üÓÐÓãº
img = cv2.drawContours(img, contours, 3, (0,255,0),
3) |
×¢Ò⣺×îºóÕâÁ½ÖÖ·½·¨½á¹ûÊÇÒ»ÑùµÄ£¬µ«ÊǺó±ßµÄ֪ʶ»á¸æËßÄã×îºóÒ»ÖÖ·½·¨¸üÓÐÓá£
21.1.3 ÂÖÀªµÄ½üËÆ·½·¨
ÕâÊǺ¯Êý cv2.findCountours() µÄµÚÈý¸ö²ÎÊý¡£Ëüµ½µ×´ú±íʲôÒâË¼ÄØ£¿
ÉϱßÎÒÃÇÒѾÌáµ½ÂÖÀªÊÇÒ»¸öÐÎ×´¾ßÓÐÏàͬ»Ò¶ÈÖµµÄ±ß½ç¡£Ëü»á´æÖüÐÎ×´±ß½çÉÏËùÓÐµÄ (x£¬y) ×ø±ê¡£µ«ÊÇÐèÒª½«ËùÓеÄÕâЩ±ß½çµã¶¼´æ´¢Âð£¿Õâ¾ÍÊÇÕâ¸ö²ÎÊýÒª¸æËߺ¯Êý
cv2.findContours µÄ¡£
Õâ¸ö²ÎÊýÈç¹û±»ÉèÖÃΪ cv2.CHAIN_APPROX_NONE£¬ËùÓеı߽çµã¶¼»á±»´æ´¢¡£µ«ÊÇÎÒÃÇÕæµÄÐèÒªÕâô¶àµãÂð£¿ÀýÈ磬µ±ÎÒÃÇÕҵı߽çÊÇÒ»ÌõÖ±Ïßʱ¡£ÄãÓÃÐèÒªÖ±ÏßÉÏËùÓеĵãÀ´±íʾֱÏßÂ𣿲»Êǵģ¬ÎÒÃÇÖ»ÐèÒªÕâÌõÖ±ÏßµÄÁ½¸ö¶Ëµã¶øÒÑ¡£Õâ¾ÍÊÇ
cv2.CHAIN_APPROX_SIMPLE Òª×öµÄ¡£Ëü»á½«ÂÖÀªÉϵÄÈßÓàµã¶¼È¥µô£¬Ñ¹ËõÂÖÀª£¬´Ó¶ø½ÚÊ¡Äڴ濪֧¡£ÎÒÃÇÓÃÏÂͼÖеľØÐÎÀ´ÑÝʾÕâ¸ö¼¼Êõ¡£ÔÚÂÖÀªÁбíÖеÄÿһ¸ö×ø±êÉϻһ¸öÀ¶É«Ô²È¦¡£µÚÒ»¸öͼÏÔʾʹÓÃ
cv2.CHAIN_APPROX_NONE µÄЧ¹û£¬Ò»¹² 734 ¸öµã¡£µÚ¶þ¸öͼÊÇʹÓà cv2.CHAIN_APPROX_SIMPLE
µÄ½á¹û£¬Ö»ÓÐ 4 ¸öµã¡£¿´µ½ËûµÄÍþÁ¦Á˰ɣ¡

21.2 ÂÖÀªÌØÕ÷
Ä¿±ê
²éÕÒÂÖÀªµÄ²»Í¬ÌØÕ÷£¬ÀýÈçÃæ»ý£¬Öܳ¤£¬ÖØÐÄ£¬±ß½ç¿òµÈ¡£
Äã»áѧµ½ºÜ¶àÂÖÀªÏà¹Øº¯Êý
21.2.1 ¾Ø
ͼÏñµÄ¾Ø¿ÉÒÔ°ïÖúÎÒÃǼÆËãͼÏñµÄÖÊÐÄ£¬Ãæ»ýµÈ¡£ÏêϸÐÅÏ¢Çë²é¿´Î¬»ù°Ù¿ÆImage
Moments¡£
º¯Êý cv2.moments() »á½«¼ÆËãµÃµ½µÄ¾ØÒÔÒ»¸ö×ÖµäµÄÐÎʽ·µ»Ø¡£ÈçÏ£º
import cv2
import numpy as np
img = cv2.imread('star.jpg',0)
ret,thresh = cv2.threshold(img,127,255,0)
contours,hierarchy = cv2.findContours(thresh,
1, 2) cnt = contours[0]
M = cv2.moments(cnt)
print M |
¸ù¾ÝÕâЩ¾ØµÄÖµ£¬ÎÒÃÇ¿ÉÒÔ¼ÆËã³ö¶ÔÏóµÄÖØÐÄ£º


#This can be
done as follows:
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00']) |
21.2.2 ÂÖÀªÃæ»ý
ÂÖÀªµÄÃæ»ý¿ÉÒÔʹÓú¯Êý cv2.contourArea() ¼ÆËãµÃµ½£¬Ò²¿ÉÒÔʹÓþأ¨0
½×¾Ø£©£¬M['m00']¡£
| area = cv2.contourArea(cnt) |
21.2.3 ÂÖÀªÖܳ¤
Ò²±»³ÆÎª»¡³¤¡£¿ÉÒÔʹÓú¯Êý cv2.arcLength() ¼ÆËãµÃµ½¡£Õâ¸öº¯ÊýµÄµÚ¶þ²ÎÊý¿ÉÒÔÓÃÀ´Ö¸¶¨¶ÔÏóµÄÐÎ×´ÊDZպϵģ¨True£©£¬»¹ÊÇ´ò¿ªµÄ£¨Ò»ÌõÇúÏߣ©¡£
| perimeter = cv2.arcLength(cnt,True) |
21.2.4 ÂÖÀª½üËÆ
½«ÂÖÀªÐÎ×´½üËÆµ½ÁíÍâÒ»ÖÖÓɸüÉÙµã×é³ÉµÄÂÖÀªÐÎ×´£¬ÐÂÂÖÀªµÄµãµÄÊýÄ¿ÓÉÎÒÃÇÉ趨µÄ׼ȷ¶ÈÀ´¾ö¶¨¡£Ê¹ÓõÄDouglas-PeuckerËã·¨£¬Äã¿ÉÒÔµ½Î¬»ù°Ù¿Æ»ñµÃ¸ü¶à´ËËã·¨µÄϸ½Ú¡£
ΪÁ˰ïÖúÀí½â£¬¼ÙÉèÎÒÃÇÒªÔÚÒ»·ùͼÏñÖвéÕÒÒ»¸ö¾ØÐΣ¬µ«ÊÇÓÉÓÚͼÏñµÄÖÖÖÖÔÒò£¬ÎÒÃDz»Äܵõ½Ò»¸öÍêÃÀµÄ¾ØÐΣ¬¶øÊÇÒ»¸ö¡°»µÐÎ×´¡±£¨ÈçÏÂͼËùʾ£©¡£
ÏÖÔÚÄã¾Í¿ÉÒÔʹÓÃÕâ¸öº¯ÊýÀ´½üËÆÕâ¸öÐÎ×´£¨£©ÁË¡£Õâ¸öº¯ÊýµÄµÚ¶þ¸ö²ÎÊý½Ðepsilon£¬ËüÊÇ´ÓÔʼÂÖÀªµ½½üËÆÂÖÀªµÄ×î´ó¾àÀë¡£ËüÊÇÒ»¸ö׼ȷ¶È²ÎÊý¡£Ñ¡ÔñÒ»¸öºÃµÄ
epsilon ¶ÔÓڵõ½ÂúÒâ½á¹û·Ç³£ÖØÒª¡£
epsilon = 0.1*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True) |
ϱߣ¬µÚ¶þ·ùͼÖеÄÂÌÏßÊǵ± epsilon = 10% ʱµÃµ½µÄ½üËÆÂÖÀª£¬µÚÈý·ùͼÊǵ± epsilon
= 1% ʱµÃµ½µÄ½üËÆÂÖÀª¡£µÚÈý¸ö²ÎÊýÉ趨»¡ÏßÊÇ·ñ±ÕºÏ¡£

21.2.5 ͹°ü
͹°üÓëÂÖÀª½üËÆÏàËÆ£¬µ«²»Í¬£¬ËäÈ»ÓÐЩÇé¿öÏÂËüÃǸø³öµÄ½á¹ûÊÇÒ»ÑùµÄ¡£
º¯Êý cv2.convexHull() ¿ÉÒÔÓÃÀ´¼ì²âÒ»¸öÇúÏßÊÇ·ñ¾ßÓÐ͹ÐÔȱÏÝ£¬²¢ÄܾÀÕýȱÏÝ¡£Ò»°ãÀ´Ëµ£¬Í¹ÐÔÇúÏß×ÜÊÇ͹³öÀ´µÄ£¬ÖÁÉÙÊÇÆ½µÄ¡£Èç¹ûÓеط½°¼½øÈ¥Á˾ͱ»½Ð×ö͹ÐÔȱÏÝ¡£ÀýÈçÏÂͼÖеÄÊÖ¡£ºìÉ«ÇúÏßÏÔʾÁËÊÖµÄ͹°ü£¬Í¹ÐÔȱÏݱ»Ë«¼ýÍ·±ê³öÀ´ÁË¡£

¹ØÓÚËûµÄÓï·¨»¹ÓÐһЩÐèÒª½»´ú£º
| ull = cv2.convexHull(points[,
hull[, clockwise[, returnPoints]] |
²ÎÊý£º
points ÎÒÃÇÒª´«ÈëµÄÂÖÀª
hull Êä³ö£¬Í¨³£²»ÐèÒª
clockwise ·½Ïò±êÖ¾¡£Èç¹ûÉèÖÃΪ True£¬Êä³öµÄ͹°üÊÇ˳ʱÕë·½ÏòµÄ¡£·ñÔòÎªÄæÊ±Õë·½Ïò¡£
returnPoints ĬÈÏֵΪ True¡£Ëü»á·µ»ØÍ¹°üÉϵãµÄ×ø±ê¡£Èç¹ûÉèÖÃΪ
False£¬¾Í»á·µ»ØÓë͹°üµã¶ÔÓ¦µÄÂÖÀªÉϵĵ㡣
Òª»ñµÃÉÏͼµÄ͹°ü£¬ÏÂÃæµÄÃüÁî¾Í¹»ÁË£º
| hull = cv2.convexHull(cnt) |
µ«ÊÇÈç¹ûÄãÏë»ñµÃ͹ÐÔȱÏÝ£¬ÐèÒª°Ñ returnPoints ÉèÖÃΪ False¡£ÒÔÉÏÃæµÄ¾ØÐÎΪÀý£¬Ê×ÏÈÎÒÃÇÕÒµ½ËûµÄÂÖÀª
cnt¡£ÏÖÔÚÎÒ°Ñ returnPoints ÉèÖÃΪ True ²éÕÒ͹°ü£¬Îҵõ½ÏÂÁÐÖµ£º
[[[234 202]], [[ 51 202]], [[ 51 79]], [[234 79]]]£¬Æäʵ¾ÍÊǾØÐεÄËĸö½Çµã¡£
ÏÖÔÚ°Ñ returnPoints ÉèÖÃΪ False£¬Îҵõ½µÄ½á¹ûÊÇ[[129],[ 67],[ 0],[142]]¡£ËûÃÇÊÇÂÖÀªµãµÄË÷Òý¡£ÀýÈ磺cnt[129]
= [[234,202]]£¬ÕâÓëÇ°ÃæÎÒÃǵõ½½á¹ûµÄµÚÒ»¸öÖµÊÇÒ»ÑùµÄ¡£
ÔÚ͹¼ìÑéÖÐÄãÎÒÃÇ»¹»áÓöµ½ÕâЩ¡£
21.2.6 ͹ÐÔ¼ì²â
º¯Êý cv2.isContourConvex() ¿ÉÒÔ¿ÉÒÔÓÃÀ´¼ì²âÒ»¸öÇúÏßÊDz»ÊÇ͹µÄ¡£ËüÖ»ÄÜ·µ»Ø
True »ò False¡£Ã»Ê²Ã´´ó²»Á˵ġ£
| k = cv2.isContourConvex(cnt) |
21.2.7 ±ß½ç¾ØÐÎ
ÓÐÁ½Àà±ß½ç¾ØÐΡ£
Ö±±ß½ç¾ØÐÎ Ò»¸öÖ±¾ØÐΣ¨¾ÍÊÇûÓÐÐýתµÄ¾ØÐΣ©¡£Ëü²»»á¿¼ÂǶÔÏóÊÇ·ñÐýת¡£ËùÒÔ±ß½ç¾ØÐεÄÃæ»ý²»ÊÇ×îСµÄ¡£¿ÉÒÔʹÓú¯Êý
cv2.boundingRect() ²éÕҵõ½¡£
£¨x£¬y£©Îª¾ØÐÎ×óÉϽǵÄ×ø±ê£¬£¨w£¬h£©ÊǾØÐεĿíºÍ¸ß¡£
x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2) |
ÐýתµÄ±ß½ç¾ØÐÎ Õâ¸ö±ß½ç¾ØÐÎÊÇÃæ»ý×îСµÄ£¬ÒòΪËü¿¼ÂÇÁ˶ÔÏóµÄÐýת¡£Óõ½µÄº¯ÊýΪ cv2.minAreaRect()¡£·µ»ØµÄÊÇÒ»¸ö
Box2D ½á¹¹£¬ÆäÖаüº¬¾ØÐÎ×óÉϽǽǵãµÄ×ø±ê£¨x£¬y£©£¬¾ØÐεĿíºÍ¸ß£¨w£¬h£©£¬ÒÔ¼°Ðýת½Ç¶È¡£µ«ÊÇÒª»æÖÆÕâ¸ö¾ØÐÎÐèÒª¾ØÐεÄ
4 ¸ö½Çµã£¬¿ÉÒÔͨ¹ýº¯Êý cv2.boxPoints() »ñµÃ¡£
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
im = cv2.drawContours(im,[box],0,(0,0,255),2) |
°ÑÕâÁ½ÖÐ±ß½ç¾ØÐÎÏÔʾÔÚÏÂͼÖУ¬ÆäÖÐÂÌÉ«µÄΪֱ¾ØÐΣ¬ºìµÄΪÐýת¾ØÐΡ£

21.2.8 ×îСÍâ½ÓÔ²
º¯Êý cv2.minEnclosingCircle() ¿ÉÒÔ°ïÎÒÃÇÕÒµ½Ò»¸ö¶ÔÏóµÄÍâÇÐÔ²¡£
ËüÊÇËùÓÐÄܹ»°üÀ¨¶ÔÏóµÄÔ²ÖÐÃæ»ý×îСµÄÒ»¸ö¡£
(x,y),radius
= cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
img = cv2.circle(img,center,radius,(0,255,0),2) |

21.2.9 ÍÖÔ²ÄâºÏ
ʹÓõĺ¯ÊýΪ cv2.ellipse()£¬·µ»ØÖµÆäʵ¾ÍÊÇÐýת±ß½ç¾ØÐεÄÄÚÇÐÔ²¡£
ellipse = cv2.fitEllipse(cnt)
im = cv2.ellipse(im,ellipse,(0,255,0),2) |

21.2.10 Ö±ÏßÄâºÏ
ÎÒÃÇ¿ÉÒÔ¸ù¾ÝÒ»×éµãÄâºÏ³öÒ»ÌõÖ±Ïߣ¬Í¬ÑùÎÒÃÇÒ²¿ÉÒÔΪͼÏñÖеİ×É«µãÄâºÏ³öÒ»ÌõÖ±Ïß¡£
rows,cols = img.shape[:2]
#cv2.fitLine(points, distType, param, reps, aeps[,
line ]) ¡ú line
#points ¨C Input vector of 2D or 3D points, stored
in std::vector<> or Mat.
#line ¨C Output line parameters. In case of 2D
fitting, it should be a vector of
#4 elements (likeVec4f) - (vx, vy, x0, y0), where
(vx, vy) is a normalized
#vector collinear to the line and (x0, y0) is
a point on the line. In case of
#3D fitting, it should be a vector of 6 elements
(like Vec6f) - (vx, vy, vz,
#x0, y0, z0), where (vx, vy, vz) is a normalized
vector collinear to the line
#and (x0, y0, z0) is a point on the line.
#distType ¨C Distance used by the
M-estimator#distType=CV_DIST_L2
#¦Ñ(r) = r2 /2 (the simplest and the fastest least-squares
method)
#param ¨C Numerical parameter ( C ) for some types
of distances. If it is 0, an optimal value
#is chosen.
#reps ¨C Sufficient accuracy for the radius (distance
between the coordinate origin and the
#line).
#aeps ¨C Sufficient accuracy for the angle. 0.01
would be a good default value for reps and
#aeps.
[vx,vy,x,y] = cv2.fitLine(cnt, cv2.DIST_L2,0,0.01,0.01)
lefty = int((-x*vy/vx) + y)
righty = int(((cols-x)*vy/vx)+y)
img = cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2) |

21.3 ÂÖÀªµÄÐÔÖÊ
±¾Ð¡½ÚÎÒÃǽ«ÒªÑ§Ï°ÌáȡһЩ¾³£Ê¹ÓõĶÔÏóÌØÕ÷¡£Äã¿ÉÒÔÔÚMatlab
regionprops documentation ¸ü¶àµÄͼÏñÌØÕ÷¡£
21.3.1 ³¤¿í±È
±ß½ç¾ØÐεĿí¸ß±È

x,y,w,h = cv2.boundingRect(cnt)
aspect_ratio = float(w)/h |
21.3.2 Extent
ÂÖÀªÃæ»ýÓë±ß½ç¾ØÐÎÃæ»ýµÄ±È¡£

area = cv2.contourArea(cnt)
x,y,w,h = cv2.boundingRect(cnt)
rect_area = w*h
extent = float(area)/rect_area |
21.3.3 Solidity
ÂÖÀªÃæ»ýÓë͹°üÃæ»ýµÄ±È¡£

area = cv2.contourArea(cnt)
hull = cv2.convexHull(cnt)
hull_area = cv2.contourArea(hull)
solidity = float(area)/hull_area |
21.3.4 Equivalent Diameter
ÓëÂÖÀªÃæ»ýÏàµÈµÄÔ²ÐεÄÖ±¾¶

area = cv2.contourArea(cnt)
equi_diameter = np.sqrt(4*area/np.pi) |
21.3.5 ·½Ïò
¶ÔÏóµÄ·½Ïò£¬ÏÂÃæµÄ·½·¨»¹»á·µ»Ø³¤ÖáºÍ¶ÌÖáµÄ³¤¶È
| (x,y),(MA,ma),angle
= cv2.fitEllipse(cnt) |
21.3.6 ÑÚÄ£ºÍÏñËØµã
ÓÐʱÎÒÃÇÐèÒª¹¹³É¶ÔÏóµÄËùÓÐÏñËØµã£¬ÎÒÃÇ¿ÉÒÔÕâÑù×ö£º
mask = np.zeros(imgray.shape,np.uint8)
# ÕâÀïÒ»¶¨ÒªÊ¹ÓòÎÊý -1, »æÖÆÌî³äµÄµÄÂÖÀª
cv2.drawContours(mask,[cnt],0,255,-1)
#Returns a tuple of arrays, one for each dimension
of a,
#containing the indices of the non-zero elements
in that dimension.
#The result of this is always a 2-D array, with
a row for
#each non-zero element.
#To group the indices by element, rather than
dimension, use:
#transpose(nonzero(a))
#>>> x = np.eye(3)
#>>> x
#array([[ 1., 0., 0.],
# [ 0., 1., 0.],
# [ 0., 0., 1.]])
#>>> np.nonzero(x)
#(array([0, 1, 2]), array([0, 1, 2]))
#>>> x[np.nonzero(x)]
#array([ 1., 1., 1.])
#>>> np.transpose(np.nonzero(x))
#array([[0, 0],
# [1, 1],
# [2, 2]])
pixelpoints = np.transpose(np.nonzero (mask))
#pixelpoints = cv2.findNonZero(mask) # ¹Ù·½´úÂë
mask = np.zeros(imgray.shape,np.uint8)
cv2.drawContours(mask,[cnt],0,255,-1)
pixelpoints = np.transpose(np.nonzero (mask))
#pixelpoints = cv2.findNonZero(mask) |
ÕâÀïÎÒÃÇÊÇÓÃÀ´Á½ÖÖ·½·¨£¬µÚÒ»ÖÖ·½·¨Ê¹ÓÃÁË Numpy º¯Êý£¬µÚ¶þÖÖʹÓÃÁË OpenCV º¯Êý¡£½á¹ûÏàͬ£¬µ«»¹ÊÇÓе㲻ͬ¡£Numpy
¸ø³öµÄ×ø±êÊÇ £¨row £¬colum £©
ÐÎʽµÄ¡£¶ø OpenCV ¸ø³öµÄ¸ñʽÊÇ £¨x £¬y £©ÐÎʽµÄ¡£ËùÒÔÕâÁ½¸ö½á¹û»ù±¾ÊÇ¿ÉÒÔ»¥»»µÄ¡£row=x£¬colunm=y¡£
21.3.7 ×î´óÖµºÍ×îСֵ¼°ËüÃǵÄλÖÃ
ÎÒÃÇ¿ÉÒÔʹÓÃÑÚģͼÏñµÃµ½ÕâЩ²ÎÊý¡£
| min_val, max_val,
min_loc, max_loc = cv2.minMaxLoc(imgray,mask =
mask) |
21.3.8 ƽ¾ùÑÕÉ«¼°Æ½¾ù»Ò¶È
ÎÒÃÇÒ²¿ÉÒÔʹÓÃÏàͬµÄÑÚÄ£ÇóÒ»¸ö¶ÔÏóµÄƽ¾ùÑÕÉ«»òƽ¾ù»Ò¶È
| min_val, max_val,
min_loc, max_loc = cv2.minMaxLoc(imgray,mask =
mask) |
21.3.9 ¼«µã
Ò»¸ö¶ÔÏó×îÉÏÃæ£¬×îÏÂÃæ£¬×î×ó±ß£¬×îÓұߵĵ㡣
leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0] |
ÈçÏÂͼËùʾ£º

Á·Ï°
1. Matlab regionprops ÎĵµÖл¹ÓÐһЩͼÏñÌØÕ÷ÎÒÃÇÔÚÕâÀïûÓн²µ½£¬Äã¿ÉÒÔ³¢ÊÔ×ÅʹÓÃ
Python ºÍ OpenCV À´ÊµÏÖËûÃÇ¡£
21.4 ÂÖÀª£º¸ü¶àº¯Êý
Ä¿±ê
ÎÒÃÇҪѧϰ
͹ȱÏÝ£¬ÒÔ¼°ÈçºÎÕÒ͹ȱÏÝ
ÕÒijһµãµ½Ò»¸ö¶à±ßÐεÄ×î¶Ì¾àÀë
²»Í¬ÐÎ×´µÄÆ¥Åä
ÔÀíÓë´úÂë
21.4.1 ͹ȱÏÝ
Ç°ÃæÎÒÃÇÒѾѧϰÁËÂÖÀªµÄ͹°ü£¬¶ÔÏóÉϵÄÈκΰ¼Ïݶ¼±»³ÉΪ͹ȱÏÝ¡£OpenCV
ÖÐÓÐÒ»¸öº¯Êý cv.convexityDefect() ¿ÉÒÔ°ïÖúÎÒÃÇÕÒµ½Í¹È±ÏÝ¡£º¯Êýµ÷ÓÃÈçÏ£º
hull = cv2.convexHull(cnt, returnPoints
= False)
defects = cv2.convexityDefects(cnt,hull) |
×¢Ò⣺Èç¹ûÒª²éÕÒ͹ȱÏÝ£¬ÔÚʹÓú¯Êý cv2.convexHull ÕÒ͹°üʱ£¬²ÎÊýreturnPoints
Ò»¶¨ÒªÊÇ False¡£
Ëü»á·µ»ØÒ»¸öÊý×飬ÆäÖÐÿһÐаüº¬µÄÖµÊÇ [Æðµã£¬Öյ㣬×îÔ¶µÄµã£¬µ½×îÔ¶µãµÄ½üËÆ¾àÀë]¡£ÎÒÃÇ¿ÉÒÔÔÚÒ»ÕÅͼÉÏÏÔʾËü¡£ÎÒÃǽ«ÆðµãºÍÖÕµãÓÃÒ»ÌõÂÌÏßÁ¬½Ó£¬ÔÚ×îÔ¶µã»Ò»¸öԲȦ£¬Òª¼ÇסµÄÊÇ·µ»Ø½á¹ûµÄǰÈý¸öÖµÊÇÂÖÀªµãµÄË÷Òý¡£
ËùÒÔÎÒÃÇ»¹Òªµ½ÂÖÀªµãÖÐÈ¥ÕÒËüÃÇ¡£
import cv2
import numpy as np
img = cv2.imread('star.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR _BGR2GRAY)
ret, thresh = cv2.threshold (img_gray, 127, 255,0)
contours,hierarchy = cv2.findContours (thresh,2,1)
cnt = contours[0] hull = cv2.convexHull(cnt,returnPoints = False)
defects = cv2.convexityDefects(cnt,hull) for i in range(defects.shape[0]):
s,e,f,d = defects[i,0]
start = tuple(cnt[s][0])
end = tuple(cnt[e][0])
far = tuple(cnt[f][0])
cv2.line(img,start,end,[0,255,0],2)
cv2.circle(img,far,5,[0,0,255],-1) cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows() |
½á¹ûÈçÏ£º

21.4.2 Point Polygon Test
Çó½âͼÏñÖеÄÒ»¸öµãµ½Ò»¸ö¶ÔÏóÂÖÀªµÄ×î¶Ì¾àÀë¡£Èç¹ûµãÔÚÂÖÀªµÄÍⲿ£¬
·µ»ØÖµÎª¸º¡£Èç¹ûÔÚÂÖÀªÉÏ£¬·µ»ØÖµÎª 0¡£Èç¹ûÔÚÂÖÀªÄÚ²¿£¬·µ»ØÖµÎªÕý¡£
ÏÂÃæÎÒÃÇÒԵ㣨50£¬50£©ÎªÀý£º
| dist = cv2.pointPolygonTest(cnt,(50,50),True) |
´Ëº¯ÊýµÄµÚÈý¸ö²ÎÊýÊÇ measureDist¡£Èç¹ûÉèÖÃΪ True£¬¾Í»á¼ÆËã×î¶Ì¾àÀë¡£Èç¹ûÊÇ False£¬Ö»»áÅжÏÕâ¸öµãÓëÂÖÀªÖ®¼äµÄλÖùØÏµ£¨·µ»ØÖµÎª+1£¬-1£¬0£©¡£
×¢Ò⣺Èç¹ûÄã²»ÐèÒªÖªµÀ¾ßÌå¾àÀ룬½¨ÒéÄ㽫µÚÈý¸ö²ÎÊýÉèΪ False£¬ÕâÑùËÙ¶È»áÌá¸ß
2 µ½ 3 ±¶¡£
21.4.3 ÐÎ×´Æ¥Åä
º¯Êý cv2.matchShape() ¿ÉÒÔ°ïÎÒÃDZȽÏÁ½¸öÐÎ×´»òÂÖÀªµÄÏàËÆ¶È¡£Èç¹û·µ»ØÖµÔ½Ð¡£¬Æ¥ÅäÔ½ºÃ¡£ËüÊǸù¾Ý
Hu ¾ØÀ´¼ÆËãµÄ¡£ÎĵµÖжԲ»Í¬µÄ·½·¨¶¼ÓнâÊÍ¡£
ÎÒÃÇÊÔ׎«ÏÂÃæµÄͼÐνøÐбȽϣº
import cv2
import numpy as np
img1 = cv2.imread('star.jpg',0)
img2 = cv2.imread('star2.jpg',0) ret, thresh = cv2.threshold(img1, 127, 255,0)
ret, thresh2 = cv2.threshold(img2, 127, 255,0)
contours,hierarchy = cv2.findContours(thresh,2,1)
cnt1 = contours[0]
contours,hierarchy = cv2.findContours (thresh2,2,1)
cnt2 = contours[0] ret = cv2.matchShapes(cnt1,cnt2,1,0.0)
print ret |
Îҵõ½µÄ½á¹ûÊÇ£º
A Óë×Ô¼ºÆ¥Åä 0.0
A Óë B Æ¥Åä 0.001946
A Óë C Æ¥Åä 0.326911
¿´¼ûÁËÂ𣬼°Ê±·¢ÉúÁËÐýת¶ÔÆ¥ÅäµÄ½á¹ûÓ°ÏìÒ²²»ÊǷdz£´ó¡£
×¢Ò⣺Hu ¾ØÊǹéÒ»»¯ÖÐÐľصÄÏßÐÔ×éºÏ£¬Ö®ËùÒÔÕâÑù×öÊÇΪÁËÄܹ»»ñÈ¡´ú±íͼÏñµÄij¸öÌØÕ÷µÄ¾Øº¯Êý£¬ÕâЩ¾Øº¯Êý¶ÔijЩ±ä»¯ÈçËõ·Å£¬Ðýת£¬¾µÏñÓ³É䣨³ýÁË
h1£©¾ßÓв»±äÐΡ£´Ë¶ÎÕª×Ô¡¶Ñ§Ï° OpenCV¡·ÖÐÎİ档
Á·Ï°
1. ´´½¨Ò»¸öС³ÌÐò£¬¿ÉÒÔ½«Í¼Æ¬ÉÏµÄµã»æÖÆ³É²»Í¬µÄÑÕÉ«£¬ÑÕÉ«ÊǸù¾ÝÕâ¸ö
µãµ½ÂÖÀªµÄ¾àÀëÀ´¾ö¶¨µÄ¡£ÒªÊ¹Óõĺ¯Êý£ºcv2.pointPolygonTest()¡£
2. ʹÓú¯Êý cv2.matchShapes() Æ¥Åä´øÓÐ×Öĸ»òÕßÊý×ÖµÄͼƬ¡£
21.5 ÂÖÀªµÄ²ã´Î½á¹¹
Ä¿±ê
ÏÖÔÚÎÒÃÇҪѧϰÂÖÀªµÄ²ã´Î½á¹¹ÁË£¬±ÈÈçÂÖÀªÖ®¼äµÄ¸¸×Ó¹ØÏµ¡£
ÔÀí
ÔÚÇ°ÃæµÄÄÚÈÝÖÐÎÒÃÇʹÓú¯Êý cv2.findContours À´²éÕÒÂÖÀª£¬ÎÒÃÇÐèÒª´«ÈëÒ»¸ö²ÎÊý£ºÂÖÀªÌáȡģʽ£¨Contour_Retrieval_Mode£©¡£ÎÒÃÇ×ÜÊǰÑËüÉèÖÃΪ
cv2.RETR_LIST »òÕßÊÇ cv2.RETR_TREE£¬Ð§¹û»¹¿ÉÒÔ¡£µ«ÊÇËüÃǵ½µ×´ú±íÊ²Ã´ÄØ£¿
ͬʱ£¬ÎÒÃǵõ½µÄ½á¹û°üº¬ 3 ¸öÊý×飬µÚÒ»¸öͼÏñ£¬µÚ¶þ¸öÊÇÂÖÀª£¬µÚÈý¸öÊDzã´Î½á¹¹¡£µ«ÊÇÎÒÃÇ´ÓÀ´Ã»ÓÐÓùý²ã´Î½á¹¹¡£²ã´Î½á¹¹ÊÇÓÃÀ´¸ÉÂïµÄÄØ£¿
²ã´Î½á¹¹ÓëÂÖÀªÌáȡģʽÓÐʲô¹ØÏµÄØ£¿
Õâ¾ÍÊÇÎÒÃDZ¾½ÚÒª½²µÄ¡£
21.5.1 ʲôÊDzã´Î½á¹¹
ͨ³£ÎÒÃÇʹÓú¯Êý cv2.findContours ÔÚͼƬÖвéÕÒÒ»¸ö¶ÔÏó¡£ÓÐʱ¶ÔÏó¿ÉÄÜλÓÚ²»Í¬µÄλÖ᣻¹ÓÐЩÇé¿ö£¬Ò»¸öÐÎ×´ÔÚÁíÍâÒ»¸öÐÎ×´µÄÄÚ²¿¡£ÕâÖÖÇé¿öÏÂÎÒÃdzÆÍⲿµÄÐÎ״Ϊ¸¸£¬ÄÚ²¿µÄÐÎ״Ϊ×Ó¡£°´ÕÕÕâÖÖ·½Ê½·ÖÀ࣬һ·ùͼÏñÖеÄËùÓÐÂÖÀªÖ®¼ä¾Í½¨Á¢¸¸×Ó¹ØÏµ¡£ÕâÑùÎÒÃǾͿÉÒÔÈ·¶¨Ò»¸öÂÖÀªÓëÆäËûÂÖÀªÊÇÔõÑùÁ¬½ÓµÄ£¬±ÈÈçËüÊDz»ÊÇij¸öÂÖÀªµÄ×ÓÂÖÀª£¬»òÕßÊǸ¸ÂÖÀª¡£ÕâÖÖ¹ØÏµ¾Í³ÉΪ×éÖ¯½á¹¹
ÏÂͼ¾ÍÊÇÒ»¸ö¼òµ¥µÄÀý×Ó£º

ÔÚÕâ·ùͼÏñÖУ¬ÎÒ¸øÕ⼸¸öÐÎ×´±àºÅΪ 0-5¡£2 ºÍ 2a ·Ö±ð´ú±í×îÍâ±ß¾ØÐεÄÍâÂÖÀªºÍÄÚÂÖÀª¡£
ÔÚÕâÀï±ßÂÖÀª 0£¬1£¬2 ÔÚÍⲿ»ò×îÍâ±ß¡£ÎÒÃÇ¿ÉÒÔ³ÆËûÃÇΪ£¨×éÖ¯½á¹¹£©0 ¼¶£¬¼òµ¥À´Ëµ¾ÍÊÇËûÃÇÊôÓÚͬһ¼¶¡£
½ÓÏÂÀ´ÂÖÀª 2a¡£ÎÒÃǰÑËüµ±³ÉÂÖÀª 2 µÄ×ÓÂÖÀª¡£Ëü¾Í³ÉΪ£¨×éÖ¯½á¹¹£©µÚ1 ¼¶¡£Í¬ÑùÂÖÀª 3 ÊÇÂÖÀª
2 µÄ×ÓÂÖÀª£¬³ÉΪ£¨×éÖ¯½á¹¹£©µÚ 3 ¼¶¡£×îºóÂÖÀª4,5 ÊÇÂÖÀª 3a µÄ×ÓÂÖÀª£¬³ÉΪ£¨×éÖ¯½á¹¹£©4
¼¶£¨×îºóÒ»¼¶£©¡£°´ÕÕÕâÖÖ·½Ê½¸øÕâЩÐÎ×´±àºÅ£¬ÎÒÃÇ¿ÉÒÔ˵ÂÖÀª 4 ÊÇÂÖÀª 3a µÄ×ÓÂÖÀª£¨µ±È»ÂÖÀª 5
Ò²ÊÇ£©¡£
ÎÒ˵Õâô¶à¾ÍÊÇΪÁ˽âÊͲã´Î½á¹¹£¬ÍâÂÖÀª£¬×ÓÂÖÀª£¬¸¸ÂÖÀª£¬×ÓÂÖÀªµÈ¡£
ÏÖÔÚÈÃÎÒÃǽøÈë OpenCV °É¡£
21.5.2 OpenCV Öвã´Î½á¹¹
²»¹Ü²ã´Î½á¹¹ÊÇʲôÑùµÄ£¬Ã¿Ò»¸öÂÖÀª¶¼°üº¬×Ô¼ºµÄÐÅÏ¢£ºËÊǸ¸£¬ËÊÇ×ӵȡ£OpenCV
ʹÓÃÒ»¸öº¬ÓÐËĸöÔªËØµÄÊý×é±íʾ¡£[Next £¬Previous £¬First_Child £¬Parent]¡£
Next ±íʾͬһ¼¶×éÖ¯½á¹¹ÖеÄÏÂÒ»¸öÂÖÀª¡£
ÒÔÉÏͼÖеÄÂÖÀª 0 ΪÀý£¬ÂÖÀª 1 ¾ÍÊÇËûµÄ Next¡£Í¬Ñù£¬ÂÖÀª 1 µÄ NextÊÇ 2£¬Next=2¡£
ÄÇÂÖÀª 2 ÄØ£¿ÔÚͬһ¼¶Ã»ÓÐ Next¡£Õâʱ Next=-1¡£¶øÂÖÀª 4 µÄ NextΪ 5£¬ËùÒÔËüµÄ
Next=5¡£
Previous ±íʾͬһ¼¶½á¹¹ÖеÄǰһ¸öÂÖÀª¡£
ÓëÇ°ÃæÒ»Ñù£¬ÂÖÀª 1 µÄ Previous ΪÂÖÀª 0£¬ÂÖÀª 2 µÄ Previous ΪÂÖÀª 1¡£ÂÖÀª
0 ûÓÐ Previous£¬ËùÒÔ Previous=-1¡£
First_Child ±íʾËüµÄµÚÒ»¸ö×ÓÂÖÀª¡£
ûÓбØÒªÔÙ½âÊÍÁË£¬ÂÖÀª 2 µÄ×ÓÂÖÀªÎª 2a¡£ËùÒÔËüµÄ First_Child Ϊ2a¡£ÄÇÂÖÀª 3a
ÄØ£¿ËüÓÐÁ½¸ö×ÓÂÖÀª¡£µ«ÊÇÎÒÃÇÖ»ÒªµÚÒ»¸ö×ÓÂÖÀª£¬ËùÒÔÊÇÂÖÀª 4£¨°´ÕÕ´ÓÉÏÍùÏ£¬´Ó×óÍùÓÒµÄ˳ÐòÅÅÐò£©¡£
Parent ±íʾËüµÄ¸¸ÂÖÀª¡£
Óë First_Child ¸ÕºÃÏà·´¡£ÂÖÀª 4 ºÍ 5 µÄ¸¸ÂÖÀªÊÇÂÖÀª 3a¡£¶øÂÖÀª 3aµÄ¸¸ÂÖÀªÊÇ
3¡£
×¢Ò⣺Èç¹ûûÓи¸»ò×Ó£¬¾ÍΪ -1¡£
ÏÖÔÚÎÒôÁ˽âÁË OpenCV ÖеÄÂÖÀª×éÖ¯½á¹¹¡£ÎÒÃÇ»¹ÊǸù¾ÝÉϱߵÄͼƬÔÙѧϰһÏ OpenCV ÖеÄÂÖÀª¼ìË÷ģʽ¡£
µ½µ×´ú±íʲôÒâ˼£¿
21.5.3 ÂÖÀª¼ìË÷ģʽ
´Ó½âÊ͵ĽǶÈÀ´¿´£¬ÕâÖÐÓ¦ÊÇ×î¼òµ¥µÄ¡£ËüÖ»ÊÇÌáÈ¡ËùÓеÄÂÖÀª£¬¶ø²»È¥´´½¨Èκθ¸×Ó¹ØÏµ¡£»»¾ä»°Ëµ¾ÍÊÇ¡°ÈËÈËÆ½µÈ¡±£¬ËüÃÇÊôÓÚͬһ¼¶×éÖ¯ÂÖÀª¡£
ËùÒÔÔÚÕâÖÖÇé¿öÏ£¬×éÖ¯½á¹¹Êý×éµÄµÚÈýºÍµÚËĸöÊý¶¼ÊÇ -1¡£µ«ÊÇ£¬ºÜÃ÷ÏÔ£¬Next ºÍ Previous
ÒªÓжÔÓ¦µÄÖµ£¬Äã¿ÉÒÔ×Ô¼ºÊÔ×Å¿´¿´¡£
ÏÂÃæ¾ÍÊÇÎҵõ½µÄ½á¹û£¬Ã¿Ò»ÐÐÊǶÔÓ¦ÂÖÀªµÄ×éÖ¯½á¹¹Ï¸½Ú¡£ÀýÈ磬µÚÒ»ÐжÔÓ¦µÄÊÇÂÖÀª 0¡£ÏÂÒ»¸öÂÖÀªÎª 1£¬ËùÒÔ
Next=1¡£Ç°ÃæÃ»ÓÐÆäËûÂÖÀª£¬ËùÒÔ Previous=0¡£½ÓÏÂÀ´µÄÁ½¸ö²ÎÊý¾ÍÊÇ -1£¬Óë¸Õ²ÅÎÒÃÇ˵µÄÒ»Ñù¡£
>>>
hierarchy
array([[[ 1, -1, -1, -1],
[ 2, 0, -1, -1],
[ 3, 1, -1, -1],
[ 4, 2, -1, -1],
[ 5, 3, -1, -1],
[ 6, 4, -1, -1],
[ 7, 5, -1, -1],
[-1, 6, -1, -1]]]) |
Èç¹ûÄã²»¹ØÐÄÂÖÀªÖ®¼äµÄ¹ØÏµ£¬ÕâÊÇÒ»¸ö·Ç³£ºÃµÄÑ¡Ôñ¡£
Èç¹ûÄãÑ¡ÔñÕâÖÖģʽµÄ»°£¬Ö»»á·µ»Ø×îÍâ±ßµÄµÄÂÖÀª£¬ËùÓеÄ×ÓÂÖÀª¶¼»á±»ºöÂÔµô¡£
ËùÒÔÔÚÉÏͼÖÐʹÓÃÕâÖÖģʽµÄ»°Ö»»á·µ»Ø×îÍâ±ßµÄÂÖÀª£¨µÚ 0 ¼¶£©£ºÂÖÀª0£¬1£¬2¡£ÏÂÃæÊÇÎÒÑ¡ÔñÕâÖÖģʽµÃµ½µÄ½á¹û£º
>>>
hierarchy
array([[[ 1, -1, -1, -1],
[ 2, 0, -1, -1],
[-1, 1, -1, -1]]]) |
µ±ÄãÖ»ÏëµÃµ½×îÍâ±ßµÄÂÖÀªÊ±£¬Äã¿ÉÒÔÑ¡ÔñÕâÖÖģʽ¡£ÕâÔÚÓÐЩÇé¿öϺÜÓÐÓá£
ÔÚÕâÖÖģʽÏ»᷵»ØËùÓеÄÂÖÀª²¢½«ÂÖÀª·ÖΪÁ½¼¶×éÖ¯½á¹¹¡£ÀýÈ磬һ¸ö¶ÔÏóµÄÍâÂÖÀªÎªµÚ 1 ¼¶×éÖ¯½á¹¹¡£¶ø¶ÔÏóÄÚ²¿Öпն´µÄÂÖÀªÎªµÚ
2 ¼¶×éÖ¯½á¹¹£¬¿Õ¶´ÖеÄÈκζÔÏóµÄÂÖÀªÓÖÊÇµÚ 1 ¼¶×éÖ¯½á¹¹¡£¿Õ¶´µÄ×éÖ¯½á¹¹ÎªµÚ 2 ¼¶¡£
ÏëÏóÒ»ÏÂÒ»¸±ºÚµ×°××ÖµÄͼÏñ£¬Í¼ÏñÖÐÊÇÊý×Ö 0¡£0 µÄÍâ±ß½çÊôÓÚµÚÒ»¼¶×éÖ¯½á¹¹£¬0 µÄÄÚ²¿ÊôÓÚµÚ 2
¼¶×éÖ¯½á¹¹¡£
ÎÒÃÇ¿ÉÒÔÒÔÏÂͼΪÀý¼òµ¥½éÉÜһϡ£ÎÒÃÇÒѾÓúìÉ«Êý×ÖΪÕâЩÂÖÀª±àºÅ£¬²¢ÓÃÂÌÉ«Êý×Ö´ú±íËüÃǵÄ×éÖ¯½á¹¹¡£Ë³ÐòÓë
OpenCV ¼ì²âÂÖÀªµÄ˳ÐòÒ»Ö±¡£

ÏÖÔÚÎÒÃÇ¿¼ÂÇÂÖÀª 0£¬ËüµÄ×éÖ¯½á¹¹ÎªµÚ 1 ¼¶¡£ÆäÖÐÓÐÁ½¸ö¿Õ¶´ 1
ºÍ 2£¬ËüÃÇÊôÓÚµÚ 2 ¼¶×éÖ¯½á¹¹¡£ËùÒÔ¶ÔÓÚÂÖÀª 0 À´Ëµ¸úËûÊôÓÚͬһ¼¶×éÖ¯½á¹¹µÄÏÂÒ»¸ö£¨Next£©ÊÇÂÖÀª
3£¬²¢ÇÒûÓÐ Previous¡£ËüµÄ Fist_Child ΪÂÖÀª 1£¬×éÖ¯½á¹¹Îª 2¡£ÓÉÓÚËüÊǵÚ
1 ¼¶£¬ËùÒÔûÓи¸ÂÖÀª¡£Òò´ËËüµÄ×éÖ¯½á¹¹Êý×éΪ[3£¬-1£¬1£¬-1]¡£
ÏÖÔÚÊÇÂÖÀª 1£¬ËüÊÇµÚ 2 ¼¶¡£´¦ÓÚͬһ¼¶µÄÏÂÒ»¸öÂÖÀªÎª 2¡£Ã»ÓÐ
Previous£¬Ò²Ã»ÓÐ Child£¬£¨ÒòΪÊÇµÚ 2 ¼¶ËùÒÔÓи¸ÂÖÀª£©¸¸ÂÖÀªÊÇ 0¡£ËùÒÔÊý×éÊÇ[2£¬-1£¬-1£¬0]¡£
ÂÖÀª 2£ºËüÊÇµÚ 2 ¼¶¡£ÔÚͬһ¼¶µÄ×éÖ¯½á¹¹ÖÐûÓÐ Next¡£Previous
ΪÂÖÀª 1¡£Ã»ÓÐ×Ó£¬¸¸ÂÖÀªÎª 0£¬ËùÒÔÊý×éÊÇ [-1£¬1£¬-1£¬0]
ÂÖÀª 3£ºËüÊÇµÚ 1 ¼¶¡£ÔÚͬһ¼¶µÄ×éÖ¯½á¹¹ÖÐ Next Ϊ 5¡£Previous
ΪÂÖÀª 0¡£×ÓΪ 4£¬Ã»Óи¸ÂÖÀª£¬ËùÒÔÊý×éÊÇ [5£¬0£¬4£¬-1]ÂÖÀª 4£ºËüÊÇµÚ 2 ¼¶¡£ÔÚͬһ¼¶µÄ×éÖ¯½á¹¹ÖÐûÓÐ
Next¡£Ã»ÓÐ Previous£¬Ã»ÓÐ×Ó£¬¸¸ÂÖÀªÎª 3£¬ËùÒÔÊý×éÊÇ [-1£¬-1£¬-1£¬3]
ÏÂÃæÊÇÎҵõ½µÄ´ð°¸£º
>>>
hierarchy
array([[[ 3, -1, 1, -1],
[ 2, -1, -1, 0],
[-1, 1, -1, 0],
[ 5, 0, 4, -1],
[-1, -1, -1, 3],
[ 7, 3, 6, -1],
[-1, -1, -1, 5],
[ 8, 5, -1, -1],
[-1, 7, -1, -1]]]) |
ÖÕÓÚµ½×îºóÒ»¸öÁË£¬Ò²ÊÇ×îÍêÃÀµÄÒ»¸ö¡£ÕâÖÖģʽÏ»᷵»ØËùÓÐÂÖÀª£¬²¢ÇÒ´´½¨Ò»¸öÍêÕûµÄ×éÖ¯½á¹¹ÁÐ±í¡£ËüÉõÖÁ»á¸æËßÄãËÊÇÒ¯Ò¯£¬°Ö°Ö£¬¶ù×Ó£¬Ëï×ӵȡ£
»¹ÊÇÒÔÉÏͼΪÀý£¬Ê¹ÓÃÕâÖÖģʽ£¬¶Ô OpenCV ·µ»ØµÄ½á¹ûÖØÐÂÅÅÐò²¢·ÖÎöËü£¬ºìÉ«Êý×ÖÊDZ߽çµÄÐòºÅ£¬ÂÌÉ«ÊÇ×éÖ¯½á¹¹¡£

ÂÖÀª 0 µÄ×éÖ¯½á¹¹Îª 0£¬Í¬Ò»¼¶ÖÐ Next Ϊ 7£¬Ã»ÓÐ Previous¡£×ÓÂÖÀªÊÇ 1£¬Ã»Óи¸ÂÖÀª¡£ËùÒÔÊý×éÊÇ
[7£¬-1£¬1£¬-1]¡£
ÂÖÀª 1 µÄ×éÖ¯½á¹¹Îª 1£¬Í¬Ò»¼¶ÖÐûÓÐÆäËû£¬Ã»ÓÐ Previous¡£×ÓÂÖÀªÊÇ2£¬¸¸ÂÖÀªÎª 0¡£ËùÒÔÊý×éÊÇ
[-1£¬-1£¬2£¬0]¡£
ʣϵÄ×Ô¼ºÊÔÊÔ¼ÆËãһϰɡ£ÏÂÃæÊǽá¹û£º
>>>
hierarchy
array([[[ 7, -1, 1, -1],
[-1, -1, 2, 0],
[-1, -1, 3, 1],
[-1, -1, 4, 2],
[-1, -1, 5, 3],
[ 6, -1, -1, 4],
[-1, 5, -1, 4],
[ 8, 0, -1, -1],
[-1, 7, -1, -1]]]) |
|