2012-10-27 40 views
5

yeni OpenCV belgeleri here sadece böyle bir Numpy diziye bir IplImage dönüştürebilirsiniz diyor 't destek matematik:hızlı dönüşüm

yapamam bile olsun o kadar
x = arr/0.01 
TypeError: unsupported operand type(s) for /: 'cv2.cv.iplimage' and 'float' 

veri türünü belirtmek çalışırsanız,:

arr = numpy.asarray(im, dtype=num.float32) 
TypeError: float() argument must be a string or a number 

Bu yüzden eski belge here'da sağlanan kodu kullanıyorum. Temelde, bu yapar:

arr = numpy.fromstring(im.tostring(), dtype=numpy.float32) 

Ama tostring çağrı veriyi taklit ediyor belki de gerçekten yavaş? Bu dönüşümün gerçekten hızlı olması ve gerekmediği arabellekleri kopyalamamasına ihtiyacım var. Verilerin doğal olarak uyumsuz olduğunu düşünmüyorum; IplImage'ımı ilk etapta cv.fromarray ile oluşturuyorum, bu da son derece hızlı ve OpenCV fonksiyonları tarafından kabul edildi.

Yeni asarray yönteminin benim için çalışmasını sağlamanın bir yolu var mı, yoksa numpy.fromstring'un kabul edeceği şekilde IplImage'daki veri işaretçisine doğrudan erişebilir miyim? Ubuntu Precise için önceden paketlenmiş OpenCV 2.3.1 kullanıyorum.

+0

OpenCV, Python bağlamaları da çok gelişmiştir. Önce OpenCV 2.4.2 veya 2.4.3rc'yi denemelisiniz. – ypnos

+0

Soru geçerli. Zaten OpenCV 'cv' bindgins için bazı eski Python kodu var. Onlar hala OpenCV 2.4.2'den desteklenmektedir. Bunları "cv2" ye dönüştürmek her zaman bir seçenek olmayabilir. – sastanin

cevap

9

bilgi:
aramak Say:

import cv2.cv as cv #Just a formality! 

Capture = cv.CaptureFromCAM(0) 
Img = cv.QueryFrame(Capture) 

nesne Img bir ipimage ve numpy.asarray(Img)en iyi düzensiz. Ancak! Img[:,:], cvmat türünde ve numpy.asarray(Img[:,:]), fantastik şekilde çalışıyor ve daha önemlisi: hızlı!

Bu, bir çerçeveyi yakalamayı ve numpy işlemesi için ndarray yapabildiğim en hızlı yoldur.

+0

Harika, bunu deneyeceğim. Ne yazık ki yakında olmayacak. – jab

+0

Teşekkürler! Bu harika çalışıyor. –

0

Bu sayfa yaklaşık IplImage hakkında söylenmiyor. Farklı olan CvMat hakkında yazıyor.

Yine de, daha yeni olan cv2 ad alanından sarmalayıcıları kullanmalısınız. Doğal olarak kendi görüntü kapları yerine numpy dizilerini kullanır. Ayrıca, tüm cv modülünün kullanımdan kaldırıldığı kabul edilir ve en yakın ana sürümde tamamen bırakılır.

+1

Yani "cv2.fromarray()" veya bunun gibi bir şey kullanmalıyım, ve sonra "numpy.asarray()" sihirli çalışacak? Dokümanlar için bir bağlantı sağlayabilir misiniz? – jab

+0

Ayrıca, # # @ $ kimsenin bunu nasıl bilmesi gerekiyordu? OpenCV'yi sürüm 0.1'den beri kullanıyorum ve her zaman çığlık atıyorum. Korku filmi gibi - Korkarım kapının arkasında bir canavar olacak, ama yine de açacağım. – jab