我正在自学 Python,并且想要一个辅助类来从 shell 脚本或其他类加载图像。
这是我到目前为止所拥有的:
import cv2 as cv
import os, sys
class LoadImage:
def __init__(self, inputfile, outputfile=None):
self.inputfile = inputfile
self.outputfile = outputfile
self.img = None
if os.path.isfile(self.inputfile):
self.load()
else:
print "Path provided is not to a file"
sys.exit(1)
def load(self):
self.img = cv.imread(self.inputfile)
if self.img is not None:
return self.img
else:
print "Error with loading image"
sys.exit(1)
我的问题是如何使用它。假设我将其复制到/home/jason/python_project ,其目录结构如下
python_project
|--- LoadImage.py
|
|--- images
|
|--- test1.jpg
|--- test2.jpg
我想要发生的是在使用有效路径名实例化 LoadImage 时,type(img)
返回numpy.ndarray
。
假设我在 python_project 中打开一个 ipython shell 并输入
from LoadImage import LoadImage
img = LoadImage("images/test1.jpg")
这里,img
返回
In [21]: img
Out[21]: <LoadImage.LoadImage instance
但是img.img
返回在cv.imread()
上创建的numpy ndarray的矩阵数组。
如何修改此设置以便可以从 shell 执行此操作:
import LoadImage
img = LoadImage("images/test1.jpg")
img.shape() #returns a 3 item tuple
type(img) # returns numpy.ndarray
最佳答案
当您调用LoadImage("images/test1.jpg")
时,它会调用“构造函数”,并且它将始终返回该类的实例。您应该做的是在创建实例后调用load函数,并更改代码,使其不在init中调用load。
更新您的代码以反射(reflect)上述更改;
import cv2 as cv
import os, sys
class LoadImage:
def __init__(self, inputfile, outputfile=None):
self.inputfile = inputfile
self.outputfile = outputfile
self.img = None
def load(self):
if not os.path.isfile(self.inputfile):
print "Path provided is not to a file"
sys.exit(1)
self.img = cv.imread(self.inputfile)
if self.img is not None:
return self.img
else:
print "Error with loading image"
sys.exit(1)
你会这样调用它;
导入LoadImage
img = LoadImage("images/test1.jpg").load()
img.shape()
或者,如果您实际上不需要这里的类,您可以编写一个函数来为您完成所有这些工作;
import cv2 as cv
import os, sys
def load_image(input_file):
if not os.path.isfile(self.inputfile):
print "Path provided is not to a file"
sys.exit(1)
img = cv.imread(self.inputfile)
if self.img:
return self.img
else:
print "Error with loading image"
sys.exit(1)
关于Python 类返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22272815/