我認為要把視訊中的資料做出遊戲用的控制,【想法】:
必需要先把視訊串流 (Video Stream) 轉換成 Bitmap (可秀在 Image 物件上的),
才能再進行影像處理 or 遊戲的控制之判斷
VFW 函式庫提供的 CallbackOnFrame procedure,會給一個指標【做法】:
這指標指向一個結構: lpVHdr (LPVIDEOHDR :: Video Header)
此結構裡包含一個指標 lpData,指向 Video Stream
也就是我們要的視訊串流資料
我參考了 K-Top 討論區「【BCB】【問題】請問CCD經由panel取出再轉入image」這篇
利用一個一個 RGB Color 的對應原理
成功轉換成 Bitmap 並顯示在一個 Image 元件上
拉一個 Image 元件 (我設 Name 為 imgPreviewImg )來放
用小畫家做一張 352×288大小全黑色的 BMP 圖檔
載入 Image 元件中 (按屬性的 Picture 來 Load 進來)。
宣告以下廣域變數:
UCHAR *pData ;在主程式 (Form1) 的 OnCreate 事件中加入下列程片段
UCHAR ColorBufOrgn[288][352][3] ;
UCHAR ColorBufShow[288][352][3] ;
Graphics::TBitmap *Pic ;
在 CallbackOnFrame Procedure 中加入以下程式片段Pic = imgPreviewImg->Picture->Bitmap ;
imgPreviewImg->Canvas->Brush->Style = bsClear ;
imgPreviewImg->Canvas->Pen->Color = clBlack ;
// 宣告區域變數【成果】:
pData = lpVHdr->lpData ;
static int i, j ;
// 上下顛倒取出 RGB 並存入 RGB Color 陣列
for (i = 288-1 ; i >= 0 ; i--) {
for (j = 0 ; j < 352 ; j++) {
ColorBufOrgn[i][j][0] = *pData++;
ColorBufOrgn[i][j][1] = *pData++;
ColorBufOrgn[i][j][2] = *pData++;
}
}
// 顯示在 Image 上
if (!Pic->Empty) {
Pic->PixelFormat = pf32bit ;
for (int Row = 0; Row < 288 ; Row++) {
RGBQUAD *Pixel = (RGBQUAD *) Pic->ScanLine[Row] ;
for (int Col = 0; Col < 352 ; Col++, Pixel++) {
Pixel->rgbBlue = (BYTE) ColorBufOrgn[Row][Col][0] ;
Pixel->rgbGreen = (BYTE) ColorBufOrgn[Row][Col][1] ;
Pixel->rgbRed = (BYTE) ColorBufOrgn[Row][Col][2] ;
}
}
Form1->imgPreviewImg->Invalidate() ;
}
【缺點】:
目前只能固定視訊大小為 352×288,不能更動。不然會程式當掉。
沒有留言:
張貼留言