Как сохранить функции SURF, SIFT, Harrison-Corner в моей базе данных sql?
Итак, вот моя проблема. Я не программист базы данных, поэтому правильный дизайн и реализация не очевидны для меня, но в любом случае вот мой вопрос.
У меня есть база данных SQL (MySQL) и много изображений. Я хочу извлечь особенности из этих изображений и хранить дескрипторы организованным способом.
Я хочу отдельную таблицу для каждого типа функций (sift, surf и т. Д.). Код для получения функций в таблицах не является необходимым, потому что я могу понять это.
Моя проблема заключается в создании таблицы. В принципе, я не знаю хорошего способа организовать таблицу, в которой у меня нет десятков тысяч строк на изображение. Я бы предпочел, чтобы на 1000 объектов изображения только около 1000 строк. т.е.
mysql_query (соединитель, "CREATE TABLE siftFEATRES(ID INT не нуль, int array[128])"), где ID - это внешний ключ к изображению (или что-то в этом роде)
Я знаю, что этот синтаксис не работает, и я не хочу печатать 128 столбцов имен. Идентификатор будет внешним ключом к изображению. Или что-то типа того.
Просто ищу какие-то идеи по этому поводу или я думаю об этом неправильно.
1 ответ
Системы RDMS удивительно хорошо справляются со многими короткими рядами (удивительно для тех, кто не имеет большого опыта работы с ними). MySQL не является исключением.
Действительно ли вашим изображениям требуются 128 целых чисел для их описания? В это трудно поверить. Я не знаю, как обходить SURF или SIFT, так что все может быть неправильно. Что, как говорится...
Создайте таблицу, возможно, содержащую следующие столбцы.
- id (автоинкрементный номер, суррогатный первичный ключ)
- set_id (целое число, идентифицирующее набор рассматриваемых изображений)
- source_id (целое число, идентифицирующее исходное изображение, о котором идет речь)
- feature_id (целое число, идентифицирующее функцию. Предположительно, уникальное в каждом наборе изображений)
- scale_id (целое число, описывающее, где в пирамиде scale_space находится изображение)
- х (позиция на изображении)
- у (позиция на изображении)
У вас будет стандартный индекс, первичный ключ, по индексу. Если вы создаете другой индекс на (set_id, scale_id, source_id, feature_id, x, y)
вы найдете, что запросы в форме
SELECT source_id, scale_id, feature_id, x,y
FROM sift
WHERE set_id = constant
AND scale_id BETWEEN 3 AND 7
действительно очень быстро.
Из вашего комментария видно, что вам нужно хранить бинарный объект скромного размера. MySQL имеет соответствующий тип данных для хранения этой информации: тип BLOB (Большой двоичный объект. См. Здесь: http://dev.mysql.com/doc/refman/5.0/en/blob.html Они часто используются для хранения такие вещи, как байты JPEG, но они могут быть использованы для любого двоичного материала.
Не используйте TEXT или VARCHAR() для двоичных данных; предоставляемое MySQL серверное или клиентское программное обеспечение драйвера может решить, что оно хочет выполнить преобразования набора символов для этих данных. Это сделает хэш ваших двоичных данных.
Вам не нужно сериализовать ваши объекты в смысле преобразования их в числовой текст. Вы можете просто хранить их прямо в BLOB.
Дело в том, что нет смысла искать информацию в этих объектах BLOB. Если вам нужно искать в вашей базе данных (с WHERE
директивы и все такое) вам понадобятся специально созданные столбцы (как в моем примере выше), а также столбец BLOB.