2014-10-22 42 views
1

我正在使用OpenCV-Python綁定來編寫我的圖像處理應用程序。我正在尋找一種方法來將圖像的關鍵點寫入到一個文件中,我們可以通過該文件找回匹配的目的。有一個在C/C++做這個代碼,但不能由使用pythonOpenCV-Python:找到將文件寫入文件的代碼

找到一種方法,這種

請任何人對此有一個想法,請與我&我們所有的人分享

感謝

+1

這可能是有幫助的,http://stackoverflow.com/questions/10045363/pickling-cv2-keypoint-causes-picklingerror – bikz05 2014-10-22 06:41:35

+1

感謝您的幫助。我會試試這個。 – 2014-10-22 06:57:08

回答

4

這是你如何做到這一點,從我剛纔給的鏈接啓發。

保存的關鍵點在一個文件中的圖像中

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) 

輸入圖像到第一個腳本

enter image description here

在第二腳本

enter image description here

+0

我試了一下代碼,描​​述符在兩個圖像中都在同一個圖像上。檢查代碼,我也拋棄了'pt'。 – bikz05 2014-10-22 08:07:18

+0

我會嘗試並讓你知道。謝謝 – 2014-10-22 08:10:20

+0

完美地在我的系統上運行。 – bikz05 2014-10-22 08:10:45

2

爲此我建議使用Pickle或cPickle。它的簡單和對我來說,它在大多數情況下工作。一個簡短的介紹,你可以找到PyMOTW - Pickle

要注意的是,您可以在文件中更多次地使用dump,並且能夠爲每個dump返回loads

編輯:如果您希望將數據保存到一個文件,這裏是一個簡短的片段:

import pickle 

data = ['your stuff'] 

with open('fileNameToSave.ext', 'wb') as f: 
    pickle.dump(data, f, -1) # -1 for best compression available 

如果您需要在數據如何存儲更多的控制,你可以使用Struct (PyMOTW)。 在這裏你可以完全控制,但如果內存有問題,你也必須自己壓縮數據。作爲回報,你可以控制字節順序,字節順序等。因此跨語言數據交換相對簡單。

希望我能幫助:)

0

我已經找到一種方法來做到這一點沒有「泡菜」顯示的圖像。

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)