線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2769
推到 Plurk!
推到 Facebook!

關於webcam擷取,panel一被遮住就不能用的問題

答題得分者是:ALTIS
triop
一般會員


發表:14
回覆:15
積分:5
註冊:2005-11-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-03-25 18:48:27 IP:140.117.xxx.xxx 訂閱
我現在利用callbackfunction將webcam的影像顯示在panel上面
然後在callbackfunc裡面預先將webcam的影像讀進記憶體裡面做處理...
然後抓出處理之後的影像中心
而這個影像中心理論上會隨著我的手改變位置
也就是類似hand tracking的東西...

我現在遇到的問題是
如果我把這個執行中的程式縮到工作列下面之後
整個程式就會沒有辦法做tracking的動作
(若是panel被遮住的話也會發生一樣的問題)

我自己在猜應該是webcam影像輸出的問題
可是我不曉得要用什麼辦法解決這個問題

不知道有沒有人能夠幫忙...
小弟感謝萬分....m(_ _)m
triop
一般會員


發表:14
回覆:15
積分:5
註冊:2005-11-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-04-09 22:01:09 IP:140.117.xxx.xxx 訂閱
可能是我描述的不夠清楚

目前我所用的方式就是
利用callbackfunction將webcam擷取到的影像顯示在panel上
然後再將panel上的影像讀入記憶體當中做影像處理


因為我的影像處理跟webcam畫面擷取是同步
所以說如果Panel被擋到的話
我的影像處理結果就會出錯

所以我想請問一下各位前輩
有沒有辦法可以將webcam擷取的影像直接讀入記憶體當中
而不要透過panel....

我想這樣子應該可以避免到我目前所遇到的問題
千分拜託萬分感激....m(_ _)m
ALTIS
初階會員


發表:4
回覆:26
積分:31
註冊:2005-04-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-04-16 11:36:44 IP:210.201.xxx.xxx 訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-04-17 23:06:36 IP:140.117.xxx.xxx 訂閱
感謝ALTIS的回覆...m(_ _)m
我試試看能不能用...
另外,想請問一下您程式當中的註解是什麼呢?
都變成亂碼了~~T.T
ALTIS
初階會員


發表:4
回覆:26
積分:31
註冊:2005-04-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-04-18 09:04:18 IP:210.201.xxx.xxx 訂閱

===================引 用 triop 文 章===================
另外,想請問一下您程式當中的註解是什麼呢?
都變成亂碼了~~T.T



關於這個我也不清楚
不過BCB上可以顯示 , 應該是字集的關係吧
------
城市讓人迷惘 我在湖岸看見希望
妳的眼神是一道光芒 開啟我心中的收藏
triop
一般會員


發表:14
回覆:15
積分:5
註冊:2005-11-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-04-19 17:52:42 IP:140.117.xxx.xxx 訂閱
弄了半天還是弄不太起來...
如果我要把影像的內容存成陣列以供之後的操作使用的話
請問一下要怎麼存取呢?

例如要存成A[320][240]
ALTIS
初階會員


發表:4
回覆:26
積分:31
註冊:2005-04-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-04-20 09:25:01 IP:210.201.xxx.xxx 訂閱

===================引 用 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-04-20 14:41:38 IP:125.232.xxx.xxx 訂閱
===================引 用 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;yHeight;y ) { pr = (Byte *)BMP->ScanLine[y]; for(int x=0;xWidth;x ) { pr[x*3]=pixel[3*(120-y)*BMP->Width 3*x]; //B pr[x*3 1]=pixel[3*(120-y)*BMP->Width 3*x 1];//G pr[x*3 2]=pixel[3*(120-y)*BMP->Width 3*x 2];//R } } Form1->Image1->Picture->Bitmap->Assign(BMP); delete BMP; delete( stream ); // capSetCallbackOnFrame (hCapWnd, NULL); //停止callbackonframe return(0);</textarea>
其中 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-04-24 15:26:34 IP:140.117.xxx.xxx 訂閱
很抱歉,我後來發現這個問題仍舊沒有解決....
如果panel完全被遮住的話
這整個程式就完全無法運作
所以還是想請問一下大家有沒有解決的辦法?
kiss7617
一般會員


發表:5
回覆:1
積分:1
註冊:2008-07-30

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-08-26 23:33:52 IP:125.224.xxx.xxx 訂閱
我看到妳把影像存入陣列中,之後做灰階處理,那我想請問一下喔!要怎麼資到你存進去的資料有多少,然後如果我是要每秒放入30frame這樣還可以做處理嗎?那放入的位置是以怎樣的一個方式阿??
不好意思,我剛剛踏入這塊領域中,所以在在步步的摸索,碰到問題就麻煩請高人指點!謝謝!
------
早知如此 何必當初...
系統時間:2024-03-29 23:28:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!