Как сохранить изображение байта [] в mongodb для процесса Doocr - PullRequest
0 голосов
/ 01 ноября 2019

Привет, как сохранить байтовое изображение в mongodb и выполнить процесс doocr (через public static void main). Можно ли выполнить doocr для сохраненного изображения из mongodb

Модель:

public class Photo {    
    @Id
    private String id;      
    private byte[] image; } getter & setter

Контроллер :

@Controller
public class PhotoController {
   @GetMapping("/photos/upload")
    public String uploadPhoto(Model model) {
        model.addAttribute("message", "hello");
        return "uploadPhoto";
    }

добавлен путь изображения mongodb после сохраненного на нем изображения. ? Правильный способ сделать это

MAIN:

 public static void main(String[] args) 
{   
SpringApplication.run(StackoverflowApplication.class, args);            

   /// mongodb data path is it right ? for doocr
 File image = new File("mongodb://localhost:27017//test-db//user");

   // encode nd decode  sample

String encodedString =Base64.getEncoder().encodeToString(originalInput. 
  getBytes());      
byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
    String decodedString = new String(decodedBytes);

    Tesseract tessInst = new Tesseract();
    tessInst.setDatapath("C:\\Users\\Administrator\\Desktop\\tessdata");
    try {
            String result= tessInst.doOCR(image);
            System.out.println(result);
    } catch (TesseractException e) {
            System.err.println(e.getMessage());
    }           }

Возможно ли это или любая другая base64, необходимая для этого.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2019

Вы должны рассмотреть возможность использования проекта сообщества под названием Spring Content для Mongo для части хранения контента. Spring Content - это неструктурированные данные (документы, видео, изображения), а Spring Data - это структурированные данные. Это обеспечивает абстракцию по Хранению. Предоставление вам одной и той же модели программирования для быстрого и простого предоставления сервисов контента на основе REST.

Вы можете добавить его в свой проект следующим образом:

pom.xml

<dependency>
    <groupId>com.github.paulcwarren</groupId>
    <artifactId>spring-content-mongo</artifactId>
    <version>0.11.0</version>    <!-- 1.0.0.M1 for Spring Boot 2.2 -->
</dependency>
<dependency>
    <groupId>com.github.paulcwarren</groupId>
    <artifactId>spring-content-rest</artifactId>
    <version>0.11.0</version>    <!-- 1.0.0.M1 for Spring Boot 2.2 -->
</dependency>

Убедитесь, что в вашем бине GridFsTemplate присутствуетконтекст приложения. Монго хранилище и REST API включены. Что-то вроде следующего:

@Configuration
@EnableMongoStores
@Import(org.springframework.content.rest.config.RestConfiguration.class) // Enable REST API
public class MongoConfig extends AbstractMongoConfiguration {

   @Bean
   public GridFsTemplate gridFsTemplate() throws Exception {
      return new GridFsTemplate(mongoDbFactory(), mappingMongoConverter());
   }
   ...

Чтобы разрешить ассоциировать контент с вашей сущностью Photo, присвойте ему следующие атрибуты:

Photo.java

public class Photo {    

    @Id
    private String id;      
    //private byte[] image;    replace this with -->

    @ContentId
    private String contentId;

    @ContentLength 
    private long contentLength = 0L;

    @MimeType
    private String mimeType;

Добавить интерфейс магазина:

PhotoStore.java

public interface PhotoStore extends ContentStore<Photo, String> {
}

Это все, что вам нужно. Когда ваше приложение запустится, Spring Content увидит зависимости от модулей Mongo / REST и внедрит реализацию GridFS PhotoStore, а также реализацию контроллера, поддерживающего полную функциональность CRUD, и отобразит эти операции на * 1030. * интерфейс. Конечные точки REST будут доступны в /photos.

, т.е.

curl -X PUT /photos/{photoId} -F "file=@/some/image.jpg" создаст или обновит фотографию

curl -X GET /photos/{photoId} получит фотографию

curl -X DELETE /photos/{photoId} удалит фотографию

Есть несколько руководств по началу работы здесь . Они используют Spring Content для файловой системы, но модули взаимозаменяемы. Справочник Монго - здесь . Здесь есть обучающее видео здесь . И пример проекта здесь .

HTH

0 голосов
/ 01 ноября 2019

Так как вы используете пружину. Вы можете использовать MultipartFile, чтобы получить файл в вашем контроллере, а затем использовать Binary из org.bson, чтобы сохранить файл в MongoDB, если размер вашего изображения <16 МБ (если размер изображения> 16 МБ, вы можете использовать GridFs ).

Вам нужно добавить в проект только одну зависимость - spring-data-mongoDB

Давайте рассмотрим пример коллекции User, которая выглядит следующим образом:

@Document
public class User {
    @Id
    private String id;

    private String name;
    private Binary image;
    // getters and setters
}

Здесь вы можете увидеть Binary image, который представляет ваш файл изображения.

Теперь создайте репозиторий для этой коллекции пользователей, используя MongoRepository

public interface UserRepository extends MongoRepository<User, String>{

}

Создайте контроллер для демонстрационной цели. Используйте @RequestParam MultipartFile file, чтобы получить файл на свой контроллер, получить байты из файла и установить его для объекта пользователя. user.setImage(new Binary(file.getBytes())); Полный пример приведен ниже:

@RestController
public class UserController {
    @Autowired
    private UserRepository userRepository;

    @PostMapping("/users")
    User createUser(@RequestParam String name, @RequestParam MultipartFile file) throws IOException {
        User user = new User();
        user.setName(name);
        user.setImage(new Binary(file.getBytes()));

        return userRepository.save(user);
    }

    @GetMapping("/users")
    String getImage(@RequestParam String id) {
        Optional<User> user = userRepository.findById(id);
        Encoder encoder = Base64.getEncoder();

        return encoder.encodeToString(user.get().getImage().getData());

    }
}

Запустите сервер и достигните конечной точки, как показано нижескриншот почтальона

enter image description here

Ваши данные хранятся в формате mongoDb в формате BinData и для получения данных из базы данных, пожалуйста, используйте метод getImage вышеcode.

EDIT:

Задавающий вопрос использует библиотеку tess4j для извлечения текста из изображения, а doOCR - метод в этой библиотеке. Я выполнил следующие шаги для извлечения текста из изображения в моем приложении для весенней загрузки.

  1. Установите tesseract-ocr в вашей системе:

    sudo apt-get install tesseract-ocr

  2. Загрузите eng.traineddata обучающие данные из https://github.com/tesseract-ocr/tessdata и переместите их в корневую папку проекта.

  3. Добавьте приведенную ниже зависимость к вашему проекту:

   <dependency>
        <groupId>net.sourceforge.tess4j</groupId>
        <artifactId>tess4j</artifactId>
        <version>3.2.1</version>
   </dependency>
Добавьте следующий код в существующий проект:
@GetMapping("/image-text")
String getImageText(@RequestParam String id) {
    Optional<User> user = userRepository.findById(id);
    ITesseract instance = new Tesseract();
    try {
        ByteArrayInputStream bais = new ByteArrayInputStream(user.get().getImage().getData());
        BufferedImage bufferImg = ImageIO.read(bais);
        String imgText = instance.doOCR(bufferImg);
        return imgText;
    } catch (Exception e) {
        return "Error while reading image";
    }
}
...