2014-10-23 1 views
1

Im, использующий OpenCV в java, развивающийся с помощью eclipse, и изображения читаются таким образом для сопоставления шаблонов.OpenCV Чтение изображения для соответствия шаблону

String inFile = "C:/image.png"; 
Mat img = Highgui.imread(inFile); 

Это хорошо, но мои изображения не находятся на моем локальном компьютере. Я должен сравнить 2000 изображений на сервере в базе данных mysql. Сохранение 2000 изображений на мой компьютер, а затем их чтение не имеет смысла.

Так что мне нужно, чтобы Highgui.imread (inFile) читал изображение: Highgui.imread (Image inImage) или, может быть, Highgui.imread (File inFile), я не смог найти источник java для редактирования/изменения. Мне нужно каким-то образом конвертировать мои изображения, которые будут поступать из базы данных mysql в Mat, для сравнения (сопоставление шаблонов) ...

Дополнительная информация: У меня есть таблица mysql со столбцами: ID, Name, Description, Image1, Image2. Тип столбцов Image1 и 2 - «mediumblob», и когда вы щелкаете правой кнопкой мыши по столбцу Image1 или Image2 в «Workbench MySQL», я выбираю «Open Value in Editor», тогда есть 3 вкладки; Binary, Text, Image, at Image мое изображение отображается отлично. Тип изображений - png. В конце я хочу сравнить Image1 с Image2. Image2 - inFile, а Image1 - templateFile.

Извините, я думал, что мой вопрос был ясен. Я постараюсь перефразировать его. У меня есть локальный компьютер и сервер. Изображения сохраняются в базе данных mysql на сервере. Я хочу запустить приложение с моего локального компьютера, который получает/обращается к 2 изображениям на сервере, а затем сравнивает их с помощью соответствия шаблону OpenCV. Afaik вы не можете получить доступ к столбцу mysql с /server/home/user/mysql/image_table/mypicture.png, я пишу это из-за предложения «guneykayim». Так как Im планирование для получения изображений, нету пробовал еще, но план:

Blob imageBlob = resultSet.getBlob(yourBlobColumnIndex); 
InputStream binaryStream = imageBlob.getBinaryStream(0, imageBlob.length()); 

Или

InputStream binaryStream = resultSet.getBinaryStream(yourBlobColumnIndex); 

Или

try{ 
    Class.forName(driverName); 
    con = DriverManager.getConnection(url+dbName,userName,password); 
    Statement stmt = con.createStatement(); 
    ResultSet rs = stmt.executeQuery("select image from image"); 
    int i = 0; 
    while (rs.next()) { 
     InputStream in = rs.getBinaryStream(1); 
     OutputStream f = new FileOutputStream(new File("test"+i+".jpg")); 
     i++; 
     int c = 0; 
     while ((c = in.read()) > -1) { 
      f.write(c); 
     } 
     f.close(); 
     in.close(); 
    } 
}catch(Exception ex){ 
    System.out.println(ex.getMessage()); 
} 

Мой вопрос: Я хочу, чтобы сравнить 2 изображения , Я получил из базы данных mysql.

Highgui.imread(); 

Этот метод ожидает строки, но я хочу, чтобы дать InputStream или файл OutputStream ... Как я уже сказал, я не хочу, чтобы сохранить 2000 изображений на локальном компьютере. Я открыт для альтернативных способов.

Final Simplest Rephrasing: Как использовать сопоставление шаблонов java OpenCV на 2 изображениях, хранящихся в базе данных mysql.

Другими словами, как я могу преобразовать объект InputStream в объект Mat?

Спасибо за чтение.

+0

Вопрос не ясен. Или, может быть, это должны быть два отдельных вопроса. Почему вы задали вопрос OpenCV с вопросом mysql? – guneykayim

+0

В любом случае ...Пробовали ли вы писать сетевой путь к файлу изображения в 'inFile'? Например, 'inFile =" networkpath/image.png ". AFAIK вы можете прочитать это изображение. – guneykayim

+0

Я не могу читать сетевые патчи с помощью 'imshow', вы все равно можете прочитать его с помощью« VideoCapture ». Проверьте docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture Videocapture может открывать «источники» из IP, включая камеры, видео и изображения FILES! Если ваш сервер не предоставляет файлы, а данные двоичного изображения напрямую, вы можете использовать его напрямую (но вам нужно знать формат! Например, RGB24). Трудно сказать, что делать, если вы не предоставляете информацию о том, какие данные вы получаете с вашего сервера ... – Micka

ответ

1

Я нашел ответ here Престижность этого парня, он мой герой :) отлично работает, если вы хотите изображения в оригинальном цвете, а не в оттенках серого, вы должны изменить Highgui.IMREAD_GRAYSCALE с Highgui.IMREAD_UNCHANGED для получения дополнительной информации check