【问题标题】:How to get key points or pixel coordinates of an image from descriptor produced by SIFT algorithm如何从 SIFT 算法产生的描述符中获取图像的关键点或像素坐标
【发布时间】:2019-09-10 06:23:26
【问题描述】:

我使用 SIFT 算法来生成描述符。在对描述符进行一些处理后,我得到了一些选定的描述符。现在我想在这些描述符之间画线,因为我想从这些描述符中返回关键点或像素坐标。

我正在尝试使用 opencv 实现复制移动伪造检测。使用关键点概念,我得到了匹配的描述符对。只想在那些匹配的描述符之间画线。

生成描述符的代码:

sift = cv2.xfeatures2d.SIFT_create()
kp2, desc2 ift.detectAndCompute(gtemp,None)

我得到的最后一个描述符,我想在它们之间画线:

[ 1. 64. 131. 1. 2. 9. 1. 0. 4. 80. 131. 0. 0. 3. 14. 12. 1. 52. 131. 0. 0. 0. 7. 9. 2. 25. 131. 0. 0. 0. 0. 0. 19. 12. 20. 3. 48. 54. 1. 8. 92. 28. 38. 0. 0. 2. 58. 108. 8. 18. 63. 0. 0. 43. 131. 28. 15. 18. 65. 0. 0. 31. 115. 33. 33. 2. 3. 47. 61. 8. 0. 7. 131. 24. 0. 0. 1. 0. 12. 47. 77. 4. 0. 0. 0. 27. 91. 22. 1. 0. 0. 0. 0. 28. 113. 19. 10. 0. 2. 9. 1. 2. 79. 55. 131. 1. 0. 0. 0. 0. 17. 131. 47. 0. 0. 0. 0. 0. 1. 25. 0. 0. 0. 0. 0. 0. 3. 1.] [ 23. 22. 31. 4. 0. 1. 8. 8. 26. 41. 40. 25. 4. 2. 13. 19. 11. 42. 46. 48. 8. 17. 15. 7. 4. 25. 28. 42. 38. 74. 34. 2. 68. 21. 24. 25. 2. 10. 11. 14. 14. 17. 119. 50. 12. 15. 11. 12. 87. 35. 36. 21. 14. 10. 7. 39. 8. 5. 14. 72. 119. 25. 3. 6. 5. 11. 13. 6. 1. 61. 113. 21. 8. 4. 7. 8. 9. 93. 119. 44. 69. 16. 13. 13. 15. 28. 45. 59. 5. 3. 7. 119. 119. 7. 0. 0. 0. 119. 119. 0. 0. 10. 28. 3. 0. 100. 119. 0. 0. 29. 54. 6. 0. 20. 55. 36. 52. 62. 24. 3. 2. 0. 4. 119. 119. 8. 1. 1.]

我想如果我能从这个描述符中得到像素坐标,那么在它们之间画线会更容易。在 OpenCV 中使用 python 3.6。

【问题讨论】:

    标签: python opencv image-processing


    【解决方案1】:

    我了解到您想在要匹配的两张图片之间画线。
    为此,OpenCV 有cv.drawMatches。这个方法的文档是here

    像这样使用它image3 = cv2.drawMatches(image1, kp1, image2, kp2, matches, None, flags=2)

    此外,如果您需要匹配关键点的像素坐标,则必须读取 cv2.KeyPointpt 属性。

    例如,如果您想要图像 2 中所有匹配特征的像素坐标:

    for kp in kp2:
        for match in matches:
            print(kp2[match.trainIdx].pt)
    

    在这种情况下,match.trainIdx 是 image2 参考匹配的 id,pt 属性指的是该特征点的像素坐标。 image1 也是如此,但您必须阅读 kp1[match.queryIdx].pt

    【讨论】:

    • 是的,你是对的。但我的主要问题是,只有一个图像,只能复制移动伪造图像。因此无法应用 cv.drawMatches。而且我提到的描述符也属于单个图像。我想在单个图像上画线。还有我提到的两个描述符向量。
    • 所以用我发布的第二种方法找到像素坐标并用cv2.line画线
    • 是的,要通过 pt 属性查找像素坐标,我应该有关键点,但我只有关键点的描述符。我可以从描述符中检索关键点吗?一旦我从描述符中得到关键点,问题就会解决。
    • 您不能直接从描述符中检索它们。但是你有关键点,因为你用kp2, desc2 ift.detectAndCompute(gtemp,None) 计算了它们。如果您以某种方式从原始 desc2 数组中获取某些描述符,您必须找到一种方法来保存原始数组中每个描述符的原始 id,以便您可以通过匹配关键点数组中的 id 找到正确的关键点。跨度>
    • 好的,我会这样尝试。非常感谢,真的很有帮助。
    猜你喜欢
    • 2015-10-27
    • 2017-01-08
    • 2012-07-22
    • 2017-08-11
    • 2011-07-19
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多