C++ 如何在MySQL数据库中存储SURF、SIFT、Harrison Corner功能?

C++ 如何在MySQL数据库中存储SURF、SIFT、Harrison Corner功能?,c++,mysql,sql,surf,sift,C++,Mysql,Sql,Surf,Sift,这就是我的问题。我不是数据库程序员,所以正确的设计和实现对我来说并不明显,但无论如何,这是我的问题 我有一个sql数据库(mysql)和很多图像。我想从这些图像中提取特征,并以有组织的方式存储描述符 我想为每种类型的功能(sift、surf等)提供一个单独的表。获取表中的特性的代码是不必要的,因为我可以理解这一点 我的问题在于表的创建。基本上,我不知道一种组织表格的好方法,因为每张图片上没有成千上万行。我更愿意,对于1000个特征图像,只有大约1000行。i、 e mysql_查询(连接器,“创

这就是我的问题。我不是数据库程序员,所以正确的设计和实现对我来说并不明显,但无论如何,这是我的问题

我有一个sql数据库(mysql)和很多图像。我想从这些图像中提取特征,并以有组织的方式存储描述符

我想为每种类型的功能(sift、surf等)提供一个单独的表。获取表中的特性的代码是不必要的,因为我可以理解这一点

我的问题在于表的创建。基本上,我不知道一种组织表格的好方法,因为每张图片上没有成千上万行。我更愿意,对于1000个特征图像,只有大约1000行。i、 e

mysql_查询(连接器,“创建表siftfeatures(ID INT不为null,INT数组[128])”) 其中ID是图像的外键(或类似的东西)

我知道这种语法不起作用,我不想键入128列名称。 Id将是图像的外键。或者类似的


只是想了解一些关于这方面的想法,或者我认为这是错误的。

RDMS系统处理许多短行的能力出人意料地好(对于那些没有太多经验的人来说,这令人惊讶)。MySQL也不例外

您的图像功能实际上需要128个整数来描述它们吗?很难相信。我不知道冲浪和筛选的方法,所以这一切都可能是错误的。话虽如此

创建一个可能包含以下列的表

  • id(自动递增的数字,也称为代理主键)
  • set_id(标识相关图像集的整数)
  • source_id(标识相关源图像的整数)
  • feature_id(标识特征的整数。在每组图像中可能是唯一的)
  • 缩放id(描述图像在缩放空间金字塔中的位置的整数)
  • x(图像中的位置)
  • y(图像中的位置)
  • 在索引上有一个标准索引,即主键。如果您在
    上创建另一个索引(设置\u id、比例\u id、源\u id、特征\u 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类型(二进制大对象)。请看这里:它们通常用于存储JPEG ByTestStreams之类的内容,但也可以用于任何二进制内容

    不要对二进制数据使用TEXT或VARCHAR();MySQL提供的服务器或客户端驱动程序软件可能决定要对该数据进行字符集转换。这将使二进制数据散列

    在将对象转换为数字文本的意义上,您不需要序列化对象,只需将它们直接存储在BLOB中即可


    问题是,尝试搜索这些BLOB对象中的信息是没有意义的。如果需要搜索数据库(使用
    WHERE
    指令等),则需要专门构建的列(如上面的示例)以及BLOB列。

    您真的需要为每个功能单独设置一个表吗?从组织角度来看,我认为这更有意义。对吗?因为如果我想从同一个图像中提取不同的功能,我可以直接到该表获取所有功能。如果您认为这是错误的,请告诉我。不-那样,如果您想获得5个功能如果从同一个图像中删除,您必须搜索5个表。10个图像->10个表。等等。它很快变得非常无效。如果您可以搜索1个功能表(128行-每个功能名称一行),效果会更好,然后是一个包含该功能的imageid、featureid和值的查找表。不,这不是我所说的不同功能。我所说的是不同的功能类型。就像一个表中的所有冲浪功能一样,另一个表中的所有sift功能。感谢您为我一整天提出的多个问题提供了第一个建设性的答案。不幸的是,这并没有给我一条我正在努力解决的信息。Sift确实有128个特征描述符,而SURF有64个。所以我需要一个方案以某种方式包含所有128个描述符。问题在于以某种形式存储它。仅为描述符使用128列显然是不好的做法。所以我已经得出了序列化数据的结论。即int-arr[128];char-charar[512];memcpy(charar,arr,sizeof(arr));然后将其存储为varchar(512)。目前唯一的事情是我不知道sql varchar是否可以支持512 bytesThanks!如果可以,我会投票:(.你说:“服务器或客户端软件可以决定”如果我两者都写呢?我知道做blob可能更好,但把它变成varchar只是一种不好的做法吗?我说的是MySQL提供的驱动程序和服务器软件,而不是你正在创建的软件。对。我将尝试用这两种软件测试它,看看会发生什么。你知道我在哪里可以找到关于它的文档吗顺便说一句,关于在表中创建blob字段,或者创建blob对象并插入它,我似乎找不到任何好的语法示例。