Bir web kamerasından çerçeveler almak ve SFML kullanarak bir pencerede görüntülemek için OpenCV'yi kullanmaya çalışıyorum.OpenCV 2.3: Mat'ı RGBA piksel dizisine dönüştürme
VideoCapture, OpenCV'nin Mat biçimindeki kareleri döndürür. Çerçeveleri görüntülemek için SFML, uint8 biçiminde bir 1D piksel dizisi gerektirir; bu, (anlayabildiğim kadarıyla) uchar ile değiştirilebilir. Bu dizinin piksel RGBA başına 32 bit göstermesi bekleniyor.
Yani, bir UCHAR dizi var ve Mat veriler üzerinden döngü ve her pikseli taklit ediyorum:
VideoCapture cap(0);
Mat frame;
cap >> frame;
uchar* camData = new uchar[640*480*4];
uchar* pixelPtr = frame.data;
for(int i = 0; i < frame.rows; i++)
{
for(int j = 0; j < frame.cols; j++)
{
camData[i*frame.cols + j + 2] = pixelPtr[i*frame.cols + j + 0]; // B
camData[i*frame.cols + j + 1] = pixelPtr[i*frame.cols + j + 1]; // G
camData[i*frame.cols + j + 0] = pixelPtr[i*frame.cols + j + 2]; // R
camData[i*frame.cols + j + 3] = 255;
}
}
img.LoadFromPixels(640, 480, camData); //Load pixels into SFML Image object for display
Maalesef bu oldukça çalışır değil. Bu döngüdeki bir şey yanlıştır, çünkü camData yüklendiğinde ve görüntülediğimde ortaya çıkan görüntü şifrelenmiştir.
Fark edebildiğime göre, döngüdeki matematiğim yanlıştır, dolayısıyla pikseller yanlış atanır veya Mat verisi BGR dışında bir biçimde olur.
Herhangi bir fikrin var mı?
Tam olarak ne demek donduruyor? Ortaya çıkan görüntünün bir örneğini gönderebilir misiniz? – sietschie
[Örnek] (http://i.imgur.com/dD2fk.png). Kaynak görüntüdeki piksel verileri, hedef dizideki doğru konumlarda sona ermiyor, bu nedenle tuhaf aralama desenleri oluşturuyor. – Thew
, gpu/opencl'den veriyi geri yükledikten ve dosyaya döktükten hemen sonra aynı desene sahipti: D –