IBM Books

Image Extender、Audio Extender 和 Video Extender 管理和程序设计

镜头检测数据结构

与镜头检测相关的数据存储在镜头检测头文件 dmbshot.h 中包括的那些结构中。许多镜头检测 API 都要求您指向其中一个或多个结构。其中一些结构用来包含 Video Extender 用作输入的数据。例如,镜头控制结构包含控制镜头检测的信息。Video Extender 使用大多数结构来存储它从视频中检索到的数据。例如,视频帧数据结构包含帧的象素内容。

用于镜头检测的结构有 DBvIOType、DBvShotControl、DBvShotType、 DBvFrameData 和 DBvStoryboardCtrl。

DBvIOType

DBvIOType 数据结构包含关于视频的数据,诸如它的格式、 尺寸和帧的数目。此数据结构定义如下:

typedef struct {
 
   FILE *hFile;                    /* file handle for the video */
   char vhandle[255];              /* video handle (if from database)
   char vtable[255];               /* video table name (if from database) */
   char vcolumn[255];              /* video column name (if from database) */
   char vFile[255];                /* name of video file */
   char idxFile[255];              /* name of index file */
   char isIdx;                     /* 1 if the index exists, 0 otherwise */
   char isInDb;                    /* 1 if from DB, 0 if from file */
   int format;                     /* Format of the video */
   unsigned long dx, dy;           /* Dimensions of the video */
   unsigned long totalFrames;      /* TotalFrames in the video */
   unsigned long markFrame;        /* used by shot detection */
   unsigned long currentFrame;     /* The current video frame */
   DBvFrameData fd;                /* Frame data for current frame */
   DBvDCFrameData fdDc;            /* Frame data for DC images */
   unsigned char BGRValid;         /* reserved */
   unsigned short usDeviceID;      /* reserved */
   unsigned long hwnd;             /* reserved */
   int videoReset;                 /* Flag if video is opened or seeked */
   int firstshot;                  /* Used internally to indicate the first call */
   void *reserved                  /* reserved */ 
 
} DBvIOType;

DBvShotControl

DBvShotControl 数据结构包含用来控制镜头检测的信息, 如检测方法。此数据结构定义如下:

typedef struct {
 
  unsigned long reserved;
  unsigned long method;           /* detection method */
 
    #define DETECT_CORRELATION  0x00000001
    #define DETECT_HISTOGRAM    0x00000002
    #define DETECT_CORRHIST     0x00000003
    #define DETECT_CORRHISTDISS 0x00000004
 
 
  int normalCorrValue;            /* Correlation threshold */
  int sceneCutSkipXY;             /* reserved */
  int CorrHistThresh;             /* Histogram threshold */
  int DissThresh;                 /* Dissolve threshold */
  int DissCacheSize;              /* Dissolve cache size */
  int DissNumCaches;              /* Dissolve cache number */
  int minShotSize;                /* Minimum frames in a shot */
 
} DBvShotControl;

下表描述了 DBvShotControl 中的每个字段及其允许的设置和缺省设置 要将这些字段初始化为缺省值, 按照初始化镜头检测数据结构中的值中的描述来使用 DBvInitShotControl API。

DBvShotControl 设置取决于视频的类型: 数字化视频中的画面切换随视频的内容和格式的不同而有很大变化。另外,画面切换算法的准确性随视频的不同而有所变化。与更细微类型的更改,或整体色彩内容保持不变的更改相比, 对整体帧外观有明显差异且清晰定义的画面切换的检测更准确。虽然对于大多数应用程序,缺省 DBvShotControl 字段设置就已足够, 但您可能需要调整这些设置以减少出错或未能检测的情况。

表 10. DBvShotControl 字段
字段 含义
方法 标识 Video Extender 用来检测画面切换的方法。可选择下列其中一种方法:

DETECT_CORRELATION。 比较两个连续帧中的象素数。若差异超过相关阈值,将检测画面切换。

DETECT_HISTOGRAM。 比较两个连续帧的直方图值。直方图值测量一个帧中色彩的分配。若差异超过直方图阈值,将检测画面切换。

DETECT_CORRHIST。使用相关方法来标识可能的画面切换, 然后对标记为可能的画面切换的帧使用直方图方法。若超过直方图阈值,将检测画面切换。

DETECT_CORRHISTDISS。与 DETECT_CORRHIST 相同,但检查附加帧的渐稳。

缺省方法是 DETECT_CORRHIST。

normalCorrValue 0 至 100 的整数值,指定相关阈值。这将给出两个帧中的象素之间相关系数的最小值。 值 0 表示总是检测下一帧的画面切换。值 100 表示仅当两个帧的所有象素均不相同时,才检测画面切换。缺省值是 60。
sceneCutSkipXY 保留。
CorrHistThresh 0 至 100 的整数值,指定直方图阈值。这将测量连续帧的直方图值之间的差异。 值 0 表示仅当两个帧的直方图值完全不同时,才检测画面切换。值 100 表示总是检测下一帧的画面切换。缺省值是 10。
DissThresh 0 至 100 的整数值, 指定渐稳测试阈值 这将测量一个帧中必须通过渐稳测试才会检测到渐稳的象素的百分比。 值 0 表示总是检测帧的渐稳。值 100 表示仅当帧中的所有象素都通过渐稳测试时,才会检测到渐稳。缺省值是 15。
DissCacheSize 一个整数值, 指定渐稳测试的倾斜部分中使用的帧数。 缺省值是 4。
DissNumCaches 一个整数值, 指定渐稳测试的一致性部分中使用的帧数。 缺省值是 7。
minShotSize 一个整数值, 指定镜头的最小帧数。为了要检测到某个镜头, 它必须最少要有与最小数一样多的帧。缺省值是 5。

DBvShotType

DBvShotType 数据结构包含关于镜头的信息, 诸如起始帧号、结束帧号和有代表性帧的号码; 以及指向有代表性帧的象素内容的指针。此数据结构定义如下:

typedef struct {
 
  unsigned long startFrame;       /* starting frame number */
  unsigned long endFrame;         /* ending frame number */
  unsigned long repFrame;         /* representative frame number */
  DBvFrameData fd;                /* data for representative shot */
  unsigned long dx;               /* frame data width in pixels */
  unsigned long dy;               /* frame data height in pixels */
  char *comment;                  /* shot remark */
 
} DBvShotType;

DBvFrameData

DBvFrameData 数据结构包含帧的象素内容。此数据结构定义如下:

typedef struct                     /* video frame data */
{
  /* MPEG 1 pixels */
  unsigned char *luminance;        /* Luminance pixel plane (black and white) */
  unsigned char *Cr;               /* Cr pixel plane */
  unsigned char *Cb;               /* Cb pixel plane */
  unsigned char *reserved;
 
  } DBvFrameData;

DBvStoryboardCtrl

DBvStoryboardCtrl 数据结构包含一些值, 用于控制将镜头中哪些以及多少有代表性帧存储在视频目录中。参见 构建故事板 以获取如何使用这些值的说明。此数据结构定义如下:

typedef struct {
 
  int thresh1;                    /* threshold for small to medium scenes */
  int thresh2;                    /* threshold for medium to large scenes */
  int delta;                      /* offset used for representative frames */
 
} DBvStoryboardCtrl;

下表描述了 DBvStoryboardCtrl 中的每个字段及其缺省设置。要将这些字段初始化为缺省值, 按照初始化镜头检测数据结构中的值 中的描述来使用 DBvInitStoryboardCtrl API。

DBvStoryboardCtrl 设置取决于视频的类型:视频的类型不同, 哪些以及多少有代表性帧对于故事板来说才最优可能有所变化。虽然对于许多类型的视频来说,缺省的 DBvStoryboardCtrl 类型设置工作得很好, 但您可能想使用这些设置来测试视频子集。然后,对这些设置进行适当调整,再为更大范围的一组视频构建故事板。

表 11. DBvStoryboardCtrl 字段
字段 含义
thresh1 标识短镜头的阈值。所含帧数小于 thresh1 的值的镜头是短镜头。若已编目, 则短镜头的信息将包括一个有代表性帧(中间的帧)。

缺省值是 90。若将 thresh1 的值设置为 -1, 则将认为某个镜头是短镜头(不管它的实际长度是多少)。

thresh2 标识中镜头到大镜头的阈值。所含帧数等于或小于 thresh2的值, 但至少达到 thresh1 的值的镜头认为是中镜头。若已编目,则中镜头的信息将包括两个有代表性帧。有代表性帧的位置由 delta 字段的值控制。将所含帧数大于 thresh2 的值的镜头认为是长镜头。若已编目,则长镜头的信息将包括三个有代表性帧。第一个和最后一个有代表性帧的位置由 delta 字段的值控制。第二个帧是中间的帧。

缺省值是 150。若将 thresh2 的值设置为 -1, 则将认为某个镜头是短镜头(不管它的实际长度是多少)。

delta 标识用于有代表性帧的位移。对于中等帧和长帧,第一个有代表性帧位于从镜头的开始算起, 经过 delta 中帧数的位移处。最后一个有代表性帧位于从帧的末尾算起, 经过 delta 中的帧数的位移处。

缺省值是 5。

初始化镜头检测数据结构中的值

DBvShotControl 数据结构中的值控制镜头检测。DBvStoryboardCtrl 数据结构中的值控制故事板的构建。可明确地为这些数据结构中的字段指定值。另外,还可以将这些结构中的值初始化为缺省值。参见表 10以获取 DBvShotControl 数据结构中的缺省值。参见表 11以获取 DBvStoryboardCtrl 数据结构中的缺省值。

使用 DBvInitShotControl API 来初始化 DBvShotControl 数据结构中的值。在使用此 API 时,需要指定镜头控制结构。例如,下列语句将 DBvShotControl 结构中的字段初始化为缺省值:

DBvShotControl    shotCtrl;
 
rc=DBvInitShotControl(
              shotCtrl);          /* pointer to shot control structure */
              

使用 DBvInitStoryboardCtrl API 来初始化 DBvStoryboardCtrl 数据结构中的值。在使用此 API 时,需要指定故事板控制结构。例如,下列语句将 DBvStoryboardCtrl 结构中的字段初始化为缺省值:

DBvStoryboardCtrl    sbCtrl;
 
rc=DBvInitStoryboardCtrl(
              sbCtrl);          /* pointer to storyboard control structure */
              


[ 页的顶部 | 上一页 | 下一页 | 目录 | 索引 ]