0

我需要一种在 Delphi 桌面应用程序中标记照片的方法,就像 Facebook 那样。

这包括一些方法可以轻松地将标签添加到人物上,然后将鼠标悬停在照片中的人物上以显示标签。

给出的答案中的两个建议:“用于人脸识别和标记的德尔福组件”并没有解决这个问题。

但我不知道从哪里开始,也无法在网上找到如何做到这一点的想法。脸书是如何做到的?或者也许有一个允许它的 Delphi 组件。

尝试实施类似 Facebook 的标签的最佳方式是什么?


ps 这是 Facebook 对此的一些 API 定义:http ://wiki.developers.facebook.com/index.php/Photos.addTag

这是一个 Java 程序,它实现了我想在我的 Delphi 应用程序中执行的面部标记功能:fb-photo-uploader

4

4 回答 4

4

您引用的 API 的关键参数是图片 ID、坐标和标签。标签可以是 Facebook 用户的用户 ID,也可以是自由格式的文本(当标记的主题不是 Facebook 用户时)。Facebook 只使用一个坐标,因为它使用固定大小的区域来表示标记区域;这个想法是你点击一个人的脸的中心,Facebook 只是存储那个点。

如果您在TImage控件中显示图片(毕竟这是显而易见的首选),您可以使用OnMouseDownandOnMouseUp事件检测鼠标点击。(该OnClick事件更简单,但不会告诉您坐标。)一旦您获得了一个点,提示您输入一个标签来伴随该点。你可以使用预先确定的标签,比如 Facebook 的用户 ID,或者只使用普通文本,或者使用你自己设计的东西。您使用什么来表示标签值的问题与您迄今为止提出的任何其他问题都是正交的。

Facebook 的照片标记的另一半是,将鼠标移到图像上会在图像上显示标记文本,将鼠标移到下面的标签上会突出显示相关区域。处理OnMouseMove事件并编写一些代码以根据需要显示或隐藏标签和形状。如果您使用TLabeland TShape,您甚至可能不必修改图像,但在图像顶部显示这些控件可能会干扰图像的进一步OnMouseMove事件。尝试一些实验并查看适合您的方法应该不会花费太长时间。

于 2009-04-01T03:25:54.847 回答
3

lkessler,我刚刚阅读了您对 Marshall Fryman 的回复,因此您可能有几个选择:

THotSpotImage - 如果您已经有 TMS 组件...

ImageEn - 如果您已经拥有它们...

请参阅w2m 的答案#3,我认为我需要进一步获取我的选择的所有内部像素,那么我如何保存我的选择/对象?

保存选择只是保存选择本身。它不会将图像保存在选择范围内:

过程 SaveSelectionToFile(const FileName:string); SaveSelectionToFile 将当前选择保存到指定文件。示例 ImageEnView1.Select(10,10,100,100); ImageEnView1.SaveSelectionToFile('selection1'); .. sel1.Position:=0; ImageEnView1.LoadSelectionFromFile('selection1'); // 这就像 Select(10,10,100,100)

于 2009-04-01T17:43:35.910 回答
0

我对你的问题有点困惑。您是在尝试与 Facebook 互动还是只是复制功能?

如果您尝试复制功能:您应该能够只显示图像,让用户选择矩形,可能将图像复制到新副本以通知其他人,并在数据库中应用标签。一些有用的链接:是一个选择图像示例,是复制图像部分示例。我实际上认为您可以在油漆盒中选择图像,但实际上并没有永远玩过其中一个。

如果您尝试访问 API:.NET 接口可能适合您。据我所知,没有 COM 接口,因此您必须编写自己的连接器或使用 .NET Delphi 应用程序。注意:所有这些信息都来自谷歌,所以我不会上下发誓这确实是当前的状态。我看到的唯一其他 Facebook API 请求是从 2007 年开始的。

如果您想进行自动人脸识别,参考问题中的 OpenCV 看起来是一种不错的方法(特别是如果您可以访问 C++ Builder)。

于 2009-04-01T01:34:52.367 回答
0

Graphic32-library中,您可以在图像中相互叠加多个图层。开箱即用的层之一是TRubberbandLayer,它允许用户在运行时重新定位/调整层大小。

TImage32 组件的 mousemove 事件有一个参数,该参数给出当前光标下的图层。

type TImgMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer) of object;

我认为橡皮筋层和鼠标移动事件的组合应该是很好的解决方案。

于 2009-04-02T07:25:50.113 回答