VFWを使って、PCに接続されている2つ以上のUSBカメラの画像を、
フォーム(ピクチャーボックス可)に表示する事は可能でしょうか?
出来れば、ただ表示するだけでなく、
「このフォームには、このUSBカメラの画像」
と、指定できる方法はないでしょうか?
もちろん、USBカメラはそれぞれ異なるメーカーの物です。
もし、ご存知なら教えてください。
VFWならば、DeviceのIndexで区別が付きません?
VFWに限らず、winmm.dllベースのマルチメディアデバイスは、
みなIndexで判定しますよね。
今だとよほどのことがない限りDirectShowを使うとは思います。
K.J.Kさん、アドバイス有難う御座います。
私がやっているのは、
capCreateCaptureWindow
を使って、キャプチャーウィンドウを作成し、
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0&)
で、キャプチャーウインドウとドライバーを接続をしているのですが、
K.J.Kさんが言ってる事は、DeviceのIndexを
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0&)
の、引数の三番目(0になってるところ)に設定してあげれば良い
と、言う事でしょうか?
このIndexは、USBカメラを接続する順番や、場所によって、変化しませんか?
私がやりたいのは、DirectShowで、
グラフにキャプチャ(カメラ)フィルタを追加する様に、
VFWでも、USBカメラの名前を使って、表示するUSBカメラを選択出来ませんでしょうか?
起動時に、Indexとドライバの名前を対応させてみては。
capGetDriverDescriptionを0から9までLoopさせるとか。
K.J.K.さん、お答え頂いて有難うございます。
実際、capGetDriverDescriptionを使って、ドライバの名前を取得したのですが、
「Microsoft WDM Image Capture (Win32)
Version: 5.1.2600.2180」
だけしか、取得出来ません。
実際、PCには2つUSBを接続しています。
ちなみに、デバイスマネージャには、
USB-CAM30Series
VGA PC Camera Capture
と、2つ認識されています。
やり方が間違っているのでしょうか?
一様、プログラムをのせておきます。
(プログラムの内容は、キャプチャードライバーをリストボックスに入力していき、
一番最初(Index 0)のキャプチャドライバーとキャプチャーウインドウを接続して、
ピクチャーボックスにUSB画像を表示させまています。)
もし、良かったらアドバイスを下さい。
Private Declare Function capGetDriverDescription Lib "avicap32.dll" Alias "capGetDriverDescriptionA" (ByVal wDriverIndex As Integer, ByVal lpszName As String, ByVal cbName As Long, ByVal lpszVer As String, ByVal cbVer As Long) As Long
Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" Alias "capCreateCaptureWindowA" (ByVal lpszWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hwnd As Long, ByVal nID As Long) As Long
Private Const WM_USER = &H400
Private Const WM_CAP_START = WM_USER
Private Const WM_CAP_DRIVER_CONNECT = (WM_CAP_START + 10)
Private Const WM_CAP_EDIT_COPY = (WM_CAP_START + 30)
Private Const WM_CAP_GRAB_FRAME = (WM_CAP_START + 60)
Private Sub Form_Load()
Dim i As Integer
Dim szNamebuf As String
Dim lpszVerbuf As String
Dim ret As Long
Dim hWndC As Long
For i = 0 To 9
szNamebuf = Space(255)
lpszVerbuf = Space(255)
ret = capGetDriverDescription(i, szNamebuf, Len(szNamebuf), lpszVerbuf, Len(lpszVerbuf))
szNamebuf = Left(szNamebuf, InStr(szNamebuf, Chr$(0)) - 1)
lpszVerbuf = Left(lpszVerbuf, InStr(lpszVerbuf, Chr$(0)) - 1)
If szNamebuf <> "" Then
Me.List1.AddItem szNamebuf & " :" & lpszVerbuf
End If
Next i
hWndC = capCreateCaptureWindow("VB VideoCapture CaptureWindow", WS_CHILD Or WS_VISIBLE, 700, 25, 320, 240, Me.hwnd, nID)
If Me.List1.ListIndex < 0 Then
Me.List1.ListIndex = 0
End If
ret = SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, Me.List1.ListIndex, 0&)
ret = SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0&)
ret = SendMessage(hWndC, WM_CAP_EDIT_COPY, 0, 0&)
Me.picPicture0.Picture = Clipboard.GetData(vbCFPalette)
Me.picPicture0.Picture = Clipboard.GetData(vbCFBitmap)
End Sub
「Microsoft WDM Image Capture (Win32) Version: 5.1.2600.2180」
が出るとなると、VFWじゃ難しいのかもしれません。これらはそもそも
DirectShowに作用する共用のDriverですよね。2つのデバイスとも
VFWに直接作用するドライバを備えてはいないのでしょう。
http://www.ne.jp/asahi/ham/js1rsv/TEST/ListCam.htm
を読む限りも、VFWでは難しいように思えます。
VFWでは難しいのですね。
かなりショックですが、わかりました。
K.J.K.さん有難う御座いました。
ツイート | ![]() |