2012-02-20 9 views
22

数日前、新しいOpenCV-Pythonインターフェイスcv2を使い始めました。OpenCV-Pythonインターフェイス、cvとcv2の性能比較

私の質問は、cvcv2インターフェイスの比較に関するものです。

使いやすさに関しては、新しいcv2インターフェイスははるかに向上しました。cv2で作業するのは簡単で楽しいです。

しかし、スピードはどうですか?

小さなコードスニペットをcvに、もう1つをcv2に設定して、パフォーマンスを確認しました。 ==

import time 
import numpy as np 
import cv2 

gray = cv2.imread('sir.jpg',0) 
width = gray.shape[0] 
height = gray.shape[1] 
h = np.empty([width,height,3]) 
t = time.time() 
for i in xrange(width): 
    for j in xrange(height): 
     if gray[i,j]==127: 
      h[i,j]=[255,255,255] 
     elif gray[i,j]>127: 
      h[i,j]=[0,0,255-gray[i,j]] 
     else: 
      h[i,j]=[gray[i,j],0,0] 
t2 = time.time()-t 
print "time taken = ",t2 


cv2 interface:以下の両方、同じ機能を行い、画像のアクセス画素、それをテストし、いくつかの変更を行う、等

コードであります========================================== =

結果:

かかる時間= 14.4029130936

======================================= ===============

CVインタフェース:

import cv,time 

gray = cv.LoadImage('sir.jpg',0) 
h = cv.CreateImage(cv.GetSize(gray),8,3) 

t=time.time() 

for i in xrange(gray.width): 
    for j in xrange(gray.height): 
     k = cv.Get2D(gray,j,i)[0] 
     if k==127: 
      cv.Set2D(h,j,i,(255,255,255)) 
     elif k>127: 
      cv.Set2D(h,j,i,(0,0,255-k)) 
     else: 
      cv.Set2D(h,j,i,(k,0,0)) 

t2 = time.time()-t 
print "time taken = ",t2 
cv.ShowImage('img',h) 
cv.WaitKey(0) 

================= ===================

結果は次のとおりです。

撮影時間= 1.16368889809

==================== ===============

ここでは、古いcvは約12 times fasterで、cv2よりも大きくなります。結果として得られる画像も同じです。 (入力画像のサイズは720x540です)

どうしてですか?

cv2はcvに比べて遅いですか?

ここに間違いがありますか?上記のコードでは、cv2にはより高速なメソッドがありますか?

答えて

37

cv2.imread()によって返されるイメージは、NumPyの配列オブジェクトです。 NumPyの関数を使って計算を高速化することができます。

次のプログラムは、ndarrayオブジェクトのitem()、itemset()メソッドを使用して、ループバージョンの原点をスピードアップする方法を示しています。

import time 
import numpy as np 
import cv2 

gray = cv2.imread('lena_full.jpg',0) 
height, width = gray.shape 
h = np.empty((height,width,3), np.uint8) 

t = time.time() 
for i in xrange(height): 
    for j in xrange(width): 
     k = gray.item(i, j) 
     if k == 127: 
      h.itemset(i, j, 0, 255) 
      h.itemset(i, j, 1, 255) 
      h.itemset(i, j, 2, 255) 
     elif k > 127: 
      h.itemset(i, j, 0, 0) 
      h.itemset(i, j, 1, 0) 
      h.itemset(i, j, 2, 255-k) 
     else: 
      h.itemset(i, j, 0, k) 
      h.itemset(i, j, 1, 0) 
      h.itemset(i, j, 2, 0) 
print time.time()-t 

そして、次のプログラムでは、最初のパレットを作成し、その結果を得るためにnumpyのの配列のインデックスを使用する方法を示しています。

t = time.time() 
palette = [] 
for i in xrange(256): 
    if i == 127: 
     palette.append((255, 255, 255)) 
    elif i > 127: 
     palette.append((0,0,255-i)) 
    else: 
     palette.append((i, 0, 0)) 
palette = np.array(palette, np.uint8) 

h2 = palette[gray] 

print time.time() - t 

print np.all(h==h2) 

出力は次のとおりです。

0.453000068665 
0.0309998989105 
True 

CVバージョン出力は:

0.468999862671 

注:軸0の長さは画像の高さ、軸1の長さは画像の幅です

+0

答えをありがとう。詳細をいくつか追加できますか?あなたは上記の手順、より速いnumpy関数などのためのより良い方法を知っていますか? –

+0

@arkiaz、あなたのcv2 forループバージョンを変更しましたが、今はcvバージョンと同じ速度です。さらにスピードアップするためにnumpyバージョンを追加しました。 – HYRY

+0

おかげさまで、最初の方法はcvに匹敵する速度を提供しますが、コードは少し大きくなります。私の画像 't = 1.127'で得られた結果。しかし、あなたの2番目の方法は 't = 0.054'という非常に良い結果をもたらしますが、大きな黒い画面(つまり間違った出力)を与えます。それはなぜです? –

関連する問題