Funvision is a computer vision blog that has been running since 2015. It exists for one reason: most OpenCV tutorials show a fragment of code that does not compile, against a version of the library that no longer exists. Everything here ships the whole thing — the includes, the CMake, the build flags, and the version it was actually tested against.

What you will find here

  • Building and installing OpenCV on Windows and Linux — Visual Studio, CMake, vcpkg, CUDA, contrib modules, and builds linked against FFmpeg or GStreamer.
  • Video streaming — reading RTSP cameras, writing HLS, GStreamer pipelines, and getting OpenCV output into a browser without a second of extra latency.
  • Detection and tracking — Haar and LBP cascades, HOG + SVM, the DNN module, YOLO, and the tracking API, with the trade-offs each one makes.
  • Modern multimodal models — where Gemini, ChatGPT and friends genuinely beat classical computer vision, and where they do not.

About the author

I have been working with OpenCV and C++ since the 2.4 days, mostly on video: capture, streaming, detection and tracking on real footage rather than benchmark datasets. The tutorials here are the notes I wish had existed when I was solving each problem the first time.

Videos for many of the tutorials are on YouTube, and some longer write-ups are on Medium.

Using the code

Every code sample on this site is free to use, including commercially. No attribution required, though a link back is always appreciated. If a sample no longer builds against a current OpenCV release, that is a bug — tell me and I will fix the post.

A note on this site

In 2026 this blog moved off Blogger onto a static site. Every old URL still works: it redirects permanently to its new address, so nothing you have bookmarked or linked to is broken. The new URLs drop the publication date, because a tutorial that has been kept current should not look ten years old in a search result.

The site sends no cookies, runs no tracking scripts, and loads no fonts. Every tutorial is also available as plain Markdown at /md/blog/<slug>.md if you would rather read it — or have a model read it — without the HTML.