2012-09-26 35 views
6

Video karelerini openCV ile okumaya çalışıyorum, verileri cv :: Mat formunda kaydediyorum. sonra bu video karesine "int tipi matris" kabul eden başka bir kodu kullanmak istiyorum. "CvMat" ve "int type matrix" in uyumlu olmadığını biliyorum. Belki opencv ile aşina değilim, ama "cvMat" ve "int mat" arasında herhangi bir dönüşüm yapabilir miyim, böylece yakalanan video kareleri için kodumu kullanabilir miyim? belki doğru değil, "int mat" demek, ama ne demek şudur: dönüşüm

inputData = videoFrame; 

teşekkür ederiz:

cv::Mat videoFrame; 
int inputData[600][400]; 

ben böyle bir şey yapmak istiyorum.

cevap

6

Hızlı yol hafızayı paylaşmaktır: kopya gerekmez. Bir matris değiştirirseniz rağmen, diğer (bariz!) modifiye edilecek olan tipi/boyutunu değiştirir videoFrame ilgili başka OpenCV çağrı bellek yeni bir parça tahsis unutmayın

int inputData[600][400]; 
cv::Mat videoFrame(600, 400, CV_32UC1, inputData); 

nerede olacağına göre saklanabilir. Ayrı veri matrisleri olmasını istiyorsanız

, sen -o verileri çoğaltmak için en hızlı yoldur memcpy kullanabilir:

memcpy((char*)inputData, (char*)videoFrame.data, 600*400*sizeof(int)); 

bu yaklaşımdaki sorun hiç de güvenli olmasıdır. VideoFrame, int türünde değilse ne olur? (Muhtemelen bu char). Ya sürekli bellekte saklanmazsa (olabilir)? ...

+0

Sevgili Vasile, cevabınız için çok teşekkürler. Önerilen yönteminiz oldukça iyi, ancak bellek ayırma ile oynamaktan korkuyorum. Bahsettiğiniz gibi, güvenli olmayabilir ve şimdiye kadar pek çok hafıza problemi yaşadım (bu durum için değil). Başka bir çözüm olabilir mi? Bellek sorunları nedeniyle kodumun yine öldüğünü umuyorum. Tekrar teşekkürler. –

+1

Güvenli yöntem, tüm girişData kullanmak değildir. Algoritmanıza bakın ve sadece videoFrame'i kullanıp kullanamayacağınızı görün. Çoğaltma verileri bazen kötü kodlamanın bir işareti – Sam

+0

Tamam, öneriniz için teşekkür ederiz. –