Поиск изображений Google: как мне создать обратный URL-адрес для поиска изображений?

Как я могу программно через java преобразовать изображение в «какую-то строку», чтобы передать его в качестве параметра для поиска в поиске изображений google. На самом деле я сделал некоторое преобразование изображения в base64, но оно отличается от того, что Google делает в своей поисковой системе изображений. Я сделал такое преобразование (java 7):

import javax.xml.bind.DatatypeConverter;
...
            Path p = Paths.get("my_photo.JPG");
            try(InputStream in = Files.newInputStream(p); 
                    PrintWriter write = new PrintWriter("base64.txt");
               ) {
                byte [] bytes = new byte[in.available()];
                in.read(bytes);
                String base64 = DatatypeConverter.printBase64Binary(bytes);
                write.println(base64);

            } catch(IOException ex) {
                ex.printStackTrace();
            }

вывод этой простой программы отличается от строки Google в URL-адресе. Я говорю о той строке, которая идет после tbs=sbi:AMhZZ...


person maks    schedule 28.09.2011    source источник
comment
Итак, могу ли я использовать этот сервис Google по-другому. Я просто хочу получить код страницы указанного изображения, например, в поиске изображений Google.   -  person maks    schedule 28.09.2011
comment
Я не понимаю, чего вы пытаетесь добиться. Можете ли вы привести пример?   -  person mikerobi    schedule 28.09.2011
comment
я хочу использовать службу поиска изображений Google, как в коде .google.com/intl/uk/apis/imagesearch/v1/ но вместо текстовых параметров я хочу использовать изображение в качестве параметра (примечание: мне не нужно использовать json, просто он используется в примере)   -  person maks    schedule 28.09.2011
comment
Имейте в виду, что это экспериментальный сервис, возможно, вы не захотите создавать приложение, зависящее от него. Существуют и другие системы обратного поиска изображений   -  person mikerobi    schedule 28.09.2011
comment
Извините, я застрял, думая о преобразовании изображения в строку 1:1, а не о том, что на самом деле происходит внутри поисковой системы. Мой новый ответ должен быть более полезным.   -  person mikerobi    schedule 28.09.2011
comment
На Quora есть [тема] [Q], в которой подробно рассказывается об алгоритмах снятия отпечатков изображений, особенно [этот ответ] [Q2] от кого-то, кто утверждает, что работал над функцией обратного поиска изображений Google: › [Проект] использовал SURF, PCA-SIFT для извлечения ключевых точек › и дескрипторов (вектор значений с плавающей запятой), затем использовал LSH для индексации › и сопоставления! Настоящий алгоритм кажется проприетарным и [возможно, даже запатентованным][P]? Кажется, что внутренняя система почему-то называется quimby, может быть, кто-то может рассказать об этом? [Вопрос]:quora.com/Algorithms/What- этот-алгоритм-используется-Google   -  person André Laszlo    schedule 29.11.2013
comment
Вы когда-нибудь находили способ передать изображение base64 в поиск картинок Google?   -  person DG.    schedule 21.03.2014


Ответы (5)


Это мое лучшее предположение о том, как работает поиск изображений:

Данные в URL-адресе не являются закодированной формой изображения. Данные представляют собой отпечаток изображения, используемый для нечеткого сопоставления.

Вы должны заметить, что когда вы загружаете изображение для поиска, это двухэтапный процесс. Первый шаг загружает изображение через URL-адрес http://images.google.com/searchbyimage/upload. Сервер Google возвращает отпечаток пальца. Затем браузер перенаправляется на страницу поиска со строкой запроса на основе отпечатка пальца.

Если Google не опубликует алгоритм создания отпечатка пальца, вы не сможете создать строку поискового запроса из своего приложения. До тех пор вы можете отправить свое приложение на URI загрузки. Вы должны иметь возможность проанализировать ответ и создать строку запроса.

ИЗМЕНИТЬ

Это ключи и значения, отправленные на сервер при загрузке файла.

image_url       =
btnG            = Search
encoded_image   = // the binary image content goes here
image_content   =
filename        =
hl              = en
bih             = 507
biw             = 1920

"bih" и "biw" выглядят как размеры, но не соответствуют загружаемому файлу.

Используйте эту информацию на свой страх и риск. Это недокументированный API, который может изменить и сломать ваше приложение.

person mikerobi    schedule 28.09.2011
comment
Спасибо, я догадываюсь, о чем вы говорите. Можете ли вы описать или привести пример, как я могу отправить запрос с изображением на этот URL-адрес? - person maks; 28.09.2011
comment
@maks, я надеюсь, что мое редактирование будет более полезным. Вам нужно закодировать ключ/значение как multipart/form-data и отправить его как тело запроса POST. Вы должны быть в состоянии найти множество примеров того, как сделать кодирование. - person mikerobi; 28.09.2011
comment
Не могли бы вы подробнее рассказать об этом... Я пытаюсь сделать то же самое на WindowsPhone7. - person 1Mayur; 29.11.2011

Основываясь на ответе @Ajit, это делает то же самое, но с использованием команды curl (Linux/Cygwin/и т. д.)

curl -s -F "image_url=" -F "image_content=" -F "filename=" -F "h1=en"  -F "bih=179" -F "biw=1600" -F "encoded_image=@my_image_file.jpg" https://www.google.co.in/searchbyimage/upload

Это напечатает URL на стандартном выходе. Вы можете загрузить этот URL-адрес с помощью curl или wget, но вам, возможно, придется изменить пользовательский агент на графический веб-браузер, такой как Chrome.

person golimar    schedule 31.10.2014

Это то, что работает для меня. Никакой кодировки на самом деле не нужно.

https://www.google.com/searchbyimage?image_url=YOUR_IMAGE_URL
person Igor Mizak    schedule 16.07.2020
comment
Это для изображения, которое загружено в Интернете - person golimar; 21.06.2021

Для этого используйте API Google Vision. Есть также много примеров, доступных в Google.

person shark    schedule 20.03.2019

person    schedule
comment
требуется только параметр encode_image, остальные параметры не требуются. - person Ayman Al-Absi; 08.10.2016