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

Webcam進來的影像如何做翻轉(Flip)

答題得分者是:bugmans
Ruan
一般會員


發表:2
回覆:1
積分:0
註冊:2008-05-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-04-15 18:17:51 IP:59.125.xxx.xxx 訂閱
Dears :
目前要將Webcam進來的影像做直垂翻轉(FlipVertical)與水平翻轉(FlipHorizonta),
現階段採用IAMVideoControl來做,利用SetMode方法來設定VideoControlFlags的值。
問題是使用SetMode後沒有反應,不知是那裡有問題,若各位先進有更好的方式請指教,
可將影像做垂直或水平的翻轉(ps:即時的影像非圖片)。

以下是利用C:\DSPACK\Demos\BCB6\Playcap 的demo code 修改,
修改後的片斷程式碼如下:
[code cpp]

HRESULT hr;

FilterGraph->ClearGraph();
FilterGraph->Active = false;
Filter->BaseFilter->Moniker = SysDev->GetMoniker(((TMenuItem *)Sender)->Tag);
FilterGraph->Active = true;

CheckDSError(FilterGraph->QueryInterface(IID_ICaptureGraphBuilder2, &pBuild));
CheckDSError(VideoWindow->QueryInterface(IID_IBaseFilter, &VideoFilter));
CheckDSError(Filter->QueryInterface(IID_IBaseFilter, &SourceFilter));

IAMVideoControl *pAMVidControl=NULL;

hr = SourceFilter->QueryInterface(IID_IAMVideoControl,(void **)&pAMVidControl);

IPin *pPin = NULL;

if (SUCCEEDED(hr))
{
hr = pBuild->FindPin(
SourceFilter, // Filter.
PINDIR_OUTPUT,// Look for an output pin.
&PIN_CATEGORY_CAPTURE, // Pin category.
NULL, // Media type (don't care).
FALSE,// Pin must be unconnected.
0, // Get the 0'th pin.
&pPin// Receives a pointer to the pin.
);

//typedef enum tagVideoControlFlags {
// VideoControlFlag_FlipHorizontal = 0x0001,
// VideoControlFlag_FlipVertical = 0x0002,
// VideoControlFlag_ExternalTriggerEnable = 0x0004,
// VideoControlFlag_Trigger = 0x0008
//} VideoControlFlags;

long pMode = 0;
hr= pAMVidControl->GetCaps(pPin,&pMode);
if (SUCCEEDED(hr))
{ if(pMode==1)
ShowMessage("FlipHorizontal");
if(pMode==2)
ShowMessage("FlipVertical");
if(pMode==3)
ShowMessage("ExternalTriggerEnable");
if(pMode==8)
ShowMessage("Trigger");
if(pMode==12)
ShowMessage("Trigger And ExternalTriggerEnable");
}

if (SUCCEEDED(hr))
{
hr = pAMVidControl->SetMode(pPin, VideoControlFlag_Trigger | VideoControlFlag_FlipVertical);
//hr = pAMVidControl->GetMode(pPin, &pMode);
//ShowMessage(pMode);
}
pPin->Release();
pAMVidControl->Release();

pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, NULL, SourceFilter, NULL, VideoFilter);

FilterGraph->Play();
pBuild->Release();
VideoFilter->Release();
SourceFilter->Release();
[/code]
編輯記錄
Ruan 重新編輯於 2009-04-15 18:21:45, 註解 無‧
Ruan 重新編輯於 2009-04-15 18:25:05, 註解 無‧
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-04-15 20:40:15 IP:125.225.xxx.xxx 未訂閱
我曾經參考這篇http://www.progdigy.com/forums/viewtopic.php?t=596
利用VMR9NormalizedRect達成上下左右翻轉的功能

範例可以從這裡下載http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=37755
的倒數第三篇(2009-01-02 21:00:29)

[code cpp]
VMR9NormalizedRect VMRRect[4] = {{1,1,0.5,0.5},{0.5,0,1,0.5},{0,0.5,0.5,1},{0.5,0.5,1,1}};
[/code]

改成{1,0,0,1}就是左右翻轉了
編譯時Include Path要加上C:\DSPACK\src\DirectX9,C:\DSPACK\src\DSPack才不會編譯錯誤
系統時間:2017-10-23 23:14:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!