PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bilder aus einer Webcam "auslesen"



gunfire
15.01.2005, 23:08
sowas ähnliches hab ich in nem anderen Thread schon gefunden (Bilder einer Webcam / DV-Cam analysieren), ich mach aber trotzdem nen neuen auf, da es noch nix mit analysieren zu tun hat, wollte nicht zu sehr offtopic schreiben...

ich will von meiner webcam an die "rohdaten" kommen, sprich irgendwie einzelne Pixel auslesen können um diese dann weiterverarbeiten zu können. Hab mich jetzt mal in DirectX eingearbeitet aber irgendwie ist mir das noch nicht ganz klar wie das gehen soll.
In dem anderen Thread wird die Möglichkeit beschrieben die Bilder aus ner PictureBox auszulesen, geht das auch direkt im Graph von direktshow, also ohne umweg erst zeichnen dann lesen...?

bin für jeden tipp dankbar

Xeus
20.01.2005, 08:41
Hallo ich glaub das das größte problem bei der sache ist das konvertieren von RGB in HGV. Ich bin gerade dabei das ganze über mLab von Mathworks zu realisieren.

wenn du näheres weißt, gib bitte bescheit

gruß xeus

PicNick
20.01.2005, 09:49
Hi, Gunfire !
Hilft es dir, wenn ich dir eine Zip mit ein paar VC++ Projekten schicke, wo
so eine Bildauswertung drin ist ?
(eigentlich für den Lego-Mindstorms, aber man sieht, wie's läuft)
mfg robert

Xeus
20.01.2005, 10:11
Könntest du mir es vielleicht auch schicken?

gruß
xeus

PicNick
20.01.2005, 10:31
Gut, ich schau mal, ob ich so'n upload irgendwie zusammenbringe
:-k sieh' an, geht doch O:)

Gut, da isses, schaut mal rein mfg robert

Haftungsauschluß:
Sollt' irgendein PC zu rauchen beginnen-> ich war'S nicht
Haftung, Folgeschäden, demenz und andere Nebenerscheinungen gehen mich nix an

Xeus
20.01.2005, 10:34
bist du dir sicher das die datei ok ist???

PicNick
20.01.2005, 10:40
Hi, ich bin vielleicht bescheuert, aber nach 25 Jahren Programmieren wirst du nicht mehr nervös.
:-k Weiß nicht, hab's selbst probiert, konnte es downloaden :-b

Xeus
20.01.2005, 10:44
Sorry war mein fehler

PicNick
20.01.2005, 11:33
Hallo, Xeus ! Ich hoff' dein listiges Kästchen kommt nicht drauf', was ich mir grad denk, ich weiß nicht, ob er das verträgt
mfg robert

20.01.2005, 20:37
danke erstmal,
das beispiel ist mit VfW gemacht, nicht mit DirectX, ich versuch das mit dem samplegrabber filter zu machen. leider muss ich directx benutzen da es 4 cameras sind, hast da vielleicht auch ein beispiel :-)

und was soll ich nicht vertragen?

PicNick
21.01.2005, 09:44
Tut mir leid, da hab ich im Moment nix. Was sagt denn der Google dazu ?
mfg robert

NumberFive
23.01.2005, 10:03
Hallo ich habe das mit dem sample grapper fertig. in c++ MS 6.0

ist der Thread noch aktuell ?

PicNick
23.01.2005, 10:50
Na sicher doch. Nachdem im Forum vornehmlich von Sachen berichtet wird, dir NICHT funktionieren, wär's schon, wenn du uns mal an einem Erfolg teilhaben läßt. mfg robert

gunfire
23.01.2005, 22:01
ja er ist noch aktuell,
ich blick da noch nicht ganz durch, ich hab jetzt den samplegrabber soweit dass er mir bmp's auf die platte schreibt. ich will jedoch dass ich gleichzeitig auch den livestream anschauen kann, also:
ich will z.B. 1mal pro sekunde ein Bitmap aber live alles sehen.
ich hab das mal mit dem SmartTree versucht, der ja angeblich den stream teilen kann, leider zeigt er immer nur den gegrabbten teil an.
ja, wie PicNick sagt: "wär's schön, wenn du uns mal an einem Erfolg teilhaben läßt"

NumberFive
23.01.2005, 23:42
Ok leider habe ich den source nicht dabei.
so das ihn jetzt nicht hochladen kann.

also bei mir läuft prv und bilder klauen und auf die platte allso gleich zeitig.
aber vorsicht dann tut die kiste nix anders mehr (AMD 1000) scsi

einteil des source habe ich schon hier veröffentlicht.

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=2486

seite vier aber das hat gunfire ja schon

eines mene ich mich noch dunkel zu erinnern. das schreiben und bilder klauen gleichzeitig ist abhänig vom treiber der karte.

gunfire schreibst du das bilder im grapper ?

gunfire
23.01.2005, 23:46
ja im grabber, aber eigentlich will ich gar nicht schreiben sonder nur analysieren, das schreiben war nur mal so zum testen.
hm wenn du schon mit 1 cam probleme bekommst bin ich mal gespannt wieviel ressourcen dann 4 brauchen, aber das soll nicht das prob. sein.
mir ist nur das mit dem preview nicht klar, wär cool wenn du mal was hochladen könntest.

NumberFive
23.01.2005, 23:57
ja du bekommst noch was so bald ich wieder zugriff habe.

das mit dem grapper vergiss es das tut jetzt noch aber die vorschau
wird nur noch ruckeln.ausser dem gibt das drop frames.

Hast du schon mal mit threads programmier ?

du muß die mit new einfach ein array of byte im speicher an legen

und den pointer dann per nachricht an den anderen Thread schicken.
in dem kannst du dann alles mit den daten machen was du willst.
so mache ich das auch.

Alles klar ?

Gruß

NumberFive
24.01.2005, 20:17
Hallo,

hier sind source auszüge.
Aber nicht kommerziell nutzen



STDMETHODIMP BufferCB( double SampleTime, BYTE * pBuffer, long BufferSize )
{

if(g_bWantBimap)
{

CBitmapData* pBitmapData = new CBitmapData;
if (!pBuffer)
return E_POINTER;

if( pBitmapData->lBufferSize < BufferSize)
{
if (pBitmapData->pBuffer)
{
delete [] pBitmapData->pBuffer;
}
pBitmapData->pBuffer = NULL;
pBitmapData->lBufferSize = 0;
}

// Since we can't access Windows API functions in this callback, just
// copy the bitmap data to a global structure for later reference.
pBitmapData->dblSampleTime = SampleTime;

// If we haven't yet allocated the data buffer, do it now.
// Just allocate what we need to store the new bitmap.
if (!pBitmapData->pBuffer)
{
pBitmapData->pBuffer = new BYTE[BufferSize];
pBitmapData->lBufferSize = BufferSize;
}

if( !pBitmapData->pBuffer )
{
pBitmapData->lBufferSize = 0;
return E_OUTOFMEMORY;
}

// Copy the bitmap data into our global buffer
memcpy(pBitmapData->pBuffer, pBuffer, BufferSize);

pBitmapData->Height = Height;
pBitmapData->Width = Width;

// Post a message to our application, telling it to come back
// and write the saved data to a bitmap file on the user's disk.
PostThreadMessage(m_pRoboControlThreadId, WM_CAPTURE_BITMAP, NULL, (long)pBitmapData);

g_bWantBimap = FALSE;

}
return S_OK;
}

das ist die routine wo das bild verschickt wird

class CBitmapData
{
public:
CBitmapData();
virtual ~CBitmapData();

double dblSampleTime;
long lBufferSize;
BYTE *pBuffer;
BITMAPINFOHEADER bih;
long Width;
long Height;
};

hier ist das bimapt drin

m_pGrabber->SetOneShot(FALSE);
m_pGrabber->SetBufferSamples(TRUE);
m_pGrabber->SetCallback(&g_CB, 1); // 0 = Use the SampleCB callback method.

hier wird der grapper über geben und der Mode bestimmt

// Jetzt den Framegrapper auf bauen

if (!m_pGrabber)
{
hr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
}

CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pGrabber );

CMediaType VideoType;
VideoType.SetType( &MEDIATYPE_Video );
VideoType.SetSubtype( &MEDIASUBTYPE_RGB24 );
hr = m_pGrabber->SetMediaType( &VideoType ); // shouldn't fail

hr = pFg->AddFilter( pGrabBase, L"Grabber" );

// ende
das baut den grapper zu sammen



ich hoffe es hilft dir

wenn du mein test prg haben willst da sag bescheit

gunfire
25.01.2005, 01:46
cool danke, soweit hab ichs im prinzip auch,
kannst du mir das testprog mal schicken? das mit dem preview ist da ja so auch net drin...
wär echt super. danke schonmal...

NumberFive
25.01.2005, 20:26
Hier das test Prg,


if( fMPEG2 )
{
hr = pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,
&MEDIATYPE_Stream, pVCap, pGrabBase, NULL);
if( FAILED( hr ) )
{
ErrMsg(TEXT("Cannot build MPEG2 preview graph!"));
}

}
else
{
hr = pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,
&MEDIATYPE_Interleaved, pVCap, pGrabBase, NULL);
if(hr == VFW_S_NOPREVIEWPIN)
{
// preview was faked up for us using the (only) capture pin
fPreviewFaked = TRUE;
}
else if(hr != S_OK)
{
// maybe it's DV?
hr = pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,
&MEDIATYPE_Video, pVCap, pGrabBase, NULL);
if(hr == VFW_S_NOPREVIEWPIN)
{
// preview was faked up for us using the (only) capture pin
fPreviewFaked = TRUE;
}
else if(hr != S_OK)
{
ErrMsg(TEXT("This graph cannot preview!"));
fPreviewGraphBuilt = FALSE;
return FALSE;
}
}

//
// Render the closed captioning pin? It could be a CC or a VBI category pin,
// depending on the capture driver
//

if(fCapCC)
{
hr = pBuilder->RenderStream(&PIN_CATEGORY_CC, NULL,
pVCap, NULL, NULL);
if(hr != NOERROR)
{
hr = pBuilder->RenderStream(&PIN_CATEGORY_VBI, NULL,
pVCap, NULL, NULL);
if(hr != NOERROR)
{
ErrMsg(TEXT("Cannot render closed captioning"));
}
}
}
}


MS:

// build the preview graph!
//
// !!! PLEASE NOTE !!! Some new WDM devices have totally separate capture
// and preview settings. An application that wishes to preview and then
// capture may have to set the preview pin format using IAMStreamConfig on the
// preview pin, and then again on the capture pin to capture with that format.
// In this sample app, there is a separate page to set the settings on the
// capture pin and one for the preview pin. To avoid the user
// having to enter the same settings in 2 dialog boxes, an app can have its own
// UI for choosing a format (the possible formats can be enumerated using
// IAMStreamConfig) and then the app can programmatically call IAMStreamConfig

08.04.2006, 16:37
danke erstmal,
das beispiel ist mit VfW gemacht, nicht mit DirectX, ich versuch das mit dem samplegrabber filter zu machen. leider muss ich directx benutzen da es 4 cameras sind, hast da vielleicht auch ein beispiel :-)

und was soll ich nicht vertragen?

hihi.. hier ein fremder googler... ist schon ein starkes stück, in das eingabefeld eines fremden users durch google zu gelangen !!!!

NumberFive
10.04.2006, 06:57
Hallo gast was soll mir das jetzt sagen ?

Gruß