2016-10-12 2 views
2

ここでは愚かな質問があります。cv2.findNonZeroとNumpy.NonZeroの違い

いくつかの白黒画像からピクセルの場所を探して、NumpyライブラリとOpenCVからこの2つの機能が見つかりました。

Iは、インターネット(http://docs.opencv.org/trunk/d1/d32/tutorial_py_contour_properties.html)上に見出さ例:

mask = np.zeros(imgray.shape,np.uint8) 
    cv2.drawContours(mask,[cnt],0,255,-1) 
    pixelpoints = np.transpose(np.nonzero(mask)) 
    pixelpointsCV2 = cv2.findNonZero(mask) 

述べ

OpenCVのはの座標を(与えながらnumpyのは、(行、列)形式の座標を与えますx、y)フォーマット。したがって、基本的に回答は交換されます。 row = xおよびcolumn = yに注意してください。

私の英語の理解に基づいて、説明が間違っていませんか?それはすべきではない:OpenCVのは(Y、X)又は(列、行)形式の座標を与えながら

numpyのは、(行、列)形式の座標を与えます。

私の質問は以下のとおり

  1. はnumpyのリターン(行、列)/(x、y)のとOpenCVの(Y、X)行= xで、COLをい= y? IMHOは行= yでなければならないが、col = x?

  2. どちらが計算効率が良いですか?時間の面では&のリソースです。

多分、私は非母国語の英語の話者ではないため、この単純なことを正しく理解できません。

+2

間違った部分は_Note that、row = xとcolumn = y_とするべきだと思う:_Note that、** row = y ** and ** column = x ** _。したがって、1)numpyは(row、col)=(y、x)を返し、OpenCVは(x、y)=(col、row)を返します。 2)テストをいくつか実行するだけですが、大きな違いはないと思います。あなたはPythonで作業しているので、私はPythonのものを使用したい(numpy) – Miki

+0

@Miki私はいくつかのテストを実行し、実際OpenCVは(x、y)=(col、row)を返します。あなたが回答としてあなたのコメントを投稿すれば、私はそれを受け入れるでしょう – Roxanne

+0

答えとして掲示される。うまくいきました; D – Miki

答えて

4

ドキュメントのエラーがあり:OpenCVのは、(x、y)の形式で座標を与えながら

numpyのは、(行、列)形式の座標を与えます。したがって、基本的に回答は交換されます。 注意:row = xおよびcolumn = yです。row = yとcolumn = xに注意してください。

だから、あなたの質問について:

  1. numpyのは(row,col) = (y,x)を返し、OpenCVのは、あなたが行列全体をスキャンして、いくつかのポイントを取得する必要が(x,y) = (col,row)
  2. 返します。私はパフォーマンスに大きな違いがあるとは思わない(がテストされるはずです!)。

    Pythonを使用しているので、おそらくPythonの機能を使用する方がよいでしょう。数が少ない。これらの2つのバージョンを比較する

ランタイムテスト -

In [86]: mask = (np.random.rand(128,128)>0.5).astype(np.uint8) 

In [87]: %timeit cv2.findNonZero(mask) 
10000 loops, best of 3: 97.4 µs per loop 

In [88]: %timeit np.nonzero(mask) 
1000 loops, best of 3: 297 µs per loop 

In [89]: mask = (np.random.rand(512,512)>0.5).astype(np.uint8) 

In [90]: %timeit cv2.findNonZero(mask) 
1000 loops, best of 3: 1.65 ms per loop 

In [91]: %timeit np.nonzero(mask) 
100 loops, best of 3: 4.8 ms per loop 

In [92]: mask = (np.random.rand(1024,1024)>0.5).astype(np.uint8) 

In [93]: %timeit cv2.findNonZero(mask) 
100 loops, best of 3: 6.75 ms per loop 

In [94]: %timeit np.nonzero(mask) 
100 loops, best of 3: 19.4 ms per loop 

をこのように、様々なdatasizes全体でnumpyの対応物の上に何かの周り3xスピードアップをOpenCVの結果を使用しているようです。

+0

パフォーマンス上、 'cv2'はさまざまなデータセット間で' 3x'の周りにいるようです。 – Divakar

+0

@Divakarありがとう。あなたが小さなベンチマークを持っていれば、答えに追加することができます(そして私はそれを "コミュニティ回答"にします); D – Miki

+0

編集内容があなたの考えと一貫しているかどうかを確認してください。必要に応じてさらに編集してください。また、私はあなたが個人的な投稿としてそれを保つべきだと思う:) – Divakar

関連する問題