为了进行测试,我们希望将标记的图像日期存储到mongodb数据库中。
在我们的图像管道中的某个点,我们将标记的图像作为openCV图像,表示为numpy ndarray。
如何存储图像?由于图像相对较大,我们考虑使用Gridfs。
到目前为止我们的简单代码:
from pymongo import MongoClient
import gridfs
import cv2
# access our image collection
client = MongoClient('localhost', 27017)
db = client['testDatabaseONE']
testCollection = db['myImageCollection']
fs = gridfs.GridFS(db)
# read the image and convert it to RGB
image = cv2.imread('./testImage.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# store the image
imageID = fs.put(image)
# create our image meta data
meta = {
'imageID': imageID,
'name': 'testImage1'
}
# insert the meta data
testCollection.insert_one(meta)
可悲的是, imageID = fs.put(image)会抛出此错误:
Traceback(最近一次调用最后一次):文件 " /usr/local/lib/python3.6/dist-packages/gridfs/grid_file.py" ;, line 337,在写 read = data.read AttributeError:' numpy.ndarray'对象没有属性'读'
在处理上述异常期间,发生了另一个异常:
Traceback(最近一次调用最后一次):文件 " /home/johann/PycharmProjects/mongoTesting/mongoTesting.py" ;,第17行, 在 imageID = fs.put(image)文件" /usr/local/lib/python3.6/dist-packages/gridfs/ init .py",第121行, 在投入 grid_file.write(data)File" /usr/local/lib/python3.6/dist-packages/gridfs/grid_file.py" ;, line 341,在写 提出TypeError("只能写字符串或类文件对象")TypeError:只能写字符串或类文件对象
如何使用gridfs存储图像的任何提示或想法,还是有更好的方法?
答案 0 :(得分:1)
很明显,问题与图像尺寸无关。有两个例外,我们需要先解决第一个。
回溯(最近一次调用最后一次):文件" /usr/local/lib/python3.6/dist-packages/gridfs/grid_file.py" ;,第337行,写入read = data.read AttributeError:' numpy.ndarray'对象没有属性'读'
请检查文件grid_file.py",337行。没有numpy.ndarray的方法叫做read。要从此数据数组中读取,您只需要切片所需的内容,例如:
b = np.fromfunction(f,(5,4),dtype=int)
>>> b
array([[ 0, 1, 2, 3],
[10, 11, 12, 13],
[20, 21, 22, 23],
[30, 31, 32, 33],
[40, 41, 42, 43]])
>>> b[0:5, 1] # each row in the second column of b
array([ 1, 11, 21, 31, 41])
答案 1 :(得分:0)
我通过将ndarray转换为字符串解决了这个问题。
将包含元数据的新图像存储到数据库中:
# convert ndarray to string
imageString = image.tostring()
# store the image
imageID = fs.put(imageString, encoding='utf-8')
# create our image meta data
meta = {
'name': 'myTestSet',
'images': [
{
'imageID': imageID,
'shape': image.shape,
'dtype': str(image.dtype)
}
]
}
# insert the meta data
testCollection.insert_one(meta)
获取图片:
# get the image meta data
image = testCollection.find_one({'name': 'myTestSet'})['images'][0]
# get the image from gridfs
gOut = fs.get(image['imageID'])
# convert bytes to ndarray
img = np.frombuffer(gOut.read(), dtype=np.uint8)
# reshape to match the image size
img = np.reshape(img, image['shape'])