Here is an enhanced version of the OpenCV people detection demo program using the sample.

### Context Free Art – Tutorial 8

By using the same square, we further experiment with the various options in the *STROKE* command.

STROKE {p miterjoin} STROKE {p roundjoin} STROKE {p beveljoin}

startshape MyShape path Shape1 { MOVETO {x -0.5 y -0.5} LINETO {x 0.5 y -0.5} LINETO {x 0.5 y 0.5} STROKE {p buttcap} } path Shape2 { MOVETO {x -0.5 y -0.5} LINETO {x 0.5 y -0.5} LINETO {x 0.5 y 0.5} STROKE {p roundcap} } path Shape3 { MOVETO {x -0.5 y -0.5} LINETO {x 0.5 y -0.5} LINETO {x 0.5 y 0.5} STROKE {p squarecap} } rule MyShape { Shape1 {x -1.5} Shape2 {x 0} Shape3 {x 1.5} }

### Context Free Art – Tutorial 7

We continue the study of *path* command. Take a look of the closed shape, a square.

startshape MyShape path Line { MOVETO {x -0.5 y -0.5} LINETO {x 0.5 y -0.5} LINETO {x 0.5 y 0.5} LINETO {x -0.5 y 0.5} LINETO {x -0.5 y -0.5} CLOSEPOLY {} STROKE {} } rule MyShape { Line {} }

If by any chances, you type the wrong position for the last end point or there is rounding error after a sequence of calculation, you may end of with:

startshape MyShape path Line { MOVETO {x -0.5 y -0.5} LINETO {x 0.5 y -0.5} LINETO {x 0.5 y 0.5} LINETO {x -0.5 y 0.5} LINETO {x -0.45 y -0.45} CLOSEPOLY {} STROKE {} } rule MyShape { Line {} }

Note the *CLOSEPOLY* command will connect an extra line segment to close the shape if there is a gap between the beginning and the end points. In case we want to get rid of the error, we can use the *CLOSEPOLY* command with an extra parameter *align*.

startshape MyShape path Line { MOVETO {x -0.5 y -0.5} LINETO {x 0.5 y -0.5} LINETO {x 0.5 y 0.5} LINETO {x -0.5 y 0.5} LINETO {x -0.45 y -0.45} CLOSEPOLY {p align} STROKE {} } rule MyShape { Line {} }

### OpenCV C++ usage

I start using the C++ interface for OpenCV, instead of the old highgui C functions. Here is an example to do real time video capture from the default webcam.

#include "stdafx.h" #include "cv.h" #include "highgui.h" using namespace cv; int main(int, char**) { VideoCapture cap(0); cap.set(CV_CAP_PROP_FRAME_WIDTH, 640); cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480); if (!cap.isOpened()) return -1; namedWindow("camera",CV_WINDOW_AUTOSIZE); while (true) { Mat frame; cap >> frame; imshow("camera", frame); if (waitKey(10) >= 0) break; } return 0; }

### Context Free Art – Tutorial 6

Today we start to think recursively. The following example uses a simple recursive definition of a SQUARE. In Context Free Art, we may not need to specify a stop condition when each iteration reduces its size, until eventually, the shape is too small to display.

startshape Shape1 rule Shape3 { SQUARE {a -0.9} Shape3 {s 0.9 r 7} } rule Shape2 { 4 * {x 1} Shape3 {r 45} } rule Shape1 { 4 * {y 1} Shape2 {} }

### Context Free Art – Tutorial 5

Take a look of this example and see how it can be done with FILL command and the colour adjustments.

### Context Free Art – Tutorial 4

The following examples illustrate the use of repetition in Context Free Art.

startshape MyShape path Line1 { MOVETO {x 0 y 0} LINETO {x 1 y 0} STROKE {width .01} } rule MyShape { 36 * {r 10} Line1 {} }

startshape MyShape path Line1 { MOVETO {x 0 y 0} LINETO {x 1 y 0} STROKE {width .01} } rule MyShape { 36 * {r 10 x 0.03} Line1 {} }

### Context Free Art – Tutorial 3

These exercises cover the use of *path* in a shape.

startshape MyShape path Line1 { MOVETO {x 0 y 0} LINETO {x 1 y 1} STROKE {width .01} } rule MyShape { Line1 {} }

startshape MyShape path Line1 { MOVETO {x 0 y 0} LINETO {x 1 y 1} LINETO {x 0 y 1} LINETO {x 1 y 0} LINETO {x 0 y 0} STROKE {width .01} } rule MyShape { Line1 {} }

startshape MyShape path Line1 { MOVETO {x 0 y 0} LINETO {x 1 y 0} STROKE {width .01} } rule MyShape { Line1 {r 25} }

### Context Free Art – Tutorial 2

We introduce the use of the rotation parameter for a shape:

startshape MyShape rule MyShape { SQUARE {x -4 r 90} SQUARE {x -2 r 70} SQUARE {r 50} SQUARE {x +2 r 30} SQUARE {x +4 r 10} }

### Context Free Art – Tutorial 1

After we can create different primitive shapes, we start to combine them together. We cannot simply put all the primitive shapes within one single shape rule, like:

startshape MyShape rule MyShape { CIRCLE {} TRIANGLE {} SQUARE {} }

Every shape command comes with parameters. We work with the translation parameters **x** and **y** to move the shape around in the canvas.

startshape MyShape rule MyShape { CIRCLE {x -2} TRIANGLE {} SQUARE {x 2} }

startshape MyShape rule MyShape { CIRCLE {y 2} TRIANGLE {} SQUARE {y -2} }

startshape MyShape rule MyShape { CIRCLE {x 2 y 2 size 0.8} TRIANGLE {size 2} SQUARE {x -2 y -2 size 0.5} }