2017-08-22 2 views
0

にマスクパラメータを使用するには、私がこれまでずっとこのことを学んだ:OpenCVの、Pythonの:どのようにStackOverflowにいくつかの答えを読むことによってORBの特徴検出器

マスクは同じを持っているnumpy配列(なければなりませんデータ型はCV_8UC1)、値は0から255までです。

これらの数字の意味は何ですか?対応するマスク値が0のピクセルは検出プロセスで無視され、マスク値が255のピクセルは使用されますか?その間の値はどうですか?

また、データ型がCV_8UC1numpyの配列をPythonで初期化するにはどうすればよいですか?ちょうど使用することができますdtype=cv2.CV_8UC1

私が上記で行っている前提に基づいて、現在使用しているコードはここにあります。しかし、問題は、いずれかの画像に対してdetectAndComputeを実行すると、キーポイントが得られないということです。マスクが正しいデータ型ではないと感じています。もし私がそれについて正しいのであれば、それをどうやって修正するのですか?使用するピクセルと255件の手段を無視する

これらの数字の意味

0は何ですか手段:だからここ

# convert images to grayscale 
base_gray = cv2.cvtColor(self.base, cv2.COLOR_BGRA2GRAY) 
curr_gray = cv2.cvtColor(self.curr, cv2.COLOR_BGRA2GRAY) 

# initialize feature detector 
detector = cv2.ORB_create() 

# create a mask using the alpha channel of the original image--don't 
# use transparent or partially transparent parts 
base_cond = self.base[:,:,3] == 255 
base_mask = np.array(np.where(base_cond, 255, 0)) 

curr_cond = self.base[:,:,3] == 255 
curr_mask = np.array(np.where(curr_cond, 255, 0), dtype=np.uint8) 

# use the mask and grayscale images to detect good features 
base_keys, base_desc = detector.detectAndCompute(base_gray, mask=base_mask) 
curr_keys, curr_desc = detector.detectAndCompute(curr_gray, mask=curr_mask) 

print("base keys: ", base_keys) 
# [] 
print("curr keys: ", curr_keys) 
# [] 
+2

「numpy配列を初期化するにはどうすればよいですか」 - [numpyのデータ型に関するドキュメント](https://docs.scipy.org/doc/numpy/user/basics.types.html)を読んでみましたか? ? –

+0

質問は、そのリストのどのデータ型にCV_8UC1は対応していますか?私は8とUのためにuint8だと信じる傾向がありますが、それを確認する文書は見つかりませんでした。問題は、私がそのキーポイントを取得していないことです。 –

+0

http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html - 最初の段落。あなたはそれを正しく得ました、 'uint8'。 |マスクを検査し、それらが意味をなさないことを確認します。 –

答えて

0

は答えの、ほとんど、すべてではないですそれ。その間の値はまだ不明ですが、非ゼロ値はすべてマスクの255と「等価」とはみなされません。 hereを参照してください。

また、データ型CV_8UC1のnumpy配列をPythonで初期化するにはどうすればよいですか?

タイプCV_8Uは符号なし8ビット整数で、numpyを使用するとnumpy.uint8です。 C1ポストフィックスは、配列がカラーイメージの場合は3チャネル、rgbaイメージの場合は4チャネルではなく、1チャネルであることを意味します。

import numpy as np 
np.zeros((480, 720), dtype=np.uint8) 

このマスクは検出器および抽出器を引き起こす(3チャンネル・アレイ等の形状(480, 720, 3)、4チャネル(480, 720, 4)を有するであろう)ので、符号なし8ビット整数の1チャネル・アレイを作成しますイメージ全体を無視することはできますが、それはすべてゼロであるからです。

[コード]の修正方法を教えてください。

2つの別々の問題があり、それぞれ別々にキーポイント配列が空になります。

curr_cond = self.base[:,:,3] == 255 # wrong 
curr_cond = self.curr[:,:,3] == 255 # right 

いくつかの非常にダムのミス:

まず、私はbase_mask

base_mask = np.array(np.where(base_cond, 255, 0)) # wrong 
base_mask = np.array(np.where(base_cond, 255, 0), dtype=uint8) # right 

第二の型を設定するのを忘れ、私は私のcurr_cond配列を生成するために間違ったイメージを使用していました。ここ

フル補正コードである:

# convert images to grayscale 
base_gray = cv2.cvtColor(self.base, cv2.COLOR_BGRA2GRAY) 
curr_gray = cv2.cvtColor(self.curr, cv2.COLOR_BGRA2GRAY) 

# initialize feature detector 
detector = cv2.ORB_create() 

# create a mask using the alpha channel of the original image--don't 
# use transparent or partially transparent parts 
base_cond = self.base[:,:,3] == 255 
base_mask = np.array(np.where(base_cond, 255, 0), dtype=np.uint8) 

curr_cond = self.curr[:,:,3] == 255 
curr_mask = np.array(np.where(curr_cond, 255, 0), dtype=np.uint8) 

# use the mask and grayscale images to detect good features 
base_keys, base_desc = detector.detectAndCompute(base_gray, mask=base_mask) 
curr_keys, curr_desc = detector.detectAndCompute(curr_gray, mask=curr_mask) 

TL; DR:マスクパラメータを使用する場合(機能を見つけようとしたグレースケール画像と同じ形状を有する1チャネルnumpyアレイであります画像の形状は(480, 720)ですので、マスクです)。配列の

値はタイプnp.uint8のものであり、255は「このピクセルを使用する」を意味し、0この回答の一部に私を導くためのDan Mašek

おかげで「ない」を意味します。

関連する問題