質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

1760閲覧

[sift.detectAndCompute]を実行すると変数が全て消えてしまう.

ghosts

総合スコア11

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/30 09:30

ステレオ画像から基礎行列を求め,エピポーラ線を計算する.

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki23

2020/10/30 10:02

変数が消えるとはどういうことですか? 実行環境を記載してください
ghosts

2020/11/02 18:09

遅くなり申し訳ありません。 SpyderでバージョンはPython 3.7.4、opencvのバージョンは4.4.0です。 変数が消える、というのは本当にそのままの意味で、10行目 “kp1, des1 = sift.detectAndCompute(img1,None)” が実行されると、それまでにimportやimreadで読み込んだデータがなくなります。あと、関係あるかは分かりませんが、変数が消えるタイミングと同時にコンソールが In [1] になります。加えて、ここでプログラムの実行が終了したかと思えば、「現在のコマンドを終了する」ボタンが押せる状態になっていて実行中のような雰囲気も出してきます。
Bindi

2020/11/09 06:20

変数が消えることはないから、「どういうことですか?」と聞いています。 すべての人がそう思っています。 消えないのに消えると言われても答えられません。だれも答えられない。 import で読み込むのはモジュールで、データではありません。 python は、すべてがオブジェクトなのでデータは存在しません。 変数と呼ばれているものは、オブジェクトなので、データではありません。 プログラムの話をしているのに、「雰囲気」という言葉がでる時点で終わってる。 0 と 1 の世界なので、0 と 1 で話さないと相手に伝わらないですよ。
guest

回答2

0

ソースの8行目を以下に変えましょう
元 sift = cv2.SIFT()
改 sift = cv2.SIFT_create()

最新のopencv-pythonでは何故かcv2.SIFT()は使えなくなっています。

投稿2020/11/17 03:27

syas

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

私の環境で実行してみたら、

Segmentation fault (core dumped)

と表示されました。

ということで、消えていません。C extention の方でエラーが発生しています。
これが回答です。

ここからは余談

別で質問してもらえますか?
opencv2 を使って segmentation fault で落ちるとかなんとかかんとかで。

あと、なんで、そうなるかちょっと調べてみたのですが、わからず。

gdb で調べてみないとだめかも。私には、それをやる気になれない。

opencv2-python と opencv2-contorib-python のバージョンを変えたら動くかもしれませんが、どのバージョンがいいのか、私にはわかりません。

投稿2020/11/09 07:10

Bindi

総合スコア129

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問