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

影像擷取 使用 FrameCallBack 時出現 bitmap image is not valid 問題

答題得分者是:chengsean
ALTIS
初階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-04-20 11:09:31 IP:210.201.xxx.xxx 訂閱
在我的開發電腦上Run都OK(不會出現任何問題 , 功能也都正確) , 原本想說完成了
但天不從人願 .... 換一台PC , Capture 時卻出現「bitmap image is not valid」的錯誤訊息
會不會是 vfw 還需要安裝什麼驅動 或 bitmap format 需要安裝呢
真搞不懂.... 麻煩各位大大囉

以下是我的 FrameCallBack 程式






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;
BitmapFileHead.bfSize=stream->Size;
BitmapFileHead.bfOffBits=sizeof(BitmapFileHead) sizeof(BitmapHead);
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;
bmp_temp->LoadFromStream( stream );
//jp->Assign(bmp_temp);
delete( stream );
capSetCallbackOnFrame (hwnd, NULL);
return(0);
}
------
城市讓人迷惘 我在湖岸看見希望
妳的眼神是一道光芒 開啟我心中的收藏
triop
一般會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-04-24 15:31:30 IP:140.117.xxx.xxx 訂閱
這個我也有遇到一樣的問題
不過那個時候是因為我把(stream->Position=0;)註解掉的關係
所以我想你的問題應該是在stream上吧...
祝你好運
ALTIS
初階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-04-25 14:00:27 IP:210.201.xxx.xxx 訂閱
    感謝 triop 的回應

因為我是不同PC會出現這個問題 , Stream 的 Capture 有使用到 DirectShow 嗎?
DirectX的版本是不是會有影響 ?

我想這是我必須了解的 ...
------
城市讓人迷惘 我在湖岸看見希望
妳的眼神是一道光芒 開啟我心中的收藏
chengsean
一般會員


發表:0
回覆:1
積分:5
註冊:2007-05-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-29 10:35:42 IP:203.75.xxx.xxx 訂閱
1.  你可以先確定一下你的USB是不是1.1..
只要用MSN的camear設定,看看你的format是不是可以
選YUY2的格式,或是只能出現MJPEG..
如果是只有MJPEG,那麼你的bitstream就是JPEG的格式,
對於Bitmap當然是不合,我之前也遇過這種情況,我有試著
把data輸出去看,果然是JPEG的格式.

ALTIS
初階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-06-04 09:51:31 IP:210.201.xxx.xxx 訂閱
感謝chengsean的說明
趕快去測試看看...
------
城市讓人迷惘 我在湖岸看見希望
妳的眼神是一道光芒 開啟我心中的收藏
ALTIS
初階會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-06-20 09:34:30 IP:210.201.xxx.xxx 訂閱

===================引 用 chengsean 文 章===================
1. 你可以先確定一下你的USB是不是1.1..
只要用MSN的camear設定,看看你的format是不是可以
選YUY2的格式,或是只能出現MJPEG..
如果是只有MJPEG,那麼你的bitstream就是JPEG的格式,
對於Bitmap當然是不合,我之前也遇過這種情況,我有試著
把data輸出去看,果然是JPEG的格式.


確實是影像格式的問題
我直接在擷取卡的影像格式作設定
改成RGB格式就沒問題了....

小小的一個動作,卻花了很長的時間尋找
這就是 Programer 的悲哀
------
城市讓人迷惘 我在湖岸看見希望
妳的眼神是一道光芒 開啟我心中的收藏
fusung
中階會員


發表:26
回覆:169
積分:99
註冊:2003-11-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-06-26 10:48:32 IP:61.229.xxx.xxx 訂閱

沒錯,工程師必經之路的確是這樣坎坷。

不過往好的方向想,當你把一些不可能的答案都探索過,

以後遇到類似或是延伸的問題,就可以大大縮短搜尋時間,

因為不可能的答案你大概都走過了!

===================引 用 ALTIS 文 章===================

確實是影像格式的問題
我直接在擷取卡的影像格式作設定
改成RGB格式就沒問題了....

小小的一個動作,卻花了很長的時間尋找
這就是 Programer 的悲哀
------


The first step toward proving things for yourself is to understand how others have done it before!

Marcise
一般會員


發表:4
回覆:5
積分:1
註冊:2006-10-25

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-06-28 22:39:34 IP:125.233.xxx.xxx 訂閱
小弟也有一隻webcam
YUY2的影像格式
但是也是不能使用FrameCallBack
會出現跟原po一樣的錯誤
是YUY2本來就不能使用嗎
還是程式碼需要做一些修正?

以下是參考版上大大的程式碼:
<textarea cols="60" rows="10" class="cpp" name="code"> 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); // 取得CAP訊息 capGetStatus( vc1, &status, sizeof(status) ) ; // 取得圖片格式容量大小 BIHsize=capGetVideoFormatSize( vc1 ); // 取得圖片格式 代入 bitmapinfohead 內 capGetVideoFormat( vc1, &BitmapHead, BIHsize); // 設定 BITMAPINFO BitmapInfo.bmiHeader=BitmapHead; // 取得圖檔總容量 stream->Size=sizeof(BitmapFileHead) sizeof(BitmapHead) BitmapHead.biSizeImage; // 設定 BITMAPFILEHEAD BitmapFileHead.bfType=0x4D42; //總是 BM BitmapFileHead.bfSize=stream->Size; //該圖檔總大小 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); // 存入完成 stream->Position=0; // Form1->Image1->Picture->Bitmap->LoadFromStream( stream ); delete( stream ); capSetCallbackOnFrame (vc1, NULL); //停止callbackonframe return(0); } </textarea>
系統時間:2024-05-02 10:39:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!