Open-source project
unrealcv/unrealcv avatar
unrealcv/unrealcv

UnrealCV: a command channel between Unreal Engine and your Python vision code

UnrealCV: Connecting Computer Vision to Unreal Engine

2,215 stars464 forksPythonMIT

At a glance

What is it?
UnrealCV is an Unreal Engine plugin plus a pip-installable Python client that lets external programs query and manipulate a virtual world. It is aimed at computer vision and embodied AI researchers who need synthetic images with ground truth, and its main constraint is that you must already have a UE project or a prebuilt binary that embeds the plugin.
Who is it for?
Adopt UnrealCV if you already have a C++ Unreal Engine project or a prebuilt binary with the plugin embedded, and you need ground-truth images, depth or optical flow pulled into Python. Do not adopt it if you have no UE build pipeline: the server side is a compiled plugin, not a standalone renderer, and the pip package alone will not produce a single pixel.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 12 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

Who UnrealCV is for, and the problem it removes

Labelling real photographs is slow, and some labels (per-pixel depth, surface normals, optical flow) are effectively unobtainable from a camera. UnrealCV's answer is to make a game engine behave like a sensor. The README frames the project as helping computer vision researchers build virtual worlds with Unreal Engine, and it lists two capabilities the plugin adds: a set of UnrealCV commands for interacting with the virtual world, and communication between UE and an external program such as PyTorch or TensorFlow. That second item is the one that matters. Unreal Engine already renders convincing scenes; what it does not do out of the box is hand a Python process a depth map on request. UnrealCV is the bridge, and the intended user is someone training or evaluating a model who wants a scriptable source of images and matching ground truth. If you only need a fixed dataset, you do not need this. If you need to move a camera, change lighting, or capture a new modality on demand, the request-response model is the point.

The mechanism: commands in, images and metadata out

The architecture has two halves that the README treats separately. On the engine side, UnrealCV is a plugin that extends UE and exposes a command interface; the console command vget /unrealcv/status is given as the way to confirm the plugin is alive. On the client side, the Python package connects to that interface and issues commands. The naming convention is visible in the feature list: vget retrieves something from the world, and the examples follow a path-like syntax, as in vget /camera/[id]/optical_flow [format], where the camera is addressed by an identifier and the optional format argument selects the output encoding. The README also documents vbp [obj_name] [func_name] [arg1] [arg2] ..., which calls any Blueprint function from Python. That is a deliberate escape hatch: anything you expose in a Blueprint becomes callable from your training script without writing C++. Recent releases add RPC communication between server and client on Linux, described as giving higher FPS and more reliable behaviour than what came before. The README does not state which transport it replaces, so the practical difference is something you would have to measure on your own scene rather than take from the release note.

Two install paths that are not interchangeable

The README describes two ways to use UnrealCV, and they have very different costs. The cheap path is a compiled game binary with UnrealCV already embedded: you run the game, and no Unreal Engine knowledge is required. The expensive path is installing the plugin into Unreal Engine and using the editor to build a new virtual world. For the server side, the documented steps are to download the source and place it in the Plugin folder of a C++ UE project, then launch the project with Visual Studio so UnrealCV compiles alongside it. The README warns that your Visual Studio version should be compatible with your UE version, and links to Epic's guidance on that pairing. Once compiled, pressing the backtick key opens the console, and vget /unrealcv/status tells you whether the installation worked. The client is a single command: pip install unrealcv. Note the asymmetry. The pip package is trivial to install and useless on its own; the plugin is the part that can absorb an afternoon. Prebuilt binaries with UnrealCV embedded are pointed to via UnrealZoo, which is the realistic starting point for someone without a UE project already open.

The version contract is the sharpest edge here

The default branch is named 5.2, the README states support for Unreal Engine 5.2 and later, and the topics list both ue4 and ue5. Those three facts do not sit comfortably together. A project whose default branch tracks a specific engine minor version is telling you that engine upgrades are events, not background noise. Unreal Engine plugin APIs move between releases, and a plugin compiled against one minor version is not guaranteed to load in another. The README's own Visual Studio compatibility warning reinforces this: the toolchain, the engine and the plugin have to agree. The practical consequence is that adopting UnrealCV ties your simulation stack to a UE version you can build. If your team is on an older engine and cannot move, you are reading documentation for a branch you cannot compile. The README does not publish a compatibility matrix mapping UnrealCV releases to engine versions, so the release tags v1.1.0, v1.1.1 and v1.1.2 tell you when things changed but not what engine each one targets.

UnrealZoo features are not in the open-source contract

This is the section most likely to cause a wrong assumption. The README describes UnrealCV Dev For UnrealZoo as the continuously developed feature surface tested in UnrealZoo before general-purpose capabilities are promoted into the open-source plugin. It then states plainly that those features are available in supported UnrealZoo environments and are not part of the open-source command contract unless they appear in the main command reference. Read that as a boundary, not a roadmap. If a command works in an UnrealZoo environment, that does not mean it exists in the plugin you compiled from this repository, and it does not mean it will. The same pattern appears around the runtime MCP tooling: public clients, examples and an agent skill live in a separate repository, unrealcv-runtime-mcp, and the README states that the Unreal Engine C++ Runtime MCP server is not currently open source. So there is a documented split between what the MIT-licensed plugin gives you and what the surrounding ecosystem provides under other terms. Check the command reference before designing around a feature you saw demonstrated elsewhere.

Where UnrealCV is the wrong tool

Three cases. First, if your environment is not Unreal Engine. The plugin is an extension of UE, and there is no path in the README to Unity, Godot, or a standalone renderer. Second, if you need reproducible, versioned datasets rather than a live simulator. UnrealCV is a runtime interface; it hands you frames when you ask for them. It is not a dataset distribution format, and nothing in the README suggests otherwise. Third, and most commonly, if nobody on the team can build a C++ UE project. The prebuilt-binary route avoids that, but it also fixes the scene: you get the world someone else compiled, with the commands that build exposed. The moment you need a new object, a new camera rig, or a Blueprint function that does not exist, you are back to the editor. There is also a quieter cost. A live engine in the loop means your data pipeline now has a frame-rate-dependent component, and the README's own note that RPC on Linux gives higher FPS implies throughput was a real constraint before. If your training loop is bottlenecked on data loading, adding a game engine to the critical path is a decision worth making explicitly.

Alternatives and the actual difference in approach

The closest comparison is Blender's Python API. Blender is free, scriptable from Python without a compiled plugin, and its Cycles and Eevee renderers can produce depth, normals and optical flow passes through the compositor. The difference is architectural rather than one of image quality. UnrealCV keeps a running engine process and answers commands over a socket, which suits interactive agents that need to act and observe in a loop. Blender's API drives a scene graph inside the same Python process and renders to disk, which suits offline generation of a fixed dataset. If your work is embodied AI where an agent takes steps in a world, the request-response model of UnrealCV matches the problem; if your work is producing a million labelled frames once, a batch renderer is simpler to operate and has no runtime to keep alive. The README's own framing supports this reading: it describes communication between UE and an external program as a core feature, which is a statement about interactivity, not about throughput. A third option, using prebuilt UnrealZoo binaries, is not really an alternative to UnrealCV so much as a way to consume it without touching the editor.

Licence, maintenance and what upgrading costs

The repository is MIT licensed. That is permissive and imposes few conditions on how you use or redistribute the plugin code, but it covers this repository only. The README carves out two things the MIT grant does not reach: the UnrealZoo development surface and the Unreal Engine C++ Runtime MCP server, which the README says is not currently open source. Unreal Engine itself is governed by Epic's own terms, and shipping a compiled game binary carries obligations that have nothing to do with UnrealCV's licence. None of this is legal advice; check the terms that apply to your distribution. On maintenance, the release cadence visible in the supplied material is three tags in roughly a week in late August and early September 2026, which suggests active work but says nothing about long-term stability, and the README does not describe a deprecation policy or a supported-version window. The upgrade cost is concentrated in one place: the engine version. Because the plugin compiles against UE headers, moving from one UE minor release to the next is a rebuild plus a re-verification of every command your pipeline depends on, starting with vget /unrealcv/status and then each capture command in your scripts. Budget for that as a scheduled task rather than an incidental one, and pin the UE version your project builds against in the same place you pin the UnrealCV release tag.

Editorial conclusion

Adopt UnrealCV if you already have a C++ Unreal Engine project or a prebuilt binary with the plugin embedded, and you need ground-truth images, depth or optical flow pulled into Python. Do not adopt it if you have no UE build pipeline: the server side is a compiled plugin, not a standalone renderer, and the pip package alone will not produce a single pixel. Before committing, verify three things against your own UE version: that the plugin compiles under your Visual Studio toolchain, that vget /unrealcv/status answers on your machine, and whether the command you need appears in the main command reference rather than only in the UnrealZoo development surface.

Official sources

  1. License: MIT
  2. Project website
  3. README
  4. Releases
  5. unrealcv/unrealcv on GitHub
Community notes

Community notes