2017-02-16 10 views
1
from pymongo import MongoClient 
from bson.objectid import ObjectId 
import numpy as np 
import gridfs 

import os,os.path 
i=0 
try: 
    for file in os.listdir("/Users/sarthakgupta/Desktop/sae/Images"): 
     if (file.endswith(".png") | file.endswith(".jpg")): 
      filename = "/Users/sarthakgupta/Desktop/sae/Images/"+file 
      datafile = open(filename,"rb") 
      thedata = datafile.read() 
      datafile.close() 


      c = MongoClient() 
      i=i+1 
      db = c.trial5 
      fs = gridfs.GridFS(db) 
      t = "class"+str(i) 


      stored = fs.put(thedata,filename=q) 

except IOError: 
    print("Image file %s not found" %datafile) 
    raise SystemExit 

Я сохранил изображение в mongo db. Теперь я хочу получить эти изображения из базы данных по имени файла и сохранить изображение (или пиксели) одного и того же имени файла в массиве или списке. Предположим, если есть 2 изображения с именем файла «class1», то они должны быть в одном массиве.Извлечение сохраненного изображения из mongodb с использованием python

+0

Надеюсь, мой ответ в другом вопросе может вам помочь. http://stackoverflow.com/questions/22077720/pymongo-bson-binary-save-and-retrieve/42950170#42950170 – CoderYel

+0

Что такое «q» здесь в filename = q? –

+0

Я обнаружил, что q следует заменить вместо t. –

ответ

2

Создайте свой fs переменную, как и раньше, и:

data = fs.get_last_version(filename).read() 

Вы также можете запросить список файлов, как:

from bson import Regex 
for f in fs.find({'filename': Regex(r'.*\.(png|jpg)')): 
    data = f.read() 

Кроме того, комментарий о коде: это очень медленно воссоздайте экземпляры MongoClient и GridFS для каждой итерации вашего цикла. Создайте их один раз, прежде чем начинать цикл и повторно использовать их.

+0

Когда я использую: 'data = fs.get_last_version (filename =' class3 ') print (data)' Я получаю вывод: . Что это значит? и когда я использую 'data = fs.get_last_version (filename =' class3 '). Read() print (data)'. Я получаю вывод «b» \ xff \ xd8 \ xff \ xe0 \ x00 \ x10JFIF \ x00 \ x01 \ x01 \ x00 \ x00H \ x00H \ x00 \ x00 \ xff \ xe1 \ x00XExif \ x00 \ x00MM \ x00 * \ x00 \ x00 \ x00 \ x08 \ x00 \ x02 \ x0 ...... "в этой форме. Как я могу использовать этот вывод? .. Спасибо за предложение –

+1

«data» - это содержимое байта изображения. Вы можете сохранить это содержимое в файл с именем «image.jpg» или делать с ними все, что хотите. –

+0

Но когда я попытался отобразить изображение с помощью открытого cv, я получаю сообщение об ошибке «требуется объект, похожий на байты, а не« GridOut ». Вот мой код. nparr = np.fromstring (data1, np.uint8) img_np = cv2.imdecode (nparr, cv2.CV_LOAD_IMAGE_COLOR) печати (img_np) –