Python在mongodb gridfs中存储cv图像

时间:2018-03-26 14:09:24

标签: python mongodb numpy gridfs

为了进行测试,我们希望将标记的图像日期存储到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存储图像的任何提示或想法,还是有更好的方法?

2 个答案:

答案 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'])