Q: Sequence Grabber を使用する際の Source 矩形領域、Video 矩形領域、Channel 矩形領域の関係を理解しようとしています。これらを設定する決まった方法はあるのでしょうか?
A: QuickTime の Sequence Grabber を使って映像を取得するときには、取得する映像の部分を指定する、3 つの矩形が鍵となります。すなわち、Source 矩形領域、Video 矩形領域、Channel 矩形領域です。これらの矩形領域は、これからキャプチャするソースイメージの大きさと、キャプチャ後のイメージをどのように表示するかを制御します。これらの矩形領域の関係を理解することは、一部が切り取られているイメージをキャプチャする場合や(この場合 Video 矩形領域は、Source 矩形領域の一部であると定義されます)、 キャプチャしたイメージが Sequence Grabber によって表示用に拡大縮小される方法を理解するのに役立ちます。
Source 矩形領域は、SGGetSrcVideoBounds を呼び出して取得でき、アクティブなソース映像の境界矩形全体のサイズを示します。このサイズは、ソースの入力形式に従って、Video Digitizer によって設定されます。直接設定することはできませんが、入力形式によって変わります。
Video 矩形領域は、デフォルトでは、Source 矩形領域と同じに設定され、キャプチャしようとするソース映像のイメージの一部を示します。これは、ユーザが実際に目にすることになるイメージですが、まだ拡大縮小はなされていません。この矩形領域は、SGGetVideoRect と SGSetVideoRect を使って、取得および設定できます。Video Digitizer によっては、Source 矩形領域全体より小さい領域のキャプチャができない場合があります。
さらに、ソース映像イメージをキャプチャする部分を詳細に設定したあと、Channel 矩形領域と呼ばれるキャプチャ後の映像イメージの希望のサイズを SGSetChannelBounds によって指定します。Channel 矩形領域は、チャネルの表示境界矩形を示します。
|
重要: SGSetChannelBounds は、単にクライアント側で矩形領域の希望のサイズを指定できるようにしたものです。Video Digitizer から返される実際の範囲は異なる場合があります。キャプチャ後の映像のサイズと拡大縮小についてクライアントに厳密な要件がある場合には、キャプチャ後の映像を必要に応じて調整できる必要があります。
|
図 1 に、それぞれの矩形領域の関係を示します。
Source、Video、Channel の各矩形領域は、それぞれ {0, 0, 1200, 1600}、{50, 50, 770, 930}、{0, 0, 288, 352} です。
Video 矩形領域と Channel 矩形領域を指定するには、必要な拡大縮小を行った Source 矩形領域と、拡大縮小を行った Video 矩形領域を選びます。これらの矩形領域を選んだあと、リスト 1 に示すように処理を行い、Video と Channel の矩形領域を設定します。
|
リスト 1. Video 矩形領域と Channel 矩形領域の指定
|
ComponentResult SetVideoChannelBounds(SGChannel videoChannel,
const Rect *scaledSourceBounds,
const Rect *scaledVideoBounds)
{
Rect sourceBounds;
Rect videoBounds;
Rect channelBounds;
MatrixRecord scaledSourceBoundsToSourceBounds;
ComponentResult err;
// scaledSourceBounds を Source 矩形領域に変換する
// 行列を計算する
SGGetSrcVideoBounds(videoChannel, &sourceBounds);
RectMatrix(&scaledSourceBoundsToSourceBounds,
scaledSourceBounds, &sourceBounds);
// 同じ変換を scaledVideoBounds
// に適用し Video 矩形領域を取得する
videoBounds = *scaledVideoBounds;
TransformRect(&scaledSourceBoundsToSourceBounds, &videoBounds, 0);
err = SGSetVideoRect(videoChannel, &videoBounds);
if ((digiUnimpErr == err) || (qtParamErr == err)) {
// ビデオデジタイザによっては、フレーム全体のキャプチャ、または特定のサイズでのキャプチャ
// のみサポートする。要求した Video 矩形領域に対応できない場合に、
// qtParamErr または digiUnimpErr が返される
err = SGSetVideoRect(videoChannel, &sourceBounds);
}
if (err) goto bail;
// Channel 矩形領域は (0, 0) にオフセットされた scaledVideoBounds
channelBounds = *scaledVideoBounds;
OffsetRect(&channelBounds, -channelBounds.left, -channelBounds.top);
// SGSetChannelBounds は、単にクライアント側で矩形領域の希望サイズを指定できるようにしている
// に過ぎない。イメージ記述の vDig によって返される実際の矩形領域は、
// 異なる場合がある
err = SGSetChannelBounds(videoChannel, &channelBounds);
bail:
return err;
}
|
参考資料:
[2003 年 7 月 16 日]
|