melody
一般會員
發表:1 回覆:3 積分:0 註冊:2004-03-14
發送簡訊給我
|
請問各位高手
我想要知道從webcam擷取的影像格式有哪些型態
而我現在所需要的是yuv的資料型態
不知道是要用什麼方法可以獲得yuv的資料型態
請各位高手指點一下..謝謝!!
|
KENI_LIN
中階會員
發表:86 回覆:267 積分:90 註冊:2004-05-31
發送簡訊給我
|
melody,你好
一般影像格式只能由webcam硬體決定,所以我們沒辦法藉著調整電腦的設備來迎合這些未經壓縮的影像資料,那麼就只好把影像藉著壓縮的方式,將其調整成能夠管理的資料格式。但是影像壓縮是個蠻深奧的技術。像是在電視上影像是交錯式的,而在電腦上則不是。
影像的運作方式相當複雜,電視使用 >
所以,如果妳要使用 >
------ Keni Lin
|
melody
一般會員
發表:1 回覆:3 積分:0 註冊:2004-03-14
發送簡訊給我
|
謝謝KENI_LIN的回應..
不好意思喔..那我還想請問一下..如果我已經接上此型號的webcam
那我要用什方法.或是函式來取得yuv的資料型態..因為我想在擷取到影像之後作一些運算..所以必須是yuv的格式..請教一下各位高手
|
KENI_LIN
中階會員
發表:86 回覆:267 積分:90 註冊:2004-05-31
發送簡訊給我
|
melody,你好
"因為我想在擷取到影像之後作一些運算..所以必須是yuv的格式",這一句話我不是很懂,據我所知因為不管是用支援RGB或YUV(I420)的webcam,它的圖檔(Image)格式應該是由軟體程式來決定,比方說用小畫家的程式,就可以存成GIF,JPG,BMP等圖檔格式! 而一般來說會存成 > 如果妳是直接 >
(
------ Keni Lin
|
melody
一般會員
發表:1 回覆:3 積分:0 註冊:2004-03-14
發送簡訊給我
|
謝謝KENI_LIN的回應..
恩...其實我是在做延續別人的程式..就是在擷取webcam的影像之後...
要做物件分離的動作..所以必須適用yuv當做影像格式來做運算...
就我所知道之前的程式碼是你說的直接show在image上並且是使用vfw的
方式..而成程式碼的影像資料是存成bmp..我是有試過自己寫程式將資料改成yuv的形態但是程式碼卻會變的執行速度很慢..所以我想了解的是有什麼方法或是函式可以直接得到yuv的資料呢??
|
KENI_LIN
中階會員
發表:86 回覆:267 積分:90 註冊:2004-05-31
發送簡訊給我
|
melody,你好 關於這一個問題,就考倒我了,目前我使用的vfw只能使用在"RGB24"的輸出格式,請參考這一個前輩寫的程式:
#include
#pragma hdrstop
#include "Unit1.h"
#include "vfw.h"
LRESULT CALLBACK FrameCallBack( HWND, Longint );
LPVIDEOHDR VideoStr; HWND vc1,vc2; //-------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
capSetCallbackOnFrame (vc1, &FrameCallBack);
} //建立callbackonframe函式,底下為未經壓縮模式24bit沒有調色盤資料
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) );
(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);
}
=======================================================================
如果妳的webcam沒有支援這一個格式,也就是只能選擇I420(也就是YUV的輸出格式),就執行這一個程式段,就會有“Bitmap image is not valid”的錯誤訊息產生,你可以參考以下這兩個討論區,< >
( > 沒幫上妳的忙,但希望多少能對妳有幫助,!......還是要加油嘍!
有好結果要告訴大家!< > 寒窗苦讀十年書;只待今朝狀元時!~~
︵ / / ︵
( ∩ ∩ )
○ ︶ ○
------ Keni Lin
|
melody
一般會員
發表:1 回覆:3 積分:0 註冊:2004-03-14
發送簡訊給我
|
謝謝KENI_LIN的回應..
我想我還需要研究研究...
謝謝你全力的幫助囉
|