如何解决实时对象跟踪——如何让视频一开始播放,让用户暂停,绘制边界框,然后开始跟踪?
<div className="details__info">
<div className="details__incDec">
<span className="dec" onClick={decQuantity}><BsDash /></span>
<span className="quantity">{quantity}</span>
<span className="inc" onClick={() => setQuantity(quantity + 1)}><bsplus /></span>
{localStorage.getItem('email')
? <button style={{outline: 'none',fontFamily: "'Comfortaa',cursive"}} className="btn-default" onClick={cartData}>add to cart</button>
: <button style={{outline: 'none',cursive"}} className="btn-default" onClick={signUpToBuy}>add to cart</button>
}
{localStorage.getItem('email')
? <RiHeart3Fill className="heart"/>
: <RiHeart3Fill className="heart" style={{color:iconColor}} onClick={()=>setIconColor("red")}/>
}
</div>
</div>
它工作正常,但是当您运行程序时,它会在第一帧暂停,直到您绘制边界框以开始跟踪。
我想让视频先播放,然后用户应该能够暂停它,绘制边界框,然后恢复视频以开始跟踪。为此,我替换了以下内容:
import cv2
import sys
major_ver,minor_ver,subminor_ver = cv2.__version__.split('.')
if __name__ == '__main__' :
# Set up tracker.
tracker_types = ['BOOSTING','MIL','kcf','TLD','MEDIANFLOW','GOTURN','MOSSE','CSRT']
tracker_type = tracker_types[1]
if int(minor_ver) < 3:
tracker = cv2.Tracker_create(tracker_type)
else:
if tracker_type == 'BOOSTING':
tracker = cv2.TrackerBoosting_create()
if tracker_type == 'MIL':
tracker = cv2.TrackerMIL_create()
if tracker_type == 'kcf':
tracker = cv2.Trackerkcf_create()
if tracker_type == 'TLD':
tracker = cv2.TrackerTLD_create()
if tracker_type == 'MEDIANFLOW':
tracker = cv2.TrackerMedianFlow_create()
if tracker_type == 'GOTURN':
tracker = cv2.TrackerGOTURN_create()
if tracker_type == 'MOSSE':
tracker = cv2.TrackerMOSSE_create()
if tracker_type == "CSRT":
tracker = cv2.TrackerCSRT_create()
# Read video
video = cv2.VideoCapture(0) # 0 means webcam. Otherwise if you want to use a video file,replace 0 with "video_file.MOV")
# Exit if video not opened.
if not video.isOpened():
print ("Could not open video")
sys.exit()
# Read first frame.
ok,frame = video.read()
if not ok:
print ('Cannot read video file')
sys.exit()
# Define an initial bounding Box
bBox = (287,23,86,320)
# Uncomment the line below to select a different bounding Box
bBox = cv2.selectROI(frame,False)
# Initialize tracker with first frame and bounding Box
ok = tracker.init(frame,bBox)
while True:
# Read a new frame
ok,frame = video.read()
if not ok:
break
# Start timer
timer = cv2.getTickCount()
# Update tracker
ok,bBox = tracker.update(frame)
# Calculate Frames per second (FPS)
fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);
# Draw bounding Box
if ok:
# Tracking success
p1 = (int(bBox[0]),int(bBox[1]))
p2 = (int(bBox[0] + bBox[2]),int(bBox[1] + bBox[3]))
cv2.rectangle(frame,p1,p2,(255,0),2,1)
else :
# Tracking failure
cv2.putText(frame,"Tracking failure detected",(100,80),cv2.FONT_HERShey_SIMPLEX,0.75,(0,255),2)
# display tracker type on frame
cv2.putText(frame,tracker_type + " Tracker",20),(50,170,50),2);
# display FPS on frame
cv2.putText(frame,"FPS : " + str(int(fps)),2);
# display result
cv2.imshow("Tracking",frame)
# Exit if ESC pressed
k = cv2.waitKey(1) & 0xff
if k == 27 : break
这样:
# Read video
video = cv2.VideoCapture(0) # 0 means webcam. Otherwise if you want to use a video file,frame = video.read()
if not ok:
print ('Cannot read video file')
sys.exit()
# Define an initial bounding Box
bBox = (287,bBox)
当我现在运行程序时,视频一开始就开始播放,但是我一按 while True:
# Read video
video = cv2.VideoCapture(0) # 0 means webcam. Otherwise if you want to use a video file,replace 0 with "video_file.MOV")
# Exit if video not opened.
if not video.isOpened():
print ("Could not open video")
sys.exit()
# Read first frame.
ok,frame = video.read()
if not ok:
print ('Cannot read video file')
sys.exit()
# Retrieve an image and display it.
if(0xFF & cv2.waitKey(10))==ord('p'): # Press key `p` to pause the video to start tracking
break
cv2.namedWindow("Image",cv2.WINDOW_norMAL)
cv2.imshow("Image",frame)
cv2.destroyWindow("Image")
,Python 就崩溃了:
我该如何解决这个问题?
编辑:为了清楚起见,在此处粘贴带有替换/替换的整个代码:
p
解决方法
你的 if 语句在错误的地方有括号
if(0xFF & cv2.waitKey(10))==ord('p'):
应该
if ((0xFF & cv2.waitKey(10)) == ord('p')):
虽然如果你使用 ord() 你可以直接比较
if (cv2.waitKey(10) == ord('p')):
这是经过一些编辑的代码。它适用于跟踪我的脸。
import cv2
import sys
major_ver,minor_ver,subminor_ver = cv2.__version__.split('.')
if __name__ == '__main__' :
# Set up tracker.
tracker_types = ['BOOSTING','MIL','KCF','TLD','MEDIANFLOW','GOTURN','MOSSE','CSRT']
tracker_type = tracker_types[1]
if int(minor_ver) < 3:
tracker = cv2.Tracker_create(tracker_type)
else:
if tracker_type == 'BOOSTING':
tracker = cv2.TrackerBoosting_create()
if tracker_type == 'MIL':
tracker = cv2.TrackerMIL_create()
if tracker_type == 'KCF':
tracker = cv2.TrackerKCF_create()
if tracker_type == 'TLD':
tracker = cv2.TrackerTLD_create()
if tracker_type == 'MEDIANFLOW':
tracker = cv2.TrackerMedianFlow_create()
if tracker_type == 'GOTURN':
tracker = cv2.TrackerGOTURN_create()
if tracker_type == 'MOSSE':
tracker = cv2.TrackerMOSSE_create()
if tracker_type == "CSRT":
tracker = cv2.TrackerCSRT_create()
# Read video
video = cv2.VideoCapture(0) # 0 means webcam. Otherwise if you want to use a video file,replace 0 with "video_file.MOV")
# Exit if video not opened.
if not video.isOpened():
print ("Could not open video")
sys.exit()
while True:
# Read first frame.
ok,frame = video.read()
if not ok:
print ('Cannot read video file')
sys.exit()
# Retrieve an image and Display it.
if((0xFF & cv2.waitKey(10))==ord('p')): # Press key `p` to pause the video to start tracking
break
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.imshow("Image",frame)
cv2.destroyWindow("Image");
# select the bounding box
bbox = (287,23,86,320)
# Uncomment the line below to select a different bounding box
bbox = cv2.selectROI(frame,False)
# Initialize tracker with first frame and bounding box
ok = tracker.init(frame,bbox)
while True:
# Read a new frame
ok,frame = video.read()
if not ok:
break
# Start timer
timer = cv2.getTickCount()
# Update tracker
ok,bbox = tracker.update(frame)
# Calculate Frames per second (FPS)
fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);
# Draw bounding box
if ok:
# Tracking success
p1 = (int(bbox[0]),int(bbox[1]))
p2 = (int(bbox[0] + bbox[2]),int(bbox[1] + bbox[3]))
cv2.rectangle(frame,p1,p2,(255,0),2,1)
else :
# Tracking failure
cv2.putText(frame,"Tracking failure detected",(100,80),cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,255),2)
# Display tracker type on frame
cv2.putText(frame,tracker_type + " Tracker",20),(50,170,50),2);
# Display FPS on frame
cv2.putText(frame,"FPS : " + str(int(fps)),2);
# Display result
cv2.imshow("Tracking",frame)
# Exit if ESC pressed
k = cv2.waitKey(1) & 0xff
if k == 27 : break
我将 videocapture 声明移到了循环之外,这样它就不会在每次循环迭代中都被重建。我在第一次和第二次循环之间重新添加了 ROI 选择器和跟踪器初始化。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。