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
相关产品推荐
相关产品推荐

