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.

  1. 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?

  2. the example above. buf. pointer data. how iplimage/mat opencv calc?

  3. 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:


Comments

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

qt - Errors in generated MOC files for QT5 from cmake -