gpt4 book ai didi

java - 图像识别 - Mat 中的二进制描述符表示 - OpenCV Android

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:11:03 24 4
gpt4 key购买 nike

我只是好奇。我是新来的,所以请考虑我有点菜鸟的问题。

假设我正在开发带有图像识别功能的 android 应用程序,其中所有进程甚至计算密集型都必须在移动设备 cpu 上进行。

我正处于处理图像并从图像中提取一些特征的阶段。这组图像仅来自一座建筑物,它应该在其中识别特定的感兴趣对象(不同的 window 、图片、 Artifact 、建筑物外部)。所以这是一个封闭的领域,我可以提供足够多的不同角度的物体图片。我计划训练神经网络并将其提供给应用程序而不是图像匹配算法。

我的想法是提取关键点,计算描述符(使用 FREAK 作为关键点,使用 ORB 作为描述符),然后从这些描述符中我希望得到单个文件或数组最终会变成这样

    Desc1  Desc2 Desc3 Desc4 DescN......... Class
_________________________________________________________________________________
Picture 1 0.121 0.923 0.553 0.22 0.28 "object1"
Picture 2 0.22 0.53 0.54 0.55 0.32 .........."object1" (different scale, angle)
Picture 3 .... ... ... ... .. .........."object2"
Picture N
Picture N+1

所以我可以将它交给神经网络进行训练,但是我被卡住了,因为我不知道矩阵(Class Mat - openCV)中的二进制特征/描述符是如何表示的。以及我将如何继续规范化这些二进制描述符,以便我可以将其提供给神经网络(多层感知器)进行训练。 (即使是伪代码也会有很大帮助)

最佳答案

我不能对你的问题给出完整的答案,因为我不熟悉神经网络,但我可以给你一些关于 ORB 描述符二进制表示的想法。

  1. 检测关键点时,FREAK 无法做到这一点。但是作为FREAK paper描述了你应该用 FAST corner detector 检测关键点,然后用 FREAK 描述它。如果你想通过 ORB 描述符识别对象,你应该同时使用 ORB,用于关键点检测和描述。请注意,ORB 关键点检测也可以基于 FAST。您可以通过更改 scoreType 的参数来更改它来自 OpenCV documentation .当您使用 android 时,您可以按照描述设置此参数 here

  2. 关于二进制字符串描述符。我还需要他们用 MySQL 查询实现描述符匹配器。由于 OpenCV-java 中的 Mat 只有双描述符表示,我已经实现了将它们转换为二进制的方法。为此,描述符的 Mat 应转换为 List<Double> .您可以使用我的函数来获取描述符的二进制表示。该函数将返回 List<String> .

代码如下:

public static List<String> descriptorToBinary(List<Double> desc){

List<String> binary_desc = new ArrayList<String>();

String desc_bin= "";
for(int i = 0; i < desc.size(); i++){

String binary_str_tmp = Integer.toBinaryString((int)((double)desc.get(i)));
if (binary_str_tmp.length() < 16)
{
int number_of_zeros = 16 - binary_str_tmp.length();
String str_tmp = "";
for(int t = 0; t < number_of_zeros; t++){
str_tmp += "0";
}
binary_str_tmp = str_tmp + binary_str_tmp;
}

desc_bin+= binary_str_tmp;
binary_desc.add(final_binary_str);

}

return binary_desc;

}

返回的字符串列表与 MatOfKeyPoint 的列表大小相同如果您将其转换为 List<KeyPoint>

那么我如何验证这些描述符是否正确:

  1. 我已经将原始 Mat 描述符与 Bruteforce Hamming 匹配器匹配,如 ORB paper 中所述
  2. 我已经记录了匹配器返回的距离。
  3. 然后我计算了同一图像的字符串描述符之间的距离。
  4. 验证 opencv 的汉明距离是否与字符串描述符之间的距离相同。它们是相同的,因此从 Mat 到 List 的转换执行得很好。

因此与关键点相关联的二进制描述符将如下所示:

Picture 1: object1
keypoint1 : 512bit binary descriptor (1s and 0s)
keypoint2 : 512bit binary descriptor
keypoint3 : 512bit binary descriptor
...
Picture 2: object2
keypoint1 : 512bit binary descriptor
keypoint2 : 512bit binary descriptor
keypoint3 : 512bit binary descriptor
...

现在介绍多层感知器。我帮不了你。这就是为什么我一开始就说我的回答不完整。但我希望我给出的评论能帮助您将来解决您的问题。

关于java - 图像识别 - Mat 中的二进制描述符表示 - OpenCV Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15399613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com