DirectShow でカメラ制御を行うサンプルを下記リポジトリに格納しました。

リポジトリ:
https://github.com/cogorou/DSLab

概要

確認に使用したカメラは Logicool Qcam Orbit AF です。
DirectShow の IAMCameraControl インターフェースを介してカメラの制御を行います。

LabDS_Camera
LabDS_Camera2_fig

【サンプルコード】
.NET Framework のフォームアプリケーションです。 開発環境は Visual Studio 2013 Community 、開発言語は C# です。 リポジトリの下記の位置に格納しています。
https://github.com/cogorou/DSLab/tree/master/build/TestPanTilt

LabDS

TrackBar を操作すると各制御を行います。

制御の対象
  1. Focus (焦点調整)
  2. Exposure (露出調整)
  3. Pan (パン制御)
  4. Tilt (チルト制御)
  5. Reset (原点復帰)

Focus (焦点調整)
LabDS_Focus
var prop = CameraControlProperty.Focus;
int flag = (int)CameraControlFlags.Manual;
int value = trackFocus.Value;
textFocus.Text = value.ToString();

HRESULT hr;
hr = (HRESULT)CameraControl.Set(prop, value, flag);
if (hr < HRESULT.S_OK)
	throw new CxDSException(hr);


Exposure (露出調整)
LabDS_Exposure
var prop = CameraControlProperty.Exposure;
int flag = (int)CameraControlFlags.Manual;
int value = trackExposure.Value;
textExposure.Text = value.ToString();

HRESULT hr;
hr = (HRESULT)CameraControl.Set(prop, value, flag);
if (hr < HRESULT.S_OK)
	throw new CxDSException(hr);


Pan (パン制御)
LabDS_Pan

本体を物理的に稼働させる為には相対値で指定します。
式)相対値 = トラックバーの現在値 - 本体の位置
+ : 右方向
- : 左方向

HRESULT hr;
var prop = CameraControlProperty.Pan;
int old_value = 0;
int flag = 0;
hr = (HRESULT)CameraControl.Get(prop, ref old_value, ref flag);
if (hr < HRESULT.S_OK)
	throw new CxDSException(hr);

int new_value = trackPan.Value;
int movement = new_value - old_value;
if (movement != 0)
{
	// 相対値.
	hr = (HRESULT)CameraControl.Set(prop, movement, (int)CameraControlFlags.Manual | 0x10);
	if (hr < HRESULT.S_OK)
		throw new CxDSException(hr);

	// 絶対値.
	hr = (HRESULT)CameraControl.Set(prop, new_value, flag);
	if (hr < HRESULT.S_OK)
		throw new CxDSException(hr);

	statusPan.Text = string.Format("Pan={0}", new_value);
	statusPan.ForeColor = Color.FromKnownColor(KnownColor.ControlText);
}

注意)
上記はカメラ制御の処理部のみ記載していますが、実際には各操作の間隔を1秒以上空けています。 確認に使用したカメラは、操作の間隔が狭いと例外が発生して暫く受け付けなくなる為です。


Tilt (チルト制御)
LabDS_Tilt

本体を物理的に稼働させる為には相対値で指定します。
式)相対値 = トラックバーの現在値 - 本体の位置
+ : 上方向
- : 下方向

HRESULT hr;
var prop = CameraControlProperty.Tilt;
int old_value = 0;
int flag = 0;
hr = (HRESULT)CameraControl.Get(prop, ref old_value, ref flag);
if (hr < HRESULT.S_OK)
	throw new CxDSException(hr);

int new_value = trackTilt.Value;
int movement = new_value - old_value;
if (movement != 0)
{
	// 相対値.
	hr = (HRESULT)CameraControl.Set(prop, movement, (int)CameraControlFlags.Manual | 0x10);
	if (hr < HRESULT.S_OK)
		throw new CxDSException(hr);

	// 絶対値.
	hr = (HRESULT)CameraControl.Set(prop, new_value, flag);
	if (hr < HRESULT.S_OK)
		throw new CxDSException(hr);

	statusTilt.Text = string.Format("Tilt={0}", new_value);
	statusTilt.ForeColor = Color.FromKnownColor(KnownColor.ControlText);
}
注意)
上記はカメラ制御の処理部のみ記載していますが、実際には各操作の間隔を1秒以上空けています。 確認に使用したカメラは、操作の間隔が狭いと例外が発生して暫く受け付けなくなる為です。


Reset (原点復帰)
Pan/Tilt を操作しているとカメラの原点がずれてきます。DirectShow 自体には Reset と言うコマンドはありません。原点に復帰させるには下記の操作でメカニカルリセットを行います。

CameraControl.Set(CameraControlProperty.Pan, 0, (int)CameraControlFlags.Manual);
System.Threading.Thread.Sleep(3000);
CameraControl.Set(CameraControlProperty.Tilt, 0, (int)CameraControlFlags.Manual);