LRESULT CALLBACK FrameCallBack( HWND hwndVideo, PVIDEOHDR lpvhdr ) { iFrameCount++; unsigned char ucDR, ucDG, ucDB; int iDistance; for (m=0;m<30;m++) for (n=0;n<40;n++) iObjectBlock[m][n]=0; CaptureData = LPVIDEOHDR(lpvhdr); ptrCapture = CaptureData->lpData; //( iObjectX1, iObjectY1 ) 為物件左上角座標 ... iObjectX2 = iObjectX1 + iMarkWidth; iObjectY2 = iObjectY1 + iMarkHeight; iObjectBlockX1 = iObjectX1 / 8; iObjectBlockY1 = iObjectY1 / 8; iObjectBlockX2 = iObjectX2 / 8; iObjectBlockY2 = iObjectY2 / 8; k = 0; for (i=239;i>=0;i--) { for (j=0;j<320;j++) { m = i / 8; n = j / 8; ucSource[i][j][0] = ptrCapture[k+2]; ucSource[i][j][1] = ptrCapture[k+1]; ucSource[i][j][2] = ptrCapture[k]; if ((bObjectOnFrame)&&(i>iObjectY1)&&(iiObjectX1)&&(j ucSource[i][j][0] ) ucDR = ucBackground[i][j][0] - ucSource[i][j][0]; else ucDR = ucSource[i][j][0] - ucBackground[i][j][0]; if ( ucBackground[i][j][1] > ucSource[i][j][1] ) ucDG = ucBackground[i][j][1] - ucSource[i][j][1]; else ucDG = ucSource[i][j][1] - ucBackground[i][j][1]; if ( ucBackground[i][j][2] > ucSource[i][j][2] ) ucDB = ucBackground[i][j][2] - ucSource[i][j][2]; else ucDB = ucSource[i][j][2] - ucBackground[i][j][2]; iDistance = ucDR*ucDR + ucDG*ucDG + ucDB*ucDB; if (iDistance > iThreshold[i][j] ) { iObjectMatrix[i][j] = 1; iObjectBlock[m][n]++; } else { iObjectMatrix[i][j] = 1; } k = k+3; } } for (i=0;i<240;i++) { ptrImage = (BYTE *)Form1->imChangeDetection->Picture->Bitmap->ScanLine[i]; t = 0; for (j=0;j<320;j++) { m = i / 8; n = j / 8; if ( iObjectBlock[m][n] > 32 ) { ptrImage[t+2] = 255; ptrImage[t+1] = 255; ptrImage[t] = 255; } else { ptrImage[t+2] = 0; ptrImage[t+1] = 0; ptrImage[t] = 0; } t = t+3; } } for (m=0;m<30;m++) for (n=0;n<40;n++) { if ((iObjectBlock[m][n]>32)&&(m>iObjectBlockY1)&&(miObjectBlockX1)&&(nimChangeDetection->Refresh(); Form1->StatusBar1->Panels->Items[0]->Text=AnsiString(iFrameCount); return 0; }