我正在学习opencv,为了使我不必滚动数百行代码变得容易,我制作了两个文件,分别为file1.py和file2.py。
我要使用的所有功能都在file1.py中,而我从file2.py中调用它们。 file1.py中的函数是:
def main(title="Test", func=None):
global img, original_img
cv2.namedWindow(title)
cv2.setMouseCallback(title, func)
while True:
cv2.imshow(title, img)
if func == draw_shape:
k = cv2.waitKey(1)
if k == ord('m') or k == ord('M'):
shape = not shape
elif k == 27:
break
else:
if cv2.waitKey(1) == 27:
break
cv2.destroyWindow(title)
def draw_shape(event, x, y, flags, param):
global ix, iy, shape, drawing, fill, img, original_img
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing:
if shape:
cv2.rectangle(img, (ix, iy), (x, y), (0, 244, 0), fill)
elif not shape:
cv2.circle(img, (x, y), 20, (0, 0, 244), fill)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
img = deepcopy(original_img)
file1.py中有很多代码有相同的问题(我将在稍后解释),为了节省空间,我将其省略。
我知道我可以修改main()并将img传递给它,但是问题开始于与cv2.setMouseCallback关联并自动调用的draw_shape()。因此,我不能只是将变量(例如ix,绘图等)传递给draw_shape(),而这些变量在我在file1.py本身中调用main()时是全局的。
但是现在当我创建了file2.py并想从那里调用main()时,我不再能够传递这些变量。
file2.py中的代码如下:
from file1 import main, draw_shape
if __name__ == "__main__":
imagepath = "some\path\someImage.jpg"
img = cv2.imread(imagepath, 0)
original_img = deepcopy(img)
ix, iy, fill = (-1, -1, 0)
shape, drawing = True, False
main(title='XYZ', func=draw_shape)
有没有建议我如何使main()和draw_shape()使用变量,我已经从file2.py中使用了与它们所需的名称相同的名称(或者是否有其他方法将变量传递给它们)?
答案 0 :(得分:0)
Python packaging允许您使用以下命令从另一个文件导入文件:
from python_package import function
但是,更Python化的方式是将其放置在同一文件中。
您可以阅读有关Python中的软件包和模块的更多信息-here。
答案 1 :(得分:0)
如果这是构造代码的方式,则需要执行以下操作
#file1.py
#add image as an argument
def main(title = "Test", func = None, image = None):
...
#file2.py
from file2 import main
...
main(title = 'XYZ', image = img)
但是就像霍迪瑟说的那样。只需将它们放在一个文件中,您最终将拥有数百个(如果不是数千个)文件,其中只有一段代码长度。