2010-10-11 17 views
6

Bir numpy dizisine opencv'nin Threshold işlevini uygulamak istiyorum. Opencv 2.1 için python bağlamaları kullanıyorum. Böyle giderse:Bir numpy dizisine opencv eşiğini uygula

import cv 
import numpy as np 
a = np.random.rand(1024,768) 
cv.Threshold(a,a,0.5,1,cv.CV_THRESH_BINARY) 

ve bu bir hata atar:

OpenCV Error: Unsupported format or combination of formats() in threshold 

Yani, ben ne yaptığımı biliyorum ikna olmuş değilim, ama için, Threshold gibi çalışmak umuyordum herhangi bir sorunla karşılaşmadan

cv.Smooth(a,a) 

çalıştırmak ve düzgün bir (er) görüntü ile sona erebilir, burada, örneğin, Smooth. Opencv'in onları gördükleri gibi numpy dizilerinin "formatları" hakkında nasıl düşüneceğimi bilmiyorum, ama eğer gerekmiyorsa numpy dizisini bir opencv görüntü formatına dönüştürmek için can atıyorum (ve tüm girişimlerim başarısız oldu her neyse.

Neden Threshold açıkçası naif bir şekilde çalışmıyorum bilmek istiyorum çalışmayı deniyorum ve bunun yerine ne yapmalıyım bilmek harika olurdu.

P.S. Kendimdeki numpy dizisinde bir eşikleme işlemi yapabileceğimi biliyorum, ama opencv'i anlamaya çalışıyorum.

cevap

10

Görünüşe göre Threshold yöntemi, Düzgün'den daha fazla bozuktur - yalnızca 8 bit tam sayı/32 bit kayan nokta dizisinde çalışır (bkz. here), böylece kod snippet'iniz çalışmaz, çünkü numpy dizileri float64 için varsayılan değere sahiptir.

>>> a = np.array(np.random.rand(1024,768),dtype=‘float32’) 

o zaman eşiğinden mutlu size 32 bitlik şamandıraya hassas zorlamak için dizi oluşturmak hattını değiştirmek Yani eğer:

>>> ((a>0) & (a<1)).sum() 
786432 
>>> cv.Threshold(a,a,0.5,1,cv.CV_THRESH_BINARY) 
>>> ((a>0) & (a<1)).sum() 
0