diff --git a/include/zbar.h b/include/zbar.h
--- a/include/zbar.h
+++ b/include/zbar.h
@@ -795,6 +795,10 @@
 extern int zbar_processor_request_iomode(zbar_processor_t *video,
                                          int iomode);
 
+/** see the description under zbar_video_set_no_probe_flag() */
+extern int zbar_processor_set_no_probe_flag(zbar_processor_t *proc,
+                                         unsigned int flag);
+
 /** force specific input and output formats for debug/testing.
  * @note must be called before zbar_processor_init()
  */
@@ -1010,6 +1014,14 @@
 extern int zbar_video_request_iomode(zbar_video_t *video,
                                      int iomode);
 
+/** set a flag which prevents video initialization
+ *  from probing possible video formats.
+ *  Instead of probing, the current video format is used.
+ *  Supported only by vfw, where it speeds up initialization.
+ */
+extern int zbar_video_set_no_probe_flag(zbar_video_t *vdo, 
+                                        unsigned int flag);
+
 /** retrieve current output image width.
  * @returns the width or 0 if the video device is not open
  */
diff --git a/zbar/processor.c b/zbar/processor.c
--- a/zbar/processor.c
+++ b/zbar/processor.c
@@ -368,6 +368,7 @@
                                      proc->req_width, proc->req_height);
         if(proc->req_intf)
             zbar_video_request_interface(proc->video, proc->req_intf);
+        zbar_video_set_no_probe_flag(proc->video, proc->no_probe_flag);
         if((proc->req_iomode &&
             zbar_video_request_iomode(proc->video, proc->req_iomode)) ||
            zbar_video_open(proc->video, dev)) {
@@ -506,6 +507,15 @@
     return(0);
 }
 
+int zbar_processor_set_no_probe_flag(zbar_processor_t *proc,
+                                     unsigned int flag)
+{
+    proc_enter(proc);
+    proc->no_probe_flag = flag;
+    proc_leave(proc);
+    return(0);
+}
+                                         
 int zbar_processor_force_format (zbar_processor_t *proc,
                                  unsigned long input,
                                  unsigned long output)
diff --git a/zbar/processor.h b/zbar/processor.h
--- a/zbar/processor.h
+++ b/zbar/processor.h
@@ -70,6 +70,7 @@
     zbar_image_data_handler_t *handler; /* application data handler */
 
     unsigned req_width, req_height;     /* application requested video size */
+    unsigned int no_probe_flag : 1;     /* prevent format probing */
     int req_intf, req_iomode;           /* application requested interface */
     uint32_t force_input;               /* force input format (debug) */
     uint32_t force_output;              /* force format conversion (debug) */
diff --git a/zbar/video.c b/zbar/video.c
--- a/zbar/video.c
+++ b/zbar/video.c
@@ -211,6 +211,11 @@
     return(0);
 }
 
+int zbar_video_set_no_probe_flag (zbar_video_t *vdo, unsigned int flag) {
+    vdo->no_probe_flag = flag;
+    return(0);
+}
+
 int zbar_video_get_width (const zbar_video_t *vdo)
 {
     return(vdo->width);
diff --git a/zbar/video.h b/zbar/video.h
--- a/zbar/video.h
+++ b/zbar/video.h
@@ -65,6 +65,7 @@
     video_iomode_t iomode;      /* video data transfer mode */
     unsigned initialized : 1;   /* format selected and images mapped */
     unsigned active      : 1;   /* current streaming state */
+    unsigned no_probe_flag : 1; /* do not probe formats from video device */
 
     uint32_t format;            /* selected fourcc */
     unsigned palette;           /* v4l1 format index corresponding to format */
diff --git a/zbar/video/vfw.c b/zbar/video/vfw.c
--- a/zbar/video/vfw.c
+++ b/zbar/video/vfw.c
@@ -388,6 +388,7 @@
 
 static int vfw_probe (zbar_video_t *vdo)
 {
+    uint32_t initial_fmt;
     video_state_t *state = vdo->state;
     state->bi_size = capGetVideoFormatSize(state->hwnd);
     BITMAPINFOHEADER *bih = state->bih = realloc(state->bih, state->bi_size);
@@ -401,6 +402,7 @@
 
     zprintf(3, "initial format: " BIH_FMT " (bisz=%x)\n",
             BIH_FIELDS(bih), state->bi_size);
+    initial_fmt = bih->biCompression;
 
     if(!vdo->width || !vdo->height) {
         vdo->width = bih->biWidth;
@@ -414,8 +416,9 @@
     int n = 0;
     const uint32_t *fmt;
     for(fmt = vfw_formats; *fmt; fmt++)
-        if(vfw_probe_format(vdo, *fmt))
-            vdo->formats[n++] = *fmt;
+        if((!vdo->no_probe_flag || *fmt==initial_fmt) &&
+            vfw_probe_format(vdo, *fmt))
+                vdo->formats[n++] = *fmt;
 
     vdo->formats = realloc(vdo->formats, (n + 1) * sizeof(uint32_t));
 
diff --git a/zbarcam/zbarcam.c b/zbarcam/zbarcam.c
--- a/zbarcam/zbarcam.c
+++ b/zbarcam/zbarcam.c
@@ -237,6 +237,9 @@
                 strlen(argv[i]) == 13)
             outfmt = (argv[i][9] | (argv[i][10] << 8) |
                       (argv[i][11] << 16) | (argv[i][12] << 24));
+        else if(!strcmp(argv[i], "--no-probe")) {
+            zbar_processor_set_no_probe_flag(proc, 1);
+        }
         else {
             fprintf(stderr, "ERROR: unknown option argument: %s\n\n",
                     argv[i]);
