2017-12-10 2 views
2

私は、生成されたリストのキーポイントで840,525に最も近い座標を見つけようとしています。ポイントのリストから画面の中央に最も近いポイントを探しようとしています

背景: 画面の中央にあるブロブ(OpenCVはそれぞれの中心に座標を与える)を別のブロブに移動するシステムで作業していましたが、一度に複数のブロブが生成されていますしかし、私は中央の私の位置から最も近いブロブに行きたい(840,525)。ブロブはOpenCVによって発見されます。中央のブロブがマウスポインタの座標に移動すると、その瞬間が私のマウスによって制御されます。

現在、カーソルが見つかった最初のポイントにカーソルを置くだけです。

detector = cv2.SimpleBlobDetector_create(params) 

# Detect blobs. 
keypoints = detector.detect(processed_img) 

#put curser on top of blob 
win32api.SetCursorPos((int(keypoints[0].pt[0]),(int(keypoints[0].pt[1])))) 

# Draw detected blobs as red circles. 
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures the size of the circle corresponds to the size of blob 
processed_img = cv2.drawKeypoints(processed_img, keypoints, np.array([]), (255, 0, 0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) 

さて、OpenCVは私に大きなリストまたは配列を与えますか?私はピクセル座標に変換します。私はどのように(840,525)である中央にクローゼット1のリストまたは配列を検索するか分からない。私はループごとに1がキーポイントの.pt属性から取得することができますOpenCVの中keypointオブジェクトの最も近い:(

+0

「最も近いブロブ」とは、いくつかのピクセルに言うと、これはいくつかの異なることを意味する可能性があります。ブロブは多くのピクセルでできています。ブロブの中心のようなものから、またはブロブの端の最も近いピクセルからその点までを測定したいですか?また、「VisualBasicのようなものではなく、私はすべてのものを見つけることができますが、最も近いものを見つけることができます」 - Pythonを含む基本的にすべてのプログラミング言語であなたができることは間違いない... –

+0

OpenCVは私の投稿を編集しますブロブを作成し、それに単一の座標値を与えます。私は方法を知っていればリストをループすることができました。私はxとyを分割する方法を知っていますが、最初の値よりも多くの値を検索する方法がわかりません。 – jacksalssome

+0

[* minimal *と* complete *検証可能な例](https://stackoverflow.com/help/mcve)を与えるために編集できますか?特に処理されたイメージの例と、正確に何が起こりたいのですか?それが現れても、誰もこのコードをコピーして貼り付けて実行することはできません。私はまたあなたがここで尋ねているものを本当に理解していません。 blobを別のblobに移動することは、どういう意味ですか? 「瞬間が私のマウスによって制御される」とはどういう意味ですか? –

答えて

2

実際のピクセル位置を見つけることができますがどこ

おかげで、そのVisualBasicのが好きではありません。

例えば、画像内のキーポイントを検出した後、最初のキーポイントの座標を印刷するようになり

を:あなたが行うことができるようにしたいどのような

>>> keypoints[0].pt 
(100.80000305175781, 100.80000305175781) 

は最も近いkeypoinをつかむです何らかの指定された位置に移動する。 Pythonの組み込み関数を使用して、これを行うには本当に簡単な方法が2つあります。 min()sorted()の両方の関数は、比較する数値の作成に使用されるkey引数を受け取ります。各キーポイントと設定点の距離が必要です。 sorted()を実行した場合、すべてのキーポイントが最小距離で注文されます。min()を実行した場合は、そのうちの1つを最小にするだけです(もっと速くなります)。

設定点(10,20)に最も近いキーポイント(ここで(x、y)の順序を使用して検出)を検出したいとします。あなたは、単に行うことができます。

>>> pt = np.array([10, 20]) 
>>> nearest_kp = min(keypoints, key=lambda kp: np.linalg.norm(kp.pt - pt)) 
>>> nearest_kp.pt 
(100.22400665283203, 100.22400665283203) 

注ここで返された値が、まだキーポイントであるので、それの実際の場所はまだ.pt属性でつかんする必要があること。

+0

あなたの驚異!Ivはこの2日間働いていたので、とてもシンプルでとてもうまくいきます。私はちょうどあなたが言ったように、10、20を840,525に置き換えました。私はそれを解決済みとマークした。 – jacksalssome

+0

@jacksalssomeここでの厄介なことは、 'keypoints'が*オブジェクト*のリストであることですが、それはPythonのために十分に文書化されていないので、実際のポイントを得る方法を知ることは難しいです。将来参照するために、オブジェクトに対してPython関数 'dir()'を使用すると、利用可能なメソッドと属性を見ることができます。例えば、あなたの質問に答えるには、属性が '.pt'か' .point'かどうかを忘れていたので、私は 'dir(keypoints [0])'を使って利用可能なすべてのメソッドと属性を見ました。これは他のオブジェクトにも便利ですので、心の中に入れておいてください:) –

+0

これでいいのですが、ドキュメントはまったくありません。 – jacksalssome

関連する問題