You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

cv2.drawKeypoints未在目标彩色图绘制SIFT关键点问题求助

问题:OpenCV将SIFT关键点绘制到彩色图像失败

我正在Python中使用OpenCV,尝试将从灰度图像中检测到的SIFT关键点绘制到原始彩色图像上。以下是我的代码:

import cv2 as cv

org_img = cv.imread('/content/Sunset_org.jpg')
gray_img = cv.cvtColor(org_img,cv.COLOR_BGR2GRAY)

sift = cv.SIFT_create()
kp = sift.detect(gray_img,None)
sift = cv.drawKeypoints(gray_img, kp, outImage=org_img, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv.imshow('Sift Img', sift)
cv.waitKey(0)

我期望关键点绘制在原始图像上,但实际却显示在灰度图像上。我是否误解了第三个参数outImage的用法?我哪里操作有误?


问题原因及解决办法

问题出在cv.drawKeypoints的第一个参数和使用逻辑上:

  • 第一个参数image是绘制操作的基础画布,你传入了灰度图gray_img,所以最终生成的图像自然是灰度格式,哪怕指定了outImage=org_img也没用——因为函数会以第一个参数的图像格式来生成输出。
  • outImage只是用来指定输出图像的存储载体,它的格式会被第一个参数的图像格式覆盖,你之前的用法完全误解了这个参数的作用。

修正后的代码

把drawKeypoints的第一个参数换成原始彩色图像org_img,就能在彩色图上绘制关键点了:

import cv2 as cv

org_img = cv.imread('/content/Sunset_org.jpg')
gray_img = cv.cvtColor(org_img,cv.COLOR_BGR2GRAY)

sift = cv.SIFT_create()
kp = sift.detect(gray_img, None)
# 用原始彩色图作为绘制画布,直接获取返回的结果图像
result_img = cv.drawKeypoints(org_img, kp, None, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv.imshow('Sift Img', result_img)
cv.waitKey(0)
cv.destroyAllWindows()

额外说明

如果不想覆盖原始图像,或者需要手动指定输出图像的存储空间,可以先复制原始图像,再传入outImage:

result_img = org_img.copy()
cv.drawKeypoints(org_img, kp, result_img, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

这里要注意,第一个参数必须还是彩色图,否则输出依然是灰度的。

内容的提问来源于stack exchange,提问作者soucs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 10:52:50