質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
COM

COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

3回答

917閲覧

directshowで動画を再生しそれにOpenCVでEffectをかけたい

kokawa2003

総合スコア217

COM

COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2019/05/24 07:07

編集2019/05/24 07:14

表題の通りなのですがdirectshowで動画を再生するってのは割と簡単で
https://docs.microsoft.com/en-us/windows/desktop/directshow/how-to-play-a-file
この通りやればできます。

C++

1#include <dshow.h> 2void main(void) 3{ 4 IGraphBuilder *pGraph = NULL; 5 IMediaControl *pControl = NULL; 6 IMediaEvent *pEvent = NULL; 7 8 // Initialize the COM library. 9 HRESULT hr = CoInitialize(NULL); 10 if (FAILED(hr)) 11 { 12 printf("ERROR - Could not initialize COM library"); 13 return; 14 } 15 16 // Create the filter graph manager and query for interfaces. 17 hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 18 IID_IGraphBuilder, (void **)&pGraph); 19 if (FAILED(hr)) 20 { 21 printf("ERROR - Could not create the Filter Graph Manager."); 22 return; 23 } 24 25 hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl); 26 hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent); 27 28 // Build the graph. IMPORTANT: Change this string to a file on your system. 29 hr = pGraph->RenderFile(L"C:\Example.avi", NULL); 30 if (SUCCEEDED(hr)) 31 { 32 // Run the graph. 33 hr = pControl->Run(); 34 if (SUCCEEDED(hr)) 35 { 36 // Wait for completion. 37 long evCode; 38 pEvent->WaitForCompletion(INFINITE, &evCode); 39 40 // Note: Do not use INFINITE in a real application, because it 41 // can block indefinitely. 42 } 43 } 44 pControl->Release(); 45 pEvent->Release(); 46 pGraph->Release(); 47 CoUninitialize(); 48}

問題はこの表示画像ににOpenCVでEffectをかけたいのですがやり方が全く分かりません。
CTransformfilter
というものを使ってやるってのはわかったのですがそのやり方が詳しくわかっている人がもしいたらお教えください。
COMのあたりに私あまり詳しくないので、私がわかったのはQueryInterfaceを既存のinterfaceにかけて自家製のクラスに誘導してそこでtransformすればいいらしいってことだけです。
どのようにして自家製のクラスに誘導していくのか全く分かりませんでした。
分かる人はお教えいただければありがたいと思います。
素直にDLLを作ってそこで変換しないといけないってことを言っているのか?ってのもよくわかりませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

あれから一日やりました。
どうもベストの選択としては
https://github.com/tedburke/RobotEyez
をパクることらしい。
これを私が気にいっているのはInterFaceにDLLを作らないこととCTransformFilterを使っていることです。
今からこれをパクってフィルターを作ります。
覚書として書いておきます。
1.カスタムのフィルターは普通のCLASSとして作るがCTransformFilterを継承
でCOMなのでDEFINE_GUID(CLSID_FrameTransformFilter,
0xd6ece2e3, 0x72aa, 0x4157, 0xb4, 0x89, 0x52, 0xc3, 0xfd, 0x69, 0x3c, 0xe9);
みたいなのがいる
それを普通にnewでObjectにする。
2.そのCOM ObjectはQIでIID_IBaseFilterが取り出せないといけない(virtualな関数があるはずだがまだしらない)
3.再生にはあらかじめgraphを作っておく。そのgraphの確認にgraphedt.exeを使う
4.運が良ければそのグラフに2のIFをpGraph->AddFilter(pTransform, L"FrameTransform");
みたいな形で追加するだけでOK
5.運が悪いとIN,OUTのピンを合わせる羽目になるらしいがまだよくわからない
6.実行は
pGraph->QueryInterface(IID_IMediaControl,(void**)&pMediaControl);
hr = pMediaControl->Run();
7.パラメータのやり取りはC++の普通のCLASSなので言わずもがな。

これでうまくいかないときはIFを考える羽目に
なるがまだよくわからない。
私が今知ったのは以上です。

投稿2019/05/25 04:16

編集2019/05/25 04:19
kokawa2003

総合スコア217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ソースコードは確認していませんが、github に参考になりそうなものが上がっていました。

ousttrue/dscvd3d: DirectShow to OpenCV to D3D

投稿2019/05/24 08:38

編集2019/05/24 08:39
alphya

総合スコア124

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokawa2003

2019/05/25 02:50

一日苦闘しましたが結論として特殊すぎるサンプルで使えませんでした。 その特殊すぎるところはIFがどうも古いソースを引っ張ってこないとコンパイルすら通らないところです。 あと入力にカメラを使うのですが私のマシンにはどうもDireecshowでつかえるカメラがないらしいのでもっとDirectshowの場数がないと読みこなせない。
alphya

2019/05/25 03:00

なるほど、お役に立てず申し訳ございません...
guest

0

自分は直接フィルタを作ったことはありませんが、以下のような記事が参考になるでしょうか。

トランスフォームフィルタの作成

DLLを作ってregsvrで登録、GraphEditで刺してみて動作確認って感じだと思います。

投稿2019/05/24 07:34

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問