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

請問如何對USB視訊畫面做處理??

尚未結案
flydragon198
一般會員


發表:2
回覆:1
積分:0
註冊:2006-08-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-08-12 12:33:06 IP:61.219.xxx.xxx 未訂閱
我是剛學Delphi一個月的新手@@自己看書學的,對於記憶體和stream的觀念幾乎等於零=.=,看了很多文章,還在學習中。
把整個影音多媒體程式設計討論區都找遍了,可是我沒找到如何對視訊擷取下來的畫面做處理(使用Object pascal),有找到C 語法的,可是我們需要使用Object pascal,而我又不懂如何C 轉成pascal,所以只好麻煩各位前輩了。

我的問題是:如何對USB webcam擷取的畫面做處理?(我是使用VFW)
使用CCD或CMOS應該沒有差異吧??
我是正在學習 多媒體程式設計-使用Delphi 這本書,在第十章10-4預覽回呼函式中,我想對lpvhdr裡面的資料作處理,lpvhdr應該是儲存擷取到的影像資料。例如要做二值化,因此要能夠取得每一點的像素值(pixel),RGB的值,但是我不知道該如何下手,我有想到兩個方法。

1.宣告一個TBitmap,把lpvhdr從記憶體中取出,放入Tbitmap中處理,修改完後再放回記憶體。
2.宣告一個陣列來存lpvhdr,修改完後再存回lpvhdr。

只是我看到的範例都是C ,幾乎沒有使用object pascal,不知道該怎麼處理,該使用哪些函式,所以麻煩各位大大不吝指教,謝謝。

[code]
procedure TForm1.capFrameCallBack(sender:TObject;lpVhdr:PVIDEOHDR);
var
DC: HDC;
BitmapInfo: PBitmapInfo;
BitsMem,DataBuf:Pointer;
BMHandle:HBITMAP;
B:TBitmap;

begin

if FModifiedFrame then exit;

FModifiedFrame:=TRUE;

if lpVhdr^.lpData = nil then
begin
FModifiedFrame:=FALSE;
exit;
end;

VideoViewForm.GetVideoFormat;
BitmapInfo:= VideoViewForm.VideoFormat;
DataBuf:=lpVhdr^.lpData;

DC := GetDC(0);
try

BMHandle := CreateDIBSection(DC, BitmapInfo^, DIB_RGB_COLORS, BitsMem, 0, 0);
if BMHandle <> 0 then
begin
try
Move(DataBuf^,BitsMem^,lpVhdr^.dwBytesUsed);
except
DeleteObject(BMHandle);
BMHandle:=0;
end;
end;
finally
ReleaseDC(0, DC);
end;

if BMHandle=0 then
begin
FModifiedFrame:=FALSE;
exit;
end;


b:=TBitmap.Create;
b.Handle:= BMHandle;
SetBkMode(b.Canvas.Handle,TRANSPARENT );
b.Canvas.Font.Size:=16;

b.Canvas.Font.Color:=0;
b.Canvas.TextOut(2,2,'現場 LIVE');
b.Canvas.Font.Color:=clYELLOW;
b.Canvas.TextOut(0,0,'現場 LIVE');

try
Move(BitsMem^,DataBuf^,lpVhdr^.dwBytesUsed);
except
end;

b.Free;
FModifiedFrame:=FALSE;

end;
[/code]

這是我第一次問問題,以上程式碼是摘錄自書中範例程式,如果有不妥的地方,請告訴我,我馬上改進,謝謝。
翻了很多本delphi的書,都沒有對指標和記憶體做很詳細的說明,只有教^變數名,@變數名,變數名^,所以希望各位前輩能指導。感恩。
flydragon198
一般會員


發表:2
回覆:1
積分:0
註冊:2006-08-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-08-14 01:07:40 IP:61.219.xxx.xxx 未訂閱

{for i:=0 to 76799 do //因為是320*240的影像
begin
inc(lpvhdr.lpData); //這裡先使用inc則會先取到RGB的G值

if lpvhdr.lpData^ < 128 then
begin

lpvhdr.lpData^:=0;
inc(lpvhdr.lpData);
lpvhdr.lpData^:=0;
inc(lpvhdr.lpData);
lpvhdr.lpData^:=0;
end else
begin
lpvhdr.lpData^:=255;
inc(lpvhdr.lpData);
lpvhdr.lpData^:=255;
inc(lpvhdr.lpData);
lpvhdr.lpData^:=255;
end;

end;

for i:=0 to 76799 do
begin
dec(lpvhdr.lpData);
dec(lpvhdr.lpData);
dec(lpvhdr.lpData);
end;}


b:=TBitmap.Create;


我已經找到我要的答案了,在上面那個範例裡,b:=TBitmap.Create;前面加上那段程式碼,就可以在預覽回呼函式裡面對每一個像素作處理,因為格式是RGB,所以每次inc(lpvhdr.lpdata)就會取下一個點的值,上面那個程式是簡單的轉成黑白影像,之後可以得到每一點的值,我就能夠對影像作處理了,因為我是初學者,所以問了很蠢的問題,佔用大家的資源,真是抱歉。

----------取之於人者太多,還之於人者太少----------
系統時間:2017-10-23 12:21:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!