TypeError:不能将序列乘以类型'模块'的非int。

时间:2017-05-18 11:52:29

标签: python opencv computer-vision sequence

初级水平

在此代码中speed是键盘输入,distance具有开始,中间和结束值以及时间不同,因此我编写了使用distance = speed * time公式的代码,但它不是工作

为什么我会收到此错误以及可能的解决方案?

import numpy as np
import cv2
import time

cap = cv2.VideoCapture(0) #input object

# frames iterator
i = 0;

# To capture number of frames
no_of_frames = 0

# coordinates to print time on x and y location
x = 30
y = 30

# take speed as input from keyboard
speed = input()

#total distance
start_distance = 0
total_distance = 75
mid_distance = int(total_distance / 2)

# video start time
start_time = time.time()

# start capturing frames
while(cap.isOpened()):    
    ret, frame = cap.read()
    if ret==True:
        cv2.imshow('frame',frame)

        distance = speed * time         
        # capture frame
        #if t == start_distance or t == mid_distance or t == total_distance:
        if distance == start_distance or distance == mid_distance or distance == total_distance:

            # calculate time
            hours, rem = divmod(time.time() - start_time, 3600)
            minutes, seconds = divmod(rem, 60)

            # set elapsed time
            elapsed_time = "{:0>2}:{:0>2}:{:05.2f}".format(int(hours),int(minutes),seconds)

            # print elapsed time on frame
            cv2.putText(frame,str(elapsed_time), (x,y), cv2.FONT_HERSHEY_PLAIN, 1, 255)

            # capture frame
            cv2.imwrite('output_frame_'+str(i)+'.jpg',frame)
            no_of_frames = no_of_frames + 1
            #print(t)

        i=i+1
        if no_of_frames >=3: 
            break
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        else:
            break

# Release everything if job is finished
cap.release()
#out.release()
cv2.destroyAllWindows() 

我收到此错误:

  

TypeError Traceback(最近一次调用最后一次)    in()32 33   cv2.imshow(' frame',frame)---> 34距离=速度*时间35如果   距离== start_distance或距离== mid_distance或距离==   total_distance:36 TypeError:不能将序列乘以非int   键入'模块'

2 个答案:

答案 0 :(得分:0)

问题是你乘以time并且它是Time模块的名称,你应该使用其中一种时间方法并使用它来乘法。也许是start_time,但我不知道这个变量的确切目的。

此外,您需要将speed强制转换为int才能在乘法中使用它。我假设你想得到一个int

来自文档

http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html

#Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

然后在你的循环中:

out.write(frame)

让我知道这是否有效

答案 1 :(得分:0)

由于time是包而不是变量,因此您需要创建一个变量来保存当前时间:

current_time = time.time()
distance     = speed * current_time

或者你可以得到当前的时间:

distance     = speed * time.time()

不要误会我的意思。我喜欢Python,但这是为什么像Perl和PHP这样的语言使用$@这样的符号来表示变量的一个例子。在这些语言中,包含单个值的名为time的变量将写为$time,而具有相同名称的函数(或模块)将写为time。因此,将两者混淆起来会更加困难。