opencv 如何从SIFT算法产生的描述符中得到图像的关键点或像素坐标

1dkrff03  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(187)

我使用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.]

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

hi3rlvi2

hi3rlvi21#

我知道你想在你匹配的两个图像之间画线。
为此,OpenCV有cv.drawMatches。此方法的文档在这里。
就像这样使用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是参考图像2的匹配的id,pt属性是指该特征点的像素坐标。image1也是如此,但必须读取kp1[match.queryIdx].pt

相关问题