回答編集履歴

5

refine

2016/11/15 02:57

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -50,7 +50,7 @@
50
50
 
51
51
 
52
52
 
53
- いいえ。Direct ShowはCOM(Component Object Model)技術を利用して作られており、COMではクラスやインターフェイスをWindowsレジストリに予め登録しておく必要があります。言い換えると、DSF(DirectShowフィルタ)をレジストリに登録しておかないと、プログラムから部品として使うことができません。
53
+ いいえ。Direct ShowはCOM(Component Object Model)技術を利用して作られており、COMではクラスやインターフェイスをWindowsレジストリに予め登録しておく必要があります。言い換えると、DSF(DirectShowフィルタ)をレジストリに登録しておかないと、プログラムから部品として使うことができません。DirectShowを利用しなければ、レジストリ云々は気にしなくて良くなります。
54
54
 
55
55
 
56
56
 
@@ -67,3 +67,7 @@
67
67
 
68
68
 
69
69
  Direct Showはマルチメディア処理フレームワークの一種です。PushSourceFiltersSampleを用いてDirectShow経由でOpenCVにキャプチャ映像を取り込む方式でもよいのですが、DirectShowという一般化されたフレームワークを経由する分、確実に処理オーバーヘッドが存在します。同じ処理を行うならば、そのようなフレームワークを経由しない方が処理負荷がずっと小さくなります。
70
+
71
+
72
+
73
+ 「デスクトップキャプチャをOpenCVで解析したい」という目的に対して、実装も大変で処理オーバーヘッドが増えるDirectShowを無理に使うのは得策ではないという意見です。

4

update

2016/11/15 02:57

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -37,3 +37,33 @@
37
37
 
38
38
 
39
39
  Windows OS環境依存という点ではDSF利用もネイティブAPIも変わりませんし、何より正しく動作するDSFを作るのは結構難しいです。(技術的難易度よりも信頼できる資料があまりにも少ないのです。Microsoft提供のサンプルコードやドキュメントにも結構嘘があり、実際に他モジュールと組み合わせて動かすと障害が出たりします。)
40
+
41
+
42
+
43
+ ---
44
+
45
+ (コメントに対する回答追記)
46
+
47
+
48
+
49
+ >「"普通のDSF"としてレジストリに登録するだけ」とありますが、レジストリに登録すれば関数を使えるのでそれを使ってプログラムを組んだ方が良いという意味でしょうか?
50
+
51
+
52
+
53
+ いいえ。Direct ShowはCOM(Component Object Model)技術を利用して作られており、COMではクラスやインターフェイスをWindowsレジストリに予め登録しておく必要があります。言い換えると、DSF(DirectShowフィルタ)をレジストリに登録しておかないと、プログラムから部品として使うことができません。
54
+
55
+
56
+
57
+ > Win32APIを用いたデスクトップキャプチャの方をお勧めするとありますが、GetDesktopWindow関数を用いたキャプチャを行うということでしょうか?Win32apiを用いたデスクトップキャプチャというのがどういうことなのか気になります。
58
+
59
+
60
+
61
+ 仰る通り、GetDesktopWindow関数を利用したデスクトップキャプチャを意図していました。同関数はWin32API(もしくは単にWindows API)の一種です。
62
+
63
+
64
+
65
+ > まだ調べている最中ですが、元のモニターの動画とのタイムラグがあると困るので、動画を滑らかにタイムラグがなくキャプチャすることは可能なのかが気がかりです。
66
+
67
+
68
+
69
+ Direct Showはマルチメディア処理フレームワークの一種です。PushSourceFiltersSampleを用いてDirectShow経由でOpenCVにキャプチャ映像を取り込む方式でもよいのですが、DirectShowという一般化されたフレームワークを経由する分、確実に処理オーバーヘッドが存在します。同じ処理を行うならば、そのようなフレームワークを経由しない方が処理負荷がずっと小さくなります。

3

update

2016/11/15 02:52

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -21,3 +21,19 @@
21
21
 
22
22
 
23
23
  DSF登録については [カテゴリを指定してフィルタを登録する](http://blog.firefly-vj.net/2008/07/01/directshow-filter-regist-specified-category.html) を参考にください。
24
+
25
+
26
+
27
+ ---
28
+
29
+
30
+
31
+ > デスクトップの映像をキャプチャしてOpenCVで解析することを目的としています。
32
+
33
+
34
+
35
+ 上記にごちゃごちゃ書きましたが、「デスクトップキャプチャをOpenCVで解析したい」という目的であれば、DSF経由ではなくWin32APIを使ってデスクトップキャプチャを行い、得られたビットマップデータを`cv::Mat`に変換して扱う方式をお勧めします。
36
+
37
+
38
+
39
+ Windows OS環境依存という点ではDSF利用もネイティブAPIも変わりませんし、何より正しく動作するDSFを作るのは結構難しいです。(技術的難易度よりも信頼できる資料があまりにも少ないのです。Microsoft提供のサンプルコードやドキュメントにも結構嘘があり、実際に他モジュールと組み合わせて動かすと障害が出たりします。)

2

append link

2016/11/14 06:57

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -17,3 +17,7 @@
17
17
 
18
18
 
19
19
  一方、[OpenCVのDSFサポート実装](https://github.com/opencv/opencv/blob/3.1.0/modules/videoio/src/cap_dshow.cpp#L1329-L1414)では[ビデオキャプチャデバイス`CLSID_VideoInputDeviceCategory`](https://msdn.microsoft.com/ja-jp/library/cc370645.aspx)の列挙を行います。この関数で列挙されるようにレジストリ登録する必要があります。
20
+
21
+
22
+
23
+ DSF登録については [カテゴリを指定してフィルタを登録する](http://blog.firefly-vj.net/2008/07/01/directshow-filter-regist-specified-category.html) を参考にください。

1

update

2016/11/14 06:31

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -3,3 +3,17 @@
3
3
 
4
4
 
5
5
  VideoCaptureクラス内部実装は [modules/videoio/src/cap.cpp](https://github.com/opencv/opencv/blob/3.1.0/modules/videoio/src/cap.cpp#L565-L568) にあります(OpenCV 3.1の場合)。DirectShowの場合、実際の処理はさらに [modules/videoio/src/cap_dshow.cpp](https://github.com/opencv/opencv/blob/3.1.0/modules/videoio/src/cap_dshow.cpp#L3141-L3151) に委譲されます。
6
+
7
+
8
+
9
+ ---
10
+
11
+ > WindowsSDKのサンプルソースなので、自前と言うことになると思います。
12
+
13
+
14
+
15
+ Windows SDK付属サンプル [Push Source Filters Sample](https://msdn.microsoft.com/ja-jp/library/windows/desktop/dd377481.aspx) でしょうか?同DSF(DirectShow Filter)の`DllRegisterServer`関数を見ると、単に`AMovieDllRegisterServer2`に処理委譲しているだけですね。この関数は"普通のDSF"としてレジストリに登録するだけです。
16
+
17
+
18
+
19
+ 一方、[OpenCVのDSFサポート実装](https://github.com/opencv/opencv/blob/3.1.0/modules/videoio/src/cap_dshow.cpp#L1329-L1414)では[ビデオキャプチャデバイス`CLSID_VideoInputDeviceCategory`](https://msdn.microsoft.com/ja-jp/library/cc370645.aspx)の列挙を行います。この関数で列挙されるようにレジストリ登録する必要があります。