2011-08-02 23 views
8

Kinect ve OpenCV ile çalışıyorum. Bu forumu zaten araştırıyorum ama problemim gibi bir şey bulamadım. Ben Kinect (16 bit) ham derinlik verilerini tutmak, ben * Bir CvMat depolamak ve sonra cvGetImage iletecek ondan bir IplImage * oluşturmak için:16-bit derinliğe CvMat * 8 bit derinliğe dönüştürme

CvMat* depthMetersMat = cvCreateMat(480, 640, CV_16UC1); 
[...] 
cvGetImage(depthMetersMat,temp); 

Ama şimdi çalışmak gerekir cvThreshdold yapmak ve konturları bulmak için bu görüntüde. Bu 2 fonksiyonun girişte 8 bit derinliğinde bir görüntüye ihtiyacı vardır. CvMat * depthMsersMat'ı 8 bit derinlikli CvMat * 'a nasıl dönüştürebilirim?

cevap

2

Bu çalışması gerekir:

CvMat* depthMetersMat = cvCreateMat(480, 640, CV_16UC1); 
cv::Mat m2(depthMetersMat, true); 
m2.convertTo(m2, CV_8U); 

Ama according to the OpenCV docs, CvMat kullanılmıyor. Bunun yerine Mat kullanmalısınız.

19

@SSteve'nin verdiği yanıt neredeyse benim için hile yaptı, ancak convertTo numaralı çağrı, değerleri gerçekten 8 bitlik bir aralıkta ölçeklendirmek yerine yüksek sıralı baytı kesmek gibi görünüyordu. @Sirnino, hangi davranışın istenildiğini belirtmediğinden, bunu yapmak isteyen herkesin (doğrusal) ölçeklemeyi yapacak kodu yayınlayacağını düşündüm.

SSteve orijinal kodu:

CvMat* depthMetersMat = cvCreateMat(480, 640, CV_16UC1); 
cv::Mat m2(depthMetersMat, true); 
m2.convertTo(m2, CV_8U); 

sadece (8 bit ölçeklendirme için 16 bit 1/256 veya 0.00390625) ölçek faktörünü eklemek gerekir, değerlerini ölçeklemek için olduğu gibi convertTo

m2.convertTo(m2, CV_8U, 0.00390625); 

çağrısına üçüncü parametrenin (a) Ayrıca bu alfa ile çarpılır sonra her değer eklenecektir dördüncü parametre (ö) ekleyin. Daha fazla bilgi için docs'a bakın.

+2

"Değerleri ölçeklendir" ne anlama geliyor? – Maystro

+2

@Maystro, imzasız bir 16 bitlik bir sayı 0 ile 65.535 arasında bir değere sahip olabilir, ancak 0 - 255 değerlerini tutabilecek 8 bitlik bir sayıya sığdırmak için değerlere ihtiyacımız var. Bu nedenle bir ölçek faktörü uygularız Bu, her değeri bir sabit ile çarptığınız anlamına gelir, bu durumda, 0,00390625 ile. 0 ile 255 arasında bir değere sahip olan orijinal matriste herhangi bir sayı 0, 256 ile 511 arasında bir değer alır. 1, 512 ila 767, 2 olur. – Gillfish

+1

Yani, m2.convertTo (m2/256, CV_8U) gibidir. sağ? Başka bir soru, ya bir ölçek faktörü parametresini geçemediysek? nasıl hesaplanacak? – Maystro

İlgili konular