關於webcam擷取,panel一被遮住就不能用的問題 |
答題得分者是:ALTIS
|
triop
一般會員 發表:14 回覆:15 積分:5 註冊:2005-11-08 發送簡訊給我 |
我現在利用callbackfunction將webcam的影像顯示在panel上面
然後在callbackfunc裡面預先將webcam的影像讀進記憶體裡面做處理... 然後抓出處理之後的影像中心 而這個影像中心理論上會隨著我的手改變位置 也就是類似hand tracking的東西... 我現在遇到的問題是 如果我把這個執行中的程式縮到工作列下面之後 整個程式就會沒有辦法做tracking的動作 (若是panel被遮住的話也會發生一樣的問題) 我自己在猜應該是webcam影像輸出的問題 可是我不曉得要用什麼辦法解決這個問題 不知道有沒有人能夠幫忙... 小弟感謝萬分....m(_ _)m |
triop
一般會員 發表:14 回覆:15 積分:5 註冊:2005-11-08 發送簡訊給我 |
|
ALTIS
初階會員 發表:4 回覆:26 積分:31 註冊:2005-04-28 發送簡訊給我 |
CALLBACK 要使用stream 的方式...
LRESULT CALLBACK FrameCallBack( HWND hwnd, Longint lpvhdr ){ static BITMAPINFOHEADER BitmapHead; static BITMAPINFO BitmapInfo; static BITMAPFILEHEADER BitmapFileHead; CAPSTATUS status; int BIHsize, byte; Byte *ptr; TMemoryStream *stream = new TMemoryStream; VideoStr=LPVIDEOHDR(lpvhdr); capGetStatus( hwnd, &status, sizeof(status) ) ; BIHsize=capGetVideoFormatSize(hwnd); capGetVideoFormat(hwnd, &BitmapHead, BIHsize); BitmapInfo.bmiHeader=BitmapHead; stream->Size=sizeof(BitmapFileHead) sizeof(BitmapHead) BitmapHead.biSizeImage; BitmapFileHead.bfType=0x4D42; //Á`¬O BM BitmapFileHead.bfSize=stream->Size; //¸Ó¹ÏÀÉÁ`¤j¤p BitmapFileHead.bfOffBits=sizeof(BitmapFileHead) sizeof(BitmapHead); // °¾²¾¦Üimagedata¤j¤p stream->Position=0; stream->WriteBuffer( &BitmapFileHead, sizeof(BitmapFileHead) ); stream->WriteBuffer( &BitmapInfo, sizeof(BitmapInfo) ); (void*)ptr=stream->Memory; ptr = BitmapFileHead.bfOffBits; Move( VideoStr->lpData, ptr, BitmapHead.biSizeImage); stream->Position=0; img_cap->Picture->Bitmap->LoadFromStream( stream ); delete( stream ); capSetCallbackOnFrame (Form1->hCapWnd, NULL); //°±¤îcallbackonframe return(0); } ------------------------------------------------ 試試看吧....不過用BCB6好像會有問題 還是BCB5比較好...
------
城市讓人迷惘 我在湖岸看見希望 妳的眼神是一道光芒 開啟我心中的收藏 |
triop
一般會員 發表:14 回覆:15 積分:5 註冊:2005-11-08 發送簡訊給我 |
|
ALTIS
初階會員 發表:4 回覆:26 積分:31 註冊:2005-04-28 發送簡訊給我 |
|
triop
一般會員 發表:14 回覆:15 積分:5 註冊:2005-11-08 發送簡訊給我 |
|
ALTIS
初階會員 發表:4 回覆:26 積分:31 註冊:2005-04-28 發送簡訊給我 |
===================引 用 triop 文 章=================== 弄了半天還是弄不太起來... 如果我要把影像的內容存成陣列以供之後的操作使用的話 請問一下要怎麼存取呢? 例如要存成A[320][240] 矩陣 A[320][240][3] 因為有RGB的資料 , 或者直接轉灰階儲存 Byte *ptr; for (int y = 0; y < img_cap->Picture->Bitmap->Height; y ) { ptr = (Byte *)img_cap->Picture->Bitmap->ScanLine[y]; for (int x = 0; x < img_cap->Picture->Bitmap->Width; x ){ A[x][y][0] = ptr[x*3] // G A[x][y][1] = ptr[x*3 1] // B A[x][y][2] = ptr[x*3 2] // R } }
------
城市讓人迷惘 我在湖岸看見希望 妳的眼神是一道光芒 開啟我心中的收藏 |
triop
一般會員 發表:14 回覆:15 積分:5 註冊:2005-11-08 發送簡訊給我 |
===================引 用 ALTIS 文 章===================
矩陣 A[320][240][3] 因為有RGB的資料 , 或者直接轉灰階儲存 ALTIS兄您好: 小弟後來用callback當中已經存在的stream把影像資料讀入陣列當中 程式碼如下 <textarea class="cpp" rows="20" cols="100" name="code"> LRESULT CALLBACK FrameCallBack( HWND hCapWnd, Longint lpvhdr ) { LPVIDEOHDR VideoStr; static BITMAPINFOHEADER BitmapHead; static BITMAPINFO BitmapInfo; static BITMAPFILEHEADER BitmapFileHead; CAPSTATUS status; int BIHsize, byte; Byte *ptr; TMemoryStream *stream = new TMemoryStream; VideoStr=LPVIDEOHDR(lpvhdr); // 取得圖片資料 capGetStatus( hCapWnd, &status, sizeof(status) ) ; // 取得CAP訊息 BIHsize=capGetVideoFormatSize( hCapWnd ); // 取得圖片格式容量大小 capGetVideoFormat( hCapWnd, &BitmapHead, BIHsize); // 取得圖片格式 代入 bitmapinfohead 內 BitmapInfo.bmiHeader=BitmapHead; // 設定 BITMAPINFO stream->Size=sizeof(BitmapFileHead) sizeof(BitmapHead) BitmapHead.biSizeImage-2; // 取得圖檔總容量 //stream->Size=sizeof(BitmapFileHead) sizeof(BitmapHead) BitmapHead.biSizeImage; //======== 設定 BITMAPFILEHEAD======== BitmapFileHead.bfType=0x4D42; //總是 BM BitmapFileHead.bfSize=stream->Size; //該圖檔總大小 BitmapFileHead.bfOffBits=sizeof(BitmapFileHead) sizeof(BitmapHead); // 偏移至imagedata大小 // BitmapFileHead.bfOffBits=sizeof(BitmapFileHead) sizeof(BitmapHead)-2; // 偏移至imagedata大小 // BitmapFileHead.bfOffBits=sizeof(BitmapFileHead) sizeof(BitmapHead); // 偏移至imagedata大小 //============ 將資料存入 memorystream================ stream->Position=0; stream->WriteBuffer( &BitmapFileHead, sizeof(BitmapFileHead) ); stream->WriteBuffer( &BitmapInfo, sizeof(BitmapInfo) ); stream->WriteBuffer( &BitmapFileHead.bfReserved1, sizeof(BitmapFileHead.bfReserved1) ); stream->WriteBuffer( &BitmapFileHead.bfReserved2, sizeof(BitmapFileHead.bfReserved2) ); stream->WriteBuffer( &BitmapFileHead.bfOffBits, sizeof(BitmapFileHead.bfOffBits) ); stream->WriteBuffer( &BitmapInfo, sizeof(BitmapInfo) ); (void*)ptr=stream->Memory; ptr = BitmapFileHead.bfOffBits; Move( VideoStr->lpData, ptr, BitmapHead.biSizeImage); //====================================================== // // Form1->Image1->Picture->Bitmap->LoadFromStream(stream); //Form1->Panel1-> ->Picture->Bitmap->LoadFromStream( stream ); // stream->Position=&BitmapInfo; stream->Position=sizeof(BitmapFileHead.bfOffBits) 50; // 存入完成 !!!! Byte *pixel=new BYTE[160*120*3]; stream->Read(pixel, 160*120*3); Graphics::TBitmap *BMP = new Graphics::TBitmap(); Byte *pr=NULL; BMP->PixelFormat=TPixelFormat(pf24bit); BMP->Width= 160; BMP->Height= 120; for(int y=0;y 其中 stream->Position=sizeof(BitmapFileHead.bfOffBits) 50;的部分 後面的地方居然要 50才能正確顯示,我在想是不是我根本搞錯bitmap內存的位置了 這方面想請大家指點一下 第二個問題 我想要讓這個程式與panel上顯示的preview部分同步顯示 然後利用一個按鈕去控制image這個物件中影像播放與否的話 要怎麼寫呢? 我原本想說用capSetCallbackOnFrame (hCapWnd, &FrameCallBack或NULL);來操控 可是會出現錯誤 然後preview的panel會當掉 想請問一下有沒有什麼辦法可以避免這個問題呢?? 最後附上我的程式,感謝....m(_ _)m 46285ce1bd35d_callback_by_mstream.rar |
triop
一般會員 發表:14 回覆:15 積分:5 註冊:2005-11-08 發送簡訊給我 |
|
kiss7617
一般會員 發表:5 回覆:1 積分:1 註冊:2008-07-30 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |