我正在学习OpenCV,目前我正在尝试理解存储在KeyPoint
中的基础数据,以便我可以更好地利用我正在处理的应用程序的数据。
到目前为止,我一直在浏览这两页:
http://docs.opencv.org/doc/tutorials/features2d/feature_detection/feature_detection.html
然而,当我按照教程使用drawKeypoints()
时,这些点的大小和形状都相同,并且使用看似随意的颜色绘制。
我想我可以遍历每个关键点的属性:绘制一个圆圈,绘制一个箭头(对于角度),根据响应给它一个颜色等等。但我认为必须有一个更好的方法
是否有类似于drawKeypoints()
的内置方法或其他方法可以帮助我更有效地可视化图像的KeyPoints
?
答案 0 :(得分:5)
是的,有执行任务的方法。如documentation
中所述对于每个关键点,关键点周围的圆圈具有关键点大小和 将绘制方向
如果您使用的是Java,则只需指定关键点的类型:
Features2d.drawKeypoints(image1, keypoints1, imageOut2,new Scalar(2,254,255),Features2d.DRAW_RICH_KEYPOINTS);
在C ++中:
drawKeypoints( img_1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DRAW_RICH_KEYPOINTS );
答案 1 :(得分:1)
您可以遍历检测到的关键点矢量,并在每个 KeyPoint.pt 上绘制一个圆圈,其半径类似于 KeyPoint.size 和颜色关于 KeyPoint.response ..这当然只是一个例子;你可以根据KeyPoint的八度和角度编写更复杂的绘图函数(如果你的探测器给出了输出)..
希望这有帮助。
答案 2 :(得分:0)
我遇到了一个类似的问题,想自定义绘制的点,决定共享我的解决方案,因为我想更改绘制的点的形状。
您可以根据需要更改cv2.circle的行。 im是要绘制点的输入图像,keyp是要绘制的关键点,col是线条颜色,th是圆边的粗细。
import cv2
import numpy as np
import matplotlib.pyplot as plt
def drawKeyPts(im,keyp,col,th):
for curKey in keyp:
x=np.int(curKey.pt[0])
y=np.int(curKey.pt[1])
size = np.int(curKey.size)
cv2.circle(im,(x,y),size, col,thickness=th, lineType=8, shift=0)
plt.imshow(im)
return im
imWithCircles = drawKeyPts(origIm.copy(),keypoints,(0,255,0),5)
答案 3 :(得分:0)
你好,这是我的代码@Alex
def drawKeyPts(im, keyp, col, th):
draw_shift_bits = 4
draw_multiplier = 1 << 4
LINE_AA = 16
im = cv2.cvtColor(im, cv2.COLOR_GRAY2BGR)
for curKey in keyp:
center = (int(np.round(curKey.pt[0]*draw_multiplier)), int(np.round(curKey.pt[1]*draw_multiplier)))
radius = int(np.round(curKey.size/2*draw_multiplier))
cv2.circle(im, center, radius, col, thickness=th, lineType=LINE_AA, shift=draw_shift_bits)
if(curKey.angle != -1):
srcAngleRad = (curKey.angle * np.pi/180.0)
orient = (int(np.round(np.cos(srcAngleRad)*radius)), int(np.round(np.sin(srcAngleRad)*radius)))
cv2.line(im, center, (center[0]+orient[0], center[1]+orient[1]), col, 1, LINE_AA, draw_shift_bits)
cv2.imshow('name1', im)
cv2.waitKey()
return im