It has some historical reasons why both systems exist.
- In the past you had OpenCV 1.x and OpenCV 2.x. The OpenCV 1.x interface was the C based API, which was the historical starting language for OpenCV. When C++ became more popular OpenCV 2.x API was released, using the possibilities of C++ over the C language.
- For a long time both versions where supported, since many embedded systems still contained only C support. However since about 2010, that changed drastically and thus OpenCV decided to focus on its C++ API, keeping the old C-API as a sort of backup, but not longer supported and updated frequently.
- About a year and half ago, OpenCV did a complete overhaul of its backend interface. This in order to support various multithreading interfaces (which are more easily accessible now), hardware support layers, ... the differences are discussed in the transition guide.
- However the transition forced users to change some structural things in the way they embedded OpenCV in their code. Therefore the OpenCV 2.4.x was maintained, with only allowing bug fixes and efficiency fixes, but no longer new functionality. This allows users to gradually move on to the OpenCV 3.x interface.
So basically
- If you are starting OpenCV from scratch just now, use OpenCV 3.x.
- If you got old OpenCV based software depending on heavily changed modules, you either update those or stick to OpenCV 2.x.
- At all times, stay aways of the OpenCV 1.x C-API. Since the release of OpenCV 3.x it has been seen as obsolete and no longer supported. In the future OpenCV devs might investigate a way to auto generate a C-interface from the existing C++ source code, since there are still some systems (but not many of them) out there only support C.
Good luck!