visual c++ - Get iplImage or Mat from directshow to opencv -
i had change directshow eyetracking software due difficulties change resolution of camera when using c++ , opencv.
directshow new me , kind of hard understand everything. found nice example works capturing & viewing web cam.
http://www.codeproject.com/articles/12869/real-time-video-image-processing-frame-grabber-usi
i using version not requires directshow sdk. (but still directshow used in example, right??)
#include <windows.h> #include <dshow.h> #pragma comment(lib,"strmiids.lib") #define dshook(a,b,c) if (!c##_) { int_ptr* p=b+*(int_ptr**)a; virtualprotect(&c##_,4,page_execute_readwrite,&no);\ *(int_ptr*)&c##_=*p; virtualprotect(p, 4,page_execute_readwrite,&no); *p=(int_ptr)c; } // here image video data in buf / len. process before calling receive_ because renderer dealocates it. hresult ( __stdcall * receive_ ) ( void* inst, imediasample *smp ) ; hresult __stdcall receive ( void* inst, imediasample *smp ) { byte* buf; smp->getpointer(&buf); dword len = smp->getactualdatalength(); hresult ret = receive_ ( inst, smp ); return ret; } int winapi winmain(hinstance inst,hinstance prev,lpstr cmd,int show){ hresult hr = coinitialize(0); msg msg={0}; dword no; igraphbuilder* graph= 0; hr = cocreateinstance( clsid_filtergraph, 0, clsctx_inproc,iid_igraphbuilder, (void **)&graph ); imediacontrol* ctrl = 0; hr = graph->queryinterface( iid_imediacontrol, (void **)&ctrl ); icreatedevenum* devs = 0; hr = cocreateinstance (clsid_systemdeviceenum, 0, clsctx_inproc, iid_icreatedevenum, (void **) &devs); ienummoniker* cams = 0; hr = devs?devs->createclassenumerator (clsid_videoinputdevicecategory, &cams, 0):0; imoniker* mon = 0; hr = cams->next (1,&mon,0); // first found capture device (webcam?) ibasefilter* cam = 0; hr = mon->bindtoobject(0,0,iid_ibasefilter, (void**)&cam); hr = graph->addfilter(cam, l"capture source"); // add web cam graph source ienumpins* pins = 0; hr = cam?cam->enumpins(&pins):0; // need output pin autogenerate rest of graph ipin* pin = 0; hr = pins?pins->next(1,&pin, 0):0; // via graph->render hr = graph->render(pin); // graph builder builds whole filter chain including mjpg decompression on webcams ienumfilters* fil = 0; hr = graph->enumfilters(&fil); // newly added filters ibasefilter* rnd = 0; hr = fil->next(1,&rnd,0); // find last 1 (renderer) hr = rnd->enumpins(&pins); // because data intersted in pumped renderers input pin hr = pins->next(1,&pin, 0); // via receive member of imeminputpin interface imeminputpin* mem = 0; hr = pin->queryinterface(iid_imeminputpin,(void**)&mem); dshook(mem,6,receive); // redirect our own proc grab image data hr = ctrl->run(); while ( getmessage( &msg, 0, 0, 0 ) ) { translatemessage( &msg ); dispatchmessage( &msg ); } }; the method hresult receive called every new frame cam. the comments says buf contains data. have 3 problems/questions.
i cant include opencv lib. create new project in visual studio, , add same property sheets include. difference earlier projects create totaly empty project, earlier created win32 application. how add opencv directshow project?
the example above. buf. pointer data. how iplimage/mat opencv calc?
is there way not show images webcam (i need perform algorithms on frames, guess removing window results might give me more power analyse algorithms?!)
thanks!
with directshow typically create pipeline, graph , add filters it, this:
camera -> [possibly stuff] -> sample grabber -> null renderer
camera, sample grabber, null renderer standard components shipped clean windows. sample grabber can set call via isamplegrabbercb::samplecb , give data every video frame captured. null renderer termination of pipeline without displaying video on monitor (just video capture).
samplecb keyword bring sample code need. having data received call, can convert/wrap ipl/opencv class suggested @praks411.
having done simple this, don't need directshow baseclasses, , code merely regular atl/mfc code , project. make sure use ccomptr wrapper class deal com interfaces not lose references , leak objects. declarations might missing in latest windows sdk, need either use windows sdk 6.x or copy missing parts there.
see also:
- how capture frames using delphi/dspack without displaying on tvideowindow? (delphi code, description , figures)
- directshow: examples using samplegrabber grabbing frame , building vu meter
- setlifecamstudioresolutionsample - small directshow project showing how set capture up, including resolution on camera, , sample grabber, , missing sdk declarations; related q can't make iamstreamconfig.setformat() work lifecam studio
- building filter graph on sample grabber , null renderer
Comments
Post a Comment