Korrekte koordinaten von DirectShow Daten-Stream auslesen?
-
Zurzeit programmiere ich an einem Programm, dass mit hilfe der DirectShow lib einen Video-Stream von der Webcam an ein Fenster übergibt.
Nun will ich den Stream nach gewisse Farbwerte scannen und ändern.
Was auch noch gut funktioniert, jedoch möchte ich gernen die gesamten XY-Koordinaten in einem array speicher. Das problem ist dies, dass das Daten Array des Streams nicht zwei dimensional ist sondern nur ein dim.Hier der Code:
void callback(unsigned char* data, int len, int bpp, VideoDevice* dev) { int id = dev->GetID()-1; int x = 330 * (id%2); int y = 250 * (id/2); int width=640; int height=480; BITMAPINFO bmi; memset(&bmi, 0, sizeof(BITMAPINFO)); bmi.bmiHeader.biSize = sizeof(BITMAPINFO); bmi.bmiHeader.biWidth = width; bmi.bmiHeader.biHeight = height; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = bpp; bmi.bmiHeader.biCompression = BI_RGB ; char Buffer[255]; SendMessage(m_hStatic_RedV,WM_GETTEXT,255,(LPARAM)(LPCSTR)Buffer); int red=atoi(Buffer); SendMessage(m_hStatic_GreenV,WM_GETTEXT,255,(LPARAM)(LPCSTR)Buffer); int green=atoi(Buffer); SendMessage(m_hStatic_BlueV,WM_GETTEXT,255,(LPARAM)(LPCSTR)Buffer); int blue=atoi(Buffer); short r,g,b; POINT NewPoint; vector<POINT> Points; for(DWORD dwOffset = 0; dwOffset < width * height * 3; dwOffset+=3) { b=data[dwOffset]; g=data[dwOffset+1]; r=data[dwOffset+2]; if(ColorCmp(RGB(r,g,b),RGB(red,green,blue),20)) { data[dwOffset]=255; data[dwOffset+1]=0; data[dwOffset+2]=255; ////////////////////////////// //Hier möchte ich die Pos auslesen //Z.B: wurde für ein Array mit RGBA Werten benützt funktioniert //jedoch bei bei meinen beispiel nicht NewPoint.x=(UINT)(dwOffset % wScreenX); NewPoint.y=(UINT)abs(wScreenY-(dwOffset / wScreenX))-1); Points.push_back(NewPoint); ////////////////////////////// } } /////////////////////////////////////////////////////////////////// SetDIBitsToDevice(GetDC(m_hDirectShow),x,y,width,height, 0, 0, 0, (UINT)height, data, &bmi, DIB_RGB_COLORS); RECT invalid = {x,y,x+width,y+height}; InvalidateRect(m_hDirectShow, &invalid, false); }Mit SetDIBitsToDevice bringe ich dann den Stream auf mein win32 Fenster
Vielen Dank im vorhinein