2012-02-20 19 views
22

की प्रदर्शन तुलना कुछ दिन पहले, मैंने नए ओपनसीवी-पायथन इंटरफ़ेस, cv2 का उपयोग शुरू किया।ओपनसीवी-पायथन इंटरफेस, सीवी और सीवी 2

मेरा प्रश्न cv और cv2 इंटरफ़ेस की तुलना के संबंध में है।

उपयोग की आसानी के संबंध में, नया cv2 इंटरफ़ेस बहुत अधिक सुधार हुआ है, और यह cv2 के साथ काम करने में वास्तव में आसान और मजेदार है।

लेकिन गति के बारे में क्या?

प्रदर्शनों की जांच के लिए मैंने दो छोटे कोड स्निपलेट्स, cv और cv2 में एक और बनाया।


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

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

सीवी इंटरफ़ेस:

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) 

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

परिणाम है:

012,

समय लिया = 1,16368889809

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

देखें, पुराना cvcv2 से 12 times faster है। और परिणामस्वरूप छवियां समान हैं। (इनपुट छवि आकार 720x540 है)

ऐसा क्यों होता है?

सीवी 2 धीमी सीवी की तुलना में धीमी है?

या क्या मैं यहां कोई गलती कर रहा हूं? उपर्युक्त कोड के लिए सीवी 2 में कोई तेज विधि है?

उत्तर

37

cv2.imread() द्वारा लौटाई गई छवि NumPy की एक सरणी वस्तु है। तो आप गति गणना के लिए NumPy के कार्यों का उपयोग कर सकते हैं।

निम्न प्रोग्राम दिखाता है कि ndarray ऑब्जेक्ट की आइटम(), आइटम्ससेट() विधि का उपयोग कर लूप संस्करण के लिए अपनी उत्पत्ति को कैसे गति दें।सीवी संस्करण

0.453000068665 
0.0309998989105 
True 

:

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) 

उत्पादन होता है:

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 की सरणी इंडेक्स का उपयोग करके परिणाम प्राप्त करने के दिखाने आउटपुट है:

0.468999862671 

नोट: अक्ष 0 की लंबाई छवि की ऊंचाई है, अक्ष 1 की लंबाई छवि की चौड़ाई

+0

उत्तर के लिए धन्यवाद। क्या आप कुछ और विवरण जोड़ सकते हैं? क्या आप उपरोक्त प्रक्रिया के लिए एक बेहतर तरीका जानते हैं, किसी भी तेजी से numpy कार्यों आदि? –

+0

@arkiaz, मैंने आपके सीवी 2 को लूप संस्करण के लिए संशोधित किया है, और अब यह सीवी संस्करण के समान गति है। और मैंने और अधिक तेज़ करने के लिए एक numpy संस्करण जोड़ा। – HYRY

+0

धन्यवाद, आपकी पहली विधि सीवी के साथ तुलनीय गति प्रदान करती है, हालांकि कोड थोड़ा बड़ा हो जाता है। परिणाम मेरी छवि 'टी = 1.127' के साथ प्राप्त किया। लेकिन आपकी दूसरी विधि 'टी = 0.054' का बहुत अच्छा परिणाम देती है, लेकिन एक बड़ी ब्लैक स्क्रीन (यानी गलत आउटपुट) देती है। क्यों यह है? –

संबंधित मुद्दे