web-dev-qa-db-ja.com

OpenCV-Pythonインターフェース、cvおよびcv2のパフォーマンス比較

数日前、私は新しいOpenCV-Pythonインターフェースcv2を使い始めました。

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

使いやすさに関しては、新しいcv2インターフェースが大幅に改善され、cv2を操作するのは本当に簡単で楽しいです。

しかし、速度はどうですか?

パフォーマンスを確認するために、1つはcvに、もう1つはcv2に2つの小さなコードスニペットを作成しました。どちらも同じ機能を果たし、画像のピクセルにアクセスし、テストし、いくつかの変更を加えます。

以下はコードです:


cv2 interface

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

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

そして結果は次のとおりです。

所要時間= 14.4029130936

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

cv interface:

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

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

ここで、古いcv12 times fasterよりもcv2についてです。そして、結果の画像は同じです。 (入力画像のサイズは720x540です)

なぜこれが起こるのですか?

Cv2はcvと比較して遅いですか?

それとも私はここで何か間違いを犯していますか?上記のコードのcv2に高速な方法はありますか?

25
Abid Rahman K

Cv2.imread()によって返される画像は、NumPyの配列オブジェクトです。したがって、NumPyの関数を使用して計算を高速化できます。

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

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の長さは画像の幅です

39
HYRY