Webcam DirectShow

High Level Code generation in C, C++, Visual C++
1 Webcam uses functions from DirectShow


MFC Project with a subset from the AMCAP example

1)EnumerateAllDevices(): The programm first lists all video devices.
2)StartThisDevice(gx.rgpmVideoMenu[0]): If there is only one source start it
otherwise chose the source and click on the "select source" button

3) InitCapFilters():
4) BuildPreviewGraph():
5) StartPreview():

The webcam is now connected with the actual dialog window


The source was compiled with "Visual Studio 2010" plus SDK.

 2 Take a picture and elaborate it

With the button "take a picture" it is possible to copy the windows content in
an array.
In the function "CopyImageFromWindow()" we create first a Bitmap
With "BitBlt" we transfer the actual window content in the Bitmap "capture_map"

The function "GetDIBits" than copies the content of cature_map into "arrImage1"
Now we can elaborate this "arrImage1" transfer elaborated data to another memory like
"arrImage2" and view this data in the other dialog window.

To view the data we must transfer the array data into device context from this window.
We use the function "SetDIBitsToDevice" in "void CWin2Dlg::OnPaint()"

A bitmap is organized in multiple of two.
RGB colors needs 3 Bytes, so we have for each pixel 4 bytes.
For every color one byte and one void byte.

If you want to convert to grayscale a simple method is to sum all three pixels
and than divide by 3.

Better is to take the right percentages of the 3 colors.
                iGrayBlue  = cBlue  *  29;
                iGrayGreen = cGreen * 151;
                iGrayRed   = cRed   *  77;
                iGraySum   = iGrayBlue + iGrayGreen + iGrayRed;
                iGraySum   /= 256;
                
100 percent is equal 256.
A value multiplied with  29 and than divided about 256 is equal to 11%
A value multiplied with 152 and than divided about 256 is equal to 59%
A value multiplied with  77 and than divided about 256 is equal to 30%

The gray value is the sum of 11% blue, 59% green and 30% red.
This calculation is an example of a fast integer arithmetic

 3 filter applications

calculate image about 3x3 matrix

           High pass filter
sharpening    0 -1  0
             -1  4 -1    iDiv=4
              0 -1  0
              
           Low pass filter
gauss         1  2  1
              2  4  2    iDiv=16
              1  2  1
              
           Low pass filter
median        extract the median pixel-value from 3x3 pixel-matrix
              replace the centered pixel with this value
              
 4 edge detection

Take a picture with checkbox enabled "grayed"

To find the edge you can use the Prewitt or the Sobel operator


       -1 0 +1
 Gx =  -1 0 +1
       -1 0 +1

 
+1 +1 +1 Gy = 0 0 0 -1 -1 -1
Addition of both Prewitt operators G = Gx + Gy
The Sobel operator: -1 0 +1 -1 -2 -1 Gx = -2 0 +2 Gy = 0 0 0 -1 0 +1 +1 +2 +1 Addition of both Sobel operators G = Gx + Gy