我正在使用OpenCV-Python绑定来编写我的图像处理应用程序。我正在寻找一种方法将图像的关键点写入文件中,我们可以将其返回以进行匹配。 C / C ++中有代码可以做到这一点,但是使用python
找不到相应的方法请有人对此有所了解,请与我分享&我们所有人
由于
答案 0 :(得分:6)
这是你如何做到这一点,灵感来自我之前给出的链接。
将关键点保存在文件中
import cv2
import cPickle
im=cv2.imread("/home/bikz05/Desktop/dataset/checkered-3.jpg")
gr=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
d=cv2.FeatureDetector_create("SIFT")
kp=d.detect(gr)
index = []
for point in kp:
temp = (point.pt, point.size, point.angle, point.response, point.octave,
point.class_id)
index.append(temp)
# Dump the keypoints
f = open("/home/bikz05/Desktop/dataset/keypoints.txt", "w")
f.write(cPickle.dumps(index))
f.close()
在图片中加载和显示关键点
import cv2
import cPickle
im=cv2.imread("/home/bikz05/Desktop/dataset/checkered-3.jpg")
index = cPickle.loads(open("/home/bikz05/Desktop/dataset/keypoints.txt").read())
kp = []
for point in index:
temp = cv2.KeyPoint(x=point[0][0],y=point[0][1],_size=point[1], _angle=point[2],
_response=point[3], _octave=point[4], _class_id=point[5])
kp.append(temp)
# Draw the keypoints
imm=cv2.drawKeypoints(im, kp);
cv2.imshow("Image", imm);
cv2.waitKey(0)
输入图像到第一个脚本
在第二个脚本中显示图像
答案 1 :(得分:2)
为此,我建议使用Pickle或cPickle。它很简单,对我来说它适用于大多数情况。您可以在PyMOTW - Pickle找到简短的介绍。
要注意的是,您可以在文件中dump
次多次,并且能够使用loads
为每个dump
获取数据。
编辑:如果您希望将数据保存到文件中,这里有一个简短的片段:
import pickle
data = ['your stuff']
with open('fileNameToSave.ext', 'wb') as f:
pickle.dump(data, f, -1) # -1 for best compression available
如果您需要更多地控制数据的存储方式,可以使用Struct (PyMOTW)。 在这里你可以完全控制,但如果记忆很重要,你也必须自己压缩数据。作为回报,您可以控制Endianness(字节顺序),填充等。因此跨语言数据交换相对简单。
希望我能提供帮助:)
答案 2 :(得分:0)
我找到了一种没有" pickle"的方法。
import cv2
img1 = cv2.imread("bat1.jpg")
gr_img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
sift = cv2.SIFT()
kps = sift.detect(gr_img1)
f = open("bat_dump.txt", "w")
for point in kps:
p = str(point.pt[0]) + "," + str(point.pt[1]) + "," + str(point.size) + "," + str(point.angle) + "," + str(
point.response) + "," + str(point.octave) + "," + str(point.class_id) + "\n"
f.write(p)
f.close()
kps = []
lines = [line.strip() for line in open('bat_dump.txt')]
for line in lines:
list = line.split(',')
kp = cv2.KeyPoint(x=float(list[0]), y=float(list[1]), _size=float(list[2]), _angle=float(list[3]),
_response=float(list[4]), _octave=int(list[5]), _class_id=int(list[6]))
kps.append(kp)
img2 = cv2.imread("bat1.jpg")
img2 = cv2.drawKeypoints(img2, kps)
cv2.imshow("img2", img2)
cv2.waitKey(0)