¸üÐÂʱ¼ä:2021Äê07ÔÂ27ÈÕ15ʱ24·Ö À´Ô´:ÀÖÓãµç¾º ä¯ÀÀ´ÎÊý:
meanshiftËã·¨µÄÔÀíºÜ¼òµ¥¡£¼ÙÉèÄãÓÐÒ»¶Ñµã¼¯£¬»¹ÓÐÒ»¸öСµÄ´°¿Ú£¬Õâ¸ö´°¿Ú¿ÉÄÜÊÇÔ²Ðεģ¬ÏÖÔÚÄã¿ÉÄÜÒªÒÆ¶¯Õâ¸ö´°¿Úµ½µã¼¯ÃܶÈ×î´óµÄÇøÓòµ±ÖС£
ÈçÏÂͼ£º

×ʼµÄ´°¿ÚÊÇÀ¶É«Ô²»·µÄÇøÓò£¬ÃüÃûΪC1¡£À¶É«Ô²»·µÄÔ²ÐÄÓÃÒ»¸öÀ¶É«µÄ¾ØÐαê×¢£¬ÃüÃûΪC1_o¡£
¶ø´°¿ÚÖÐËùÓеãµÄµã¼¯¹¹³ÉµÄÖÊÐÄÔÚÀ¶É«Ô²ÐεãC1_r´¦£¬ÏÔȻԲ»·µÄÐÎÐĺÍÖÊÐIJ¢²»Öغϡ£ËùÒÔ£¬Òƶ¯À¶É«µÄ´°¿Ú£¬Ê¹µÃÐÎÐÄÓë֮ǰµÃµ½µÄÖÊÐÄÖØºÏ¡£ÔÚÐÂÒÆ¶¯ºóµÄÔ²»·µÄÇøÓòµ±ÖÐÔÙ´ÎѰÕÒÔ²»·µ±ÖÐËù°üΧµã¼¯µÄÖÊÐÄ£¬È»ºóÔÙ´ÎÒÆ¶¯£¬Í¨³£Çé¿öÏ£¬ÐÎÐĺÍÖÊÐÄÊDz»Öغϵġ£²»¶ÏÖ´ÐÐÉÏÃæµÄÒÆ¶¯¹ý³Ì£¬Ö±µ½ÐÎÐĺÍÖÊÐÄ´óÖÂÖØºÏ½áÊø¡£ ÕâÑù£¬×îºóÔ²ÐεĴ°¿Ú»áÂäµ½ÏñËØ·Ö²¼×î´óµÄµØ·½£¬Ò²¾ÍÊÇͼÖеÄÂÌɫȦ£¬ÃüÃûΪC2¡£
meanshiftËã·¨³ýÁËÓ¦ÓÃÔÚÊÓÆµ×·×Ùµ±ÖУ¬ÔÚ¾ÛÀ࣬ƽ»¬µÈµÈ¸÷ÖÖÉæ¼°µ½Êý¾ÝÒÔ¼°·Ç¼à¶½Ñ§Ï°µÄ³¡ºÏµ±ÖоùÓÐÖØÒªÓ¦Óã¬ÊÇÒ»¸öÓ¦Óù㷺µÄËã·¨¡£
ͼÏñÊÇÒ»¸ö¾ØÕóÐÅÏ¢£¬ÈçºÎÔÚÒ»¸öÊÓÆµµ±ÖÐʹÓÃmeanshiftËã·¨À´×·×ÙÒ»¸öÔ˶¯µÄÎïÌåÄØ? ´óÖÂÁ÷³ÌÈçÏ£º
1.Ê×ÏÈÔÚͼÏñÉÏÑ¡¶¨Ò»¸öÄ¿±êÇøÓò
2.¼ÆËãÑ¡¶¨ÇøÓòµÄÖ±·½Í¼·Ö²¼£¬Ò»°ãÊÇHSVÉ«²Ê¿Õ¼äµÄÖ±·½Í¼¡£
3.¶ÔÏÂһ֡ͼÏñbͬÑù¼ÆËãÖ±·½Í¼·Ö²¼¡£
4.¼ÆËãͼÏñbµ±ÖÐÓëÑ¡¶¨ÇøÓòÖ±·½Í¼·Ö²¼×îΪÏàËÆµÄÇøÓò£¬Ê¹ÓÃmeanshiftËã·¨½«Ñ¡¶¨ÇøÓòÑØ×Å×îΪÏàËÆµÄ²¿·Ö½øÐÐÒÆ¶¯£¬Ö±µ½ÕÒµ½×îÏàËÆµÄÇøÓò£¬±ãÍê³ÉÁËÔÚͼÏñbÖеÄÄ¿±ê×·×Ù¡£
5.ÖØ¸´3µ½4µÄ¹ý³Ì£¬¾ÍÍê³ÉÕû¸öÊÓÆµÄ¿±ê×·×Ù¡£
ͨ³£Çé¿öÏÂÎÒÃÇʹÓÃÖ±·½Í¼·´ÏòͶӰµÃµ½µÄͼÏñºÍµÚÒ»Ö¡Ä¿±ê¶ÔÏóµÄÆðʼλÖ㬵±Ä¿±ê¶ÔÏóµÄÒÆ¶¯»á·´Ó³µ½Ö±·½Í¼·´ÏòͶӰͼÖУ¬meanshift Ëã·¨¾Í°ÑÎÒÃǵĴ°¿ÚÒÆ¶¯µ½·´ÏòͶӰͼÏñÖлҶÈÃܶÈ×î´óµÄÇøÓòÁË¡£ÈçÏÂͼËùʾ£º

Ö±·½Í¼·´ÏòͶӰµÄÁ÷³ÌÊÇ£º
¼ÙÉèÎÒÃÇÓÐÒ»ÕÅ100x100µÄÊäÈëͼÏñ£¬ÓÐÒ»ÕÅ10x10µÄÄ£°åͼÏñ£¬²éÕҵĹý³ÌÊÇÕâÑùµÄ£º
1.´ÓÊäÈëͼÏñµÄ×óÉϽÇ(0,0)¿ªÊ¼£¬ÇиîÒ»¿é(0,0)ÖÁ(10,10)µÄÁÙʱͼÏñ;
2.Éú³ÉÁÙʱͼÏñµÄÖ±·½Í¼;
3.ÓÃÁÙʱͼÏñµÄÖ±·½Í¼ºÍÄ£°åͼÏñµÄÖ±·½Í¼¶Ô±È£¬¶Ô±È½á¹û¼ÇΪc;
4.Ö±·½Í¼¶Ô±È½á¹ûc£¬¾ÍÊǽá¹ûͼÏñ(0,0)´¦µÄÏñËØÖµ;
5.ÇиîÊäÈëͼÏñ´Ó(0,1)ÖÁ(10,11)µÄÁÙʱͼÏñ£¬¶Ô±ÈÖ±·½Í¼£¬²¢¼Ç¼µ½½á¹ûͼÏñ;
6.ÖØ¸´1¡«5²½Ö±µ½ÊäÈëͼÏñµÄÓÒϽǣ¬¾ÍÐγÉÁËÖ±·½Í¼µÄ·´ÏòͶӰ¡£
ÔÚOpenCVÖÐʵÏÖMeanshiftµÄAPIÊÇ£º
cv.meanShift(probImage, window, criteria)
²ÎÊý£º
·probImage: ROIÇøÓò£¬¼´Ä¿±êµÄÖ±·½Í¼µÄ·´ÏòͶӰ
·window£º ³õʼËÑË÷´°¿Ú£¬¾ÍÊǶ¨ÒåROIµÄrect
·criteria: È·¶¨´°¿ÚËÑË÷Í£Ö¹µÄ×¼Ôò£¬Ö÷ÒªÓеü´ú´ÎÊý´ïµ½ÉèÖõÄ×î´óÖµ£¬´°¿ÚÖÐÐĵį¯ÒÆÖµ´óÓÚij¸öÉ趨µÄÏÞÖµµÈ¡£
ʵÏÖMeanshiftµÄÖ÷ÒªÁ÷³ÌÊÇ£º
1.¶ÁÈ¡ÊÓÆµÎļþ£ºcv.videoCapture()
2.¸ÐÐËÈ¤ÇøÓòÉèÖ㺻ñÈ¡µÚһ֡ͼÏñ£¬²¢ÉèÖÃÄ¿±êÇøÓò£¬¼´¸ÐÐËÈ¤ÇøÓò
3.¼ÆËãÖ±·½Í¼£º¼ÆËã¸ÐÐËÈ¤ÇøÓòµÄHSVÖ±·½Í¼£¬²¢½øÐйéÒ»»¯
4.Ä¿±ê×·×Ù£ºÉèÖô°¿ÚËÑË÷Í£Ö¹Ìõ¼þ£¬Ö±·½Í¼·´ÏòͶӰ£¬½øÐÐÄ¿±ê×·×Ù£¬²¢ÔÚÄ¿±êλÖûæÖƾØÐοò¡£
ʾÀý£º
import numpy as np
import cv2 as cv
# 1.»ñȡͼÏñ
cap = cv.VideoCapture('DOG.wmv')
# 2.»ñÈ¡µÚһ֡ͼÏñ£¬²¢Ö¸¶¨Ä¿±êλÖÃ
ret,frame = cap.read()
# 2.1 Ä¿±êλÖã¨ÐУ¬¸ß£¬ÁУ¬¿í£©
r,h,c,w = 197,141,0,208
track_window = (c,r,w,h)
# 2.2 Ö¸¶¨Ä¿±êµÄ¸ÐÐËÈ¤ÇøÓò
roi = frame[r:r+h, c:c+w]
# 3. ¼ÆËãÖ±·½Í¼
# 3.1 ת»»É«²Ê¿Õ¼ä£¨HSV£©
hsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
# 3.2 È¥³ýµÍÁÁ¶ÈµÄÖµ
# mask = cv.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
# 3.3 ¼ÆËãÖ±·½Í¼
roi_hist = cv.calcHist([hsv_roi],[0],None,[180],[0,180])
# 3.4 ¹éÒ»»¯
cv.normalize(roi_hist,roi_hist,0,255,cv.NORM_MINMAX)
# 4. Ä¿±ê×·×Ù
# 4.1 ÉèÖô°¿ÚËÑË÷ÖÕÖ¹Ìõ¼þ£º×î´óµü´ú´ÎÊý£¬´°¿ÚÖÐÐÄÆ¯ÒÆ×îСֵ
term_crit = ( cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1 )
while(True):
# 4.2 »ñȡÿһ֡ͼÏñ
ret ,frame = cap.read()
if ret == True:
# 4.3 ¼ÆËãÖ±·½Í¼µÄ·´ÏòͶӰ
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
dst = cv.calcBackProject([hsv],[0],roi_hist,[0,180],1)
# 4.4 ½øÐÐmeanshift×·×Ù
ret, track_window = cv.meanShift(dst, track_window, term_crit)
# 4.5 ½«×·×ÙµÄλÖûæÖÆÔÚÊÓÆµÉÏ£¬²¢½øÐÐÏÔʾ
x,y,w,h = track_window
img2 = cv.rectangle(frame, (x,y), (x+w,y+h), 255,2)
cv.imshow('frame',img2)
if cv.waitKey(60) & 0xFF == ord('q'):
break
else:
break
# 5. ×ÊÔ´ÊÍ·Å
cap.release()
cv.destroyAllWindows()
ÏÂÃæÊÇÈý֡ͼÏñµÄ¸ú×Ù½á¹û£º

´ó¼ÒÈÏÕæ¿´ÏÂÉÏÃæµÄ½á¹û£¬ÓÐÒ»¸öÎÊÌ⣬¾ÍÊǼì²âµÄ´°¿ÚµÄ´óСÊǹ̶¨µÄ£¬¶ø¹·¹·Óɽü¼°Ô¶ÊÇÒ»¸öÖð½¥±äСµÄ¹ý³Ì£¬¹Ì¶¨µÄ´°¿ÚÊDz»ºÏÊʵġ£ËùÒÔÎÒÃÇÐèÒª¸ù¾ÝÄ¿±êµÄ´óСºÍ½Ç¶ÈÀ´¶Ô´°¿ÚµÄ´óСºÍ½Ç¶È½øÐÐÐÞÕý¡£CamShift¿ÉÒÔ°ïÎÒÃǽâ¾öÕâ¸öÎÊÌâ¡£
CamShiftË㷨ȫ³ÆÊÇ“Continuously Adaptive Mean-Shift”(Á¬Ðø×ÔÊÊÓ¦MeanShiftËã·¨)£¬ÊǶÔMeanShiftËã·¨µÄ¸Ä½øËã·¨£¬¿ÉËæ×Ÿú×ÙÄ¿±êµÄ´óС±ä»¯ÊµÊ±µ÷ÕûËÑË÷´°¿ÚµÄ´óС£¬¾ßÓнϺõĸú×ÙЧ¹û¡£
CamshiftËã·¨Ê×ÏÈÓ¦ÓÃmeanshift£¬Ò»µ©meanshiftÊÕÁ²£¬Ëü¾Í»á¸üд°¿ÚµÄ´óС£¬»¹¼ÆËã×î¼ÑÄâºÏÍÖÔ²µÄ·½Ïò£¬´Ó¶ø¸ù¾ÝÄ¿±êµÄλÖúʹóС¸üÐÂËÑË÷´°¿Ú¡£ÈçÏÂͼËùʾ£º

CamshiftÔÚOpenCVÖÐʵÏÖʱ£¬Ö»Ð轫ÉÏÊöµÄmeanshiftº¯Êý¸ÄΪCamshiftº¯Êý¼´¿É£º
½«CamshiftÖеģº
# 4.4 ½øÐÐmeanshift×·×Ù
ret, track_window = cv.meanShift(dst, track_window, term_crit)
# 4.5 ½«×·×ÙµÄλÖûæÖÆÔÚÊÓÆµÉÏ£¬²¢½øÐÐÏÔʾ
x,y,w,h = track_window
img2 = cv.rectangle(frame, (x,y), (x+w,y+h), 255,2)
¸ÄΪ£º
#½øÐÐcamshift×·×Ù
ret, track_window = cv.CamShift(dst, track_window, term_crit)
# »æÖÆ×·×Ù½á¹û
pts = cv.boxPoints(ret)
pts = np.int0(pts)
img2 = cv.polylines(frame,[pts],True, 255,2)
meanshift
ÔÀí£ºÒ»¸öµü´úµÄ²½Ö裬¼´ÏÈËã³öµ±Ç°µãµÄÆ«ÒÆ¾ùÖµ£¬Òƶ¯¸Ãµãµ½ÆäÆ«ÒÆ¾ùÖµ£¬È»ºóÒÔ´ËΪÐÂµÄÆðʼµã£¬¼ÌÐøÒÆ¶¯£¬Ö±µ½Âú×ãÒ»¶¨µÄÌõ¼þ½áÊø¡£
API£ºcv.meanshift()
ÓÅȱµã£º¼òµ¥£¬µü´ú´ÎÊýÉÙ£¬µ«ÎÞ·¨½â¾öÄ¿±êµÄÕÚµ²ÎÊÌâ²¢ÇÒ²»ÄÜÊÊÓ¦Ô˶¯Ä¿±êµÄµÄÐÎ×´ºÍ´óС±ä»¯
camshift
ÔÀí£º¶ÔmeanshiftËã·¨µÄ¸Ä½ø£¬Ê×ÏÈÓ¦ÓÃmeanshift£¬Ò»µ©meanshiftÊÕÁ²£¬Ëü¾Í»á¸üд°¿ÚµÄ´óС£¬»¹¼ÆËã×î¼ÑÄâºÏÍÖÔ²µÄ·½Ïò£¬´Ó¶ø¸ù¾ÝÄ¿±êµÄλÖúʹóС¸üÐÂËÑË÷´°¿Ú¡£
API£ºcv.camshift()
ÓÅȱµã£º¿ÉÊÊÓ¦Ô˶¯Ä¿±êµÄ´óСÐÎ×´µÄ¸Ä±ä£¬¾ßÓнϺõĸú×ÙЧ¹û£¬µ«µ±±³¾°É«ºÍÄ¿±êÑÕÉ«½Ó½üʱ£¬ÈÝÒ×ʹĿ±êµÄÇøÓò±ä´ó£¬×îÖÕÓпÉÄܵ¼ÖÂÄ¿±ê¸ú×Ù¶ªÊ§
¡¶Í¼Ïñ´¦ÀíOpenCVÈëÃŽ̡̳·¿Î³Ìµ¼¶Á
¼ÓQQ£º435946716£¬»ñÈ¡¡¶Í¼Ïñ´¦ÀíOpenCVÈëÃŽ̡̳·È«Ì×ÊÓÆµ½Ì³Ì+±Ê¼Ç+Ô´Âë¡£
²ÂÄãϲ»¶£º
OpenCVͼƬÏà¼ÓºÍ»ìºÏµÄ·½·¨
ʲôÊÇOpenCV£¿OpenCV°²×°½Ì³Ì
ÓïÑÔÄ£ÐÍ-BERT£ºbertËã·¨½éÉÜ
ÀÖÓãµç¾ºÈ˹¤ÖÇÄÜ¿ª·¢¿Î³Ì
±±¾©Ð£Çø