WilliamSpiderWeb
Mitglied
Hallo,
Mein Ziel ist es eine Firewire-Kamera anzusteuern.
Im folgenden Code-Abschnitt ist Kamera ein Objekt der Klasse C1394Camera, welche zahlreiche Methoden und Eigenschaften besitzt, mit deren Hilfe mal auf die Kamera zugreifen kann.
Wird der Quellcode so angewendet, bekomme ich ein einziges Bild der Kamera. Allerdings möchte ich einen LIVE-Stream.
Daher habe ich das eigentliche Anzeigen des Bildes in eine globale Funktion gepackt und diese mit AfxBeginThread aufgerufen. Das Problem dabei ist, wie lasse ich meinen Gerätekontext in der Funktion Bildschirm immernoch auf mein App zeigen? Und zweitens, wie kann ich die Member-Variable m_charBild von CMesssystemDlg oder CMesssystemApp verwenden?
Gruß,
Alex
Mein Ziel ist es eine Firewire-Kamera anzusteuern.
Im folgenden Code-Abschnitt ist Kamera ein Objekt der Klasse C1394Camera, welche zahlreiche Methoden und Eigenschaften besitzt, mit deren Hilfe mal auf die Kamera zugreifen kann.
Wird der Quellcode so angewendet, bekomme ich ein einziges Bild der Kamera. Allerdings möchte ich einen LIVE-Stream.
Code:
void CMesssystemDlg::OnCmd1Start()
{
if (Kamera.CheckLink())
AfxMessageBox("Keine Kamera gefunden");
else
{
Kamera.InitCamera();
Kamera.InquireControlRegisters();
Kamera.StatusControlRegisters();
Kamera.SetVideoFormat(Format());
Kamera.SetVideoMode(Mode());
Kamera.SetVideoFrameRate(Rate());
if (Kamera.StartImageAcquisition())
AfxMessageBox("Kann Bild nicht anzeigen. Bitte Einstellungen ändern");
else
{
m_charBild = new unsigned char[Kamera.m_width * Kamera.m_height * 3];
BITMAPINFO bmi;
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = Kamera.m_width;
bmi.bmiHeader.biHeight = Kamera.m_height;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
bmi.bmiHeader.biXPelsPerMeter = 1000;
bmi.bmiHeader.biYPelsPerMeter = 1000;
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
CClientDC dc(this);
Kamera.getDIB(m_charBild);
SetDIBitsToDevice(dc, 0, 0, Kamera.m_width, Kamera.m_height, 0, 0, 0, Kamera.m_height, m_charBild, &bmi, DIB_PAL_COLORS);
}
}
}
Daher habe ich das eigentliche Anzeigen des Bildes in eine globale Funktion gepackt und diese mit AfxBeginThread aufgerufen. Das Problem dabei ist, wie lasse ich meinen Gerätekontext in der Funktion Bildschirm immernoch auf mein App zeigen? Und zweitens, wie kann ich die Member-Variable m_charBild von CMesssystemDlg oder CMesssystemApp verwenden?
Code:
UINT Bildschirm(LPVOID pParam)
{
BITMAPINFO bmi;
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = Kamera.m_width;
bmi.bmiHeader.biHeight = Kamera.m_height;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
bmi.bmiHeader.biXPelsPerMeter = 1000;
bmi.bmiHeader.biYPelsPerMeter = 1000;
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
CClientDC dc(CMesssystemApp);
Kamera.getDIB(CMesssystemApp.m_charBild);
SetDIBitsToDevice(dc, 0, 0, Kamera.m_width, Kamera.m_height, 0, 0, 0, Kamera.m_height, CMesssystemApp.m_charBild, &bmi, DIB_PAL_COLORS);
return(0);
}
void CMesssystemDlg::OnCmd1Start()
{
if (Kamera.CheckLink())
AfxMessageBox("Keine Kamera gefunden");
else
{
Kamera.InitCamera();
Kamera.InquireControlRegisters();
Kamera.StatusControlRegisters();
Kamera.SetVideoFormat(Format());
Kamera.SetVideoMode(Mode());
Kamera.SetVideoFrameRate(Rate());
if (Kamera.StartImageAcquisition())
AfxMessageBox("Kann Bild nicht anzeigen. Bitte Einstellungen ändern");
else
{
m_charBild = new unsigned char[Kamera.m_width * Kamera.m_height * 3];
AfxBeginThread(Bildschirm, NULL);
}
}
}
Gruß,
Alex