ステレオ画像から基礎行列を求め,エピポーラ線を計算する.
Pythonでエピポーラ幾何に関する計算を行う途中で,[sift.detectAndCompute]を実行した時に変数が全て消えてしまう現象に悩まされています.
以下のソースコード中の10,11行目にあたる部分です。
発生している問題・エラーメッセージ
エラーメッセージはないのですが,それまで存在していた変数が全て消えてしまいます.
該当のソースコード
Python
1import cv2 2import numpy as np 3from matplotlib import pyplot as plt 4 5img1 = cv2.imread('sample1.jpg',0) 6img2 = cv2.imread('sample2.jpg',0) 7 8sift = cv2.SIFT() 9 10kp1, des1 = sift.detectAndCompute(img1,None) #この部分です 11kp2, des2 = sift.detectAndCompute(img2,None) 12 13FLANN_INDEX_KDTREE = 0 14index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5) 15search_params = dict(checks=50) 16 17flann = cv2.FlannBasedMatcher(index_params,search_params) 18matches = flann.knnMatch(des1,des2,k=2) 19 20good = [] 21pts1 = [] 22pts2 = [] 23 24for i,(m,n) in enumerate(matches): 25 if m.distance < 0.8*n.distance: 26 good.append(m) 27 pts2.append(kp2[m.trainIdx].pt) 28 pts1.append(kp1[m.queryIdx].pt) 29 30pts1 = np.int32(pts1) 31pts2 = np.int32(pts2) 32F, mask = cv2.findFundamentalMat(pts1,pts2,cv2.FM_LMEDS) 33 34pts1 = pts1[mask.ravel()==1] 35pts2 = pts2[mask.ravel()==1] 36 37def drawlines(img1,img2,lines,pts1,pts2): 38 ''' img1 - img2上の点に対応するエピポーラ線を描画する画像 39 lines - 対応するエピポーラ線 ''' 40 r,c = img1.shape 41 img1 = cv2.cvtColor(img1,cv2.COLOR_GRAY2BGR) 42 img2 = cv2.cvtColor(img2,cv2.COLOR_GRAY2BGR) 43 for r,pt1,pt2 in zip(lines,pts1,pts2): 44 color = tuple(np.random.randint(0,255,3).tolist()) 45 x0,y0 = map(int, [0, -r[2]/r[1] ]) 46 x1,y1 = map(int, [c, -(r[2]+r[0]*c)/r[1] ]) 47 img1 = cv2.line(img1, (x0,y0), (x1,y1), color,1) 48 img1 = cv2.circle(img1,tuple(pt1),5,color,-1) 49 img2 = cv2.circle(img2,tuple(pt2),5,color,-1) 50 return img1,img2 51 52lines1 = cv2.computeCorrespondEpilines(pts2.reshape(-1,1,2), 2,F) 53lines1 = lines1.reshape(-1,3) 54img5,img6 = drawlines(img1,img2,lines1,pts1,pts2) 55 56lines2 = cv2.computeCorrespondEpilines(pts1.reshape(-1,1,2), 1,F) 57lines2 = lines2.reshape(-1,3) 58img3,img4 = drawlines(img2,img1,lines2,pts2,pts1) 59 60plt.subplot(121),plt.imshow(img5) 61plt.subplot(122),plt.imshow(img3) 62plt.show()
試したこと
エラーも出ないのでどうしていいか分からず,何も試せていません.
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
変数が消えるとはどういうことですか?
実行環境を記載してください
遅くなり申し訳ありません。
SpyderでバージョンはPython 3.7.4、opencvのバージョンは4.4.0です。
変数が消える、というのは本当にそのままの意味で、10行目 “kp1, des1 = sift.detectAndCompute(img1,None)” が実行されると、それまでにimportやimreadで読み込んだデータがなくなります。あと、関係あるかは分かりませんが、変数が消えるタイミングと同時にコンソールが In [1] になります。加えて、ここでプログラムの実行が終了したかと思えば、「現在のコマンドを終了する」ボタンが押せる状態になっていて実行中のような雰囲気も出してきます。
変数が消えることはないから、「どういうことですか?」と聞いています。
すべての人がそう思っています。
消えないのに消えると言われても答えられません。だれも答えられない。
import で読み込むのはモジュールで、データではありません。
python は、すべてがオブジェクトなのでデータは存在しません。
変数と呼ばれているものは、オブジェクトなので、データではありません。
プログラムの話をしているのに、「雰囲気」という言葉がでる時点で終わってる。
0 と 1 の世界なので、0 と 1 で話さないと相手に伝わらないですよ。