vfw h HWND Callback mh Wnd Capture cap
vfw. h / HWND추가
Callback 함수 설정
카메라 연결 설정 m_h. Wnd. Capture = cap. Create. Capture. Window("Capture Window", WS_CHILD | WS_VISIBLE, 10, 640, 480, this->m_h. Wnd, NULL); // 매 frame이 캡쳐될때마다 호출될 callback function 지정 if (cap. Set. Callback. On. Frame(m_h. Wnd. Capture, cap. Callback. On. Frame) == FALSE) return FALSE; // Camera Driver와 Capture Window 연결 //if (cap. Driver. Connect(m_h. Wnd. Capture, 0) == FALSE) //return FALSE; cap. Preview. Rate(m_h. Wnd. Capture, 1000/30); cap. Overlay(m_h. Wnd. Capture, TRUE); cap. Preview(m_h. Wnd. Capture, TRUE);
콜백함수 설정 LRESULT CALLBACK cap. Callback. On. Frame(HWND h. Wnd, LPVIDEOHDR lp. VHdr) { int i; int pixel; int x=0, y=0; for (i = 0; i <lp. VHdr->dw. Buffer. Length; i+=3 ) { b = *(lp. VHdr->lp. Data + i ) ; g = *(lp. VHdr->lp. Data + i +1) ; r = *(lp. VHdr->lp. Data + i +2) ; pixel = 0. 3 * r + 0. 59*g + 0. 11*b ; *(lp. VHdr->lp. Data + i+0) = pixel; //blue *(lp. VHdr->lp. Data + i+1) = pixel ; //green *(lp. VHdr->lp. Data + i+2) = pixel; //red } return LRESULT(TRUE); }
비디오 환경 설정 CAPSTATUS Cap. Status; CAPDRIVERCAPS Cap. Drv. Caps; if (Cap. Drv. Caps. f. Has. Dlg. Video. Format) { cap. Dlg. Video. Format(m_h. Wnd. Capture); cap. Get. Status(m_h. Wnd. Capture, &Cap. Status, sizeof (CAPSTATUS)); //m_width = Cap. Status. ui. Image. Width ; //m_height = Cap. Status. ui. Image. Height ; Update. Data(FALSE); Invalidate(TRUE); }
1차원에서 2차원 변환 CCamera. Dlg * p. Dlg = (CCamera. Dlg *)Afx. Get. Main. Wnd(); for (i = 0; i <lp. VHdr->dw. Buffer. Length; i+=3 ) { b = *(lp. VHdr->lp. Data + i ) ; g = *(lp. VHdr->lp. Data + i +1) ; r = *(lp. VHdr->lp. Data + i +2) ; pixel = 0. 3 * r + 0. 59*g + 0. 11*b ; img[y][x] = pixel; x++; if(x>=p. Dlg->m_width){ y++; x=0; } }
2차원에서 1차원 변환 for( y=0; y<p. Dlg->m_height; y++) for( x=0; x<p. Dlg->m_width; x++){ i = y*p. Dlg->m_width*3 + x*3 ; *(lp. VHdr->lp. Data + i+0) = img[y][x] ; //blue *(lp. VHdr->lp. Data + i+1) = img[y][x] ; //green *(lp. VHdr->lp. Data + i+2) = img[y][x] ; //red }
- Slides: 11