One of the common problems I have found is that most of the routines only accept 8bit single channel input data - and often the manual doesn't say anything about what is or isn't expected for the image parameters.
Of course, one can use another library: e.g., Opengl, or the MSwindows drawing functions - in some ways, that may be better as the OpenCV library is pretty restricted. However, the advantage is that your code only depends upon OpenCV not on any other lib if you stick with OpenCV only.
There are a numer of drawing routined in cvdrawing.cpp - they are pretty self explanatory except - the images haft to be 8bit (either single channel or triple - i.e., rgb). The other thing you need to know is that the drawing colour is specified with an int and the colour is in the lower 3 bytes (r,g,b - blue in lowest byte) for colour images and greyscale (single byte in lowest byte) for greyscale images. Circle drawing greyscale image