问题摘要
我试图通过在这些关键点的热图上运行一个循环并将阈值设置为 200 来运行一个用于获取鼻子和颈部关键点的 python 脚本。它适用于单个图像。但是,我尝试修改我的脚本以适用于网络摄像头,而我用于热图的完全相同的循环引发了“列表索引超出范围”错误。我很难理解为什么会这样以及如何调试它。
另外,如果其他人已经实现了类似的东西,请告诉我你是如何做到的。
这是引发错误的代码部分的片段:
opWrapper = op.WrapperPython()
opWrapper.configure(params)
opWrapper.start()
start = time.time()
Process Image
print("[INFO] starting video stream...")
#vs = VideoStream(src=0).start()
video = cv2.VideoCapture(0)
while True:
ret, imageToProcess = video.read()
datum = op.Datum()
datum.cvInputData = imageToProcess
opWrapper.emplaceAndPop([datum])
# Process outputs
outputImageF = (datum.inputNetData[0].copy())[0,:,:,:] + 0.5
outputImageF = cv2.merge([outputImageF[0,:,:], outputImageF[1,:,:], outputImageF[2,:,:]])
outputImageF = (outputImageF*255.).astype(dtype='uint8')
heatmaps = datum.poseHeatMaps.copy()
heatmaps = (heatmaps).astype(dtype='uint8')
print(heatmaps.shape)
print(imageToProcess.shape)
coord_nose=[]
coord_neck=[]
for i, j in itertools.product(range(heatmaps.shape[1]), range(heatmaps.shape[2])):
if heatmaps[0][i][j]>200:
print(i,j)
coord_nose.append([j,i])
if heatmaps[1][i][j]>200:
coord_neck.append([j,i])
circle = cv2.circle(outputImageF,tuple(coord_nose[0]),5,(0,0,255),-1)
circle1 = cv2.circle(outputImageF,tuple(coord_neck[0]),5,(0,255,0),-1)
cv2.imshow("OpenPose 1.6.0 - Tutorial Python API", outputImageF)
end=time.time()
print(end-start)
if cv2.waitKey(1) & 0xFF == ord('q'): # press q to quit program
video.release()
cv2.destroyAllWindows()
引发错误的循环:
for i, j in itertools.product(range(heatmaps.shape[1]), range(heatmaps.shape[2])):
if heatmaps[0][i][j]>200:
print(i,j)
coord_nose.append([j,i])
if heatmaps[1][i][j]>200:
coord_neck.append([j,i])
控制台输出(有错误):
(25, 176, 320) <-- shape of heatmaps
(720, 1280, 3) <--- shape of my input image
list index out of range