OpenCvSharp is a cross-platform .NET wrapper for OpenCV, providing a rich set of image processing and computer vision functionality. It supports .NET Framework 4.8, .NET 8 and later, and .NET Standard 2.0.
dotnet add package OpenCvSharp4.Windowsdotnet add package OpenCvSharp4
dotnet add package OpenCvSharp4.official.runtime.ubuntu.24.04-x64For more installation options, see the Installation section below.
- OpenCvSharp is modeled on the native OpenCV C/C++ API style as much as possible.
- Many classes of OpenCvSharp implement IDisposable. Unsafe resources are managed automatically.
- OpenCvSharp does not force object-oriented programming style on you. You can also call native-style OpenCV functions.
- OpenCvSharp provides functions for converting from
MattoBitmap(GDI+) orWriteableBitmap(WPF).
- .NET Framework 4.8 / .NET 8 or later / .NET Standard 2.0
- (Windows) Visual C++ 2022 Redistributable Package
- (Windows Server) Media Foundation
PS1> Install-WindowsFeature Server-Media-Foundation
- (Ubuntu) You must pre-install all the dependency packages needed to build OpenCV. Many packages such as libjpeg must be installed for OpenCV to work. https://docs.opencv.org/4.x/d7/d9f/tutorial_linux_install.html
OpenCvSharp won't work on Unity and Xamarin platforms. For Unity, please consider using OpenCV for Unity or some other solutions.
OpenCvSharp does not support CUDA. If you want to use CUDA features, you need to customize the native bindings yourself.
Add OpenCvSharp4 and OpenCvSharp4.runtime.win NuGet packages to your project. Alternatively, you can use the OpenCvSharp4.Windows all-in-one package.
Add OpenCvSharp4 and OpenCvSharp4.runtime.uwp NuGet packages to your project. Note that OpenCvSharp4.runtime.win and OpenCvSharp4.Windows don't work for UWP.
Add OpenCvSharp4 and OpenCvSharp4.official.runtime.ubuntu.22.04-x64 NuGet packages to your project.
dotnet new console -n ConsoleApp01
cd ConsoleApp01
dotnet add package OpenCvSharp4
dotnet add package OpenCvSharp4.official.runtime.ubuntu.22.04-x64
# -- edit Program.cs --- #
dotnet run
Add OpenCvSharp4 and OpenCvSharp4.official.runtime.ubuntu.24.04-x64 NuGet packages to your project.
dotnet new console -n ConsoleApp01
cd ConsoleApp01
dotnet add package OpenCvSharp4
dotnet add package OpenCvSharp4.official.runtime.ubuntu.24.04-x64
# -- edit Program.cs --- #
dotnet run
Add OpenCvSharp4 and OpenCvSharp4.official.runtime.linux-x64 NuGet packages to your project. This package is built on Ubuntu 24.04 and may work on other recent Linux distributions.
dotnet new console -n ConsoleApp01
cd ConsoleApp01
dotnet add package OpenCvSharp4
dotnet add package OpenCvSharp4.official.runtime.linux-x64
# -- edit Program.cs --- #
dotnet run
For more details, refer to the samples and Wiki pages.
Always remember to release Mat and other IDisposable resources using the using syntax:
// C# 8
// Edge detection by Canny algorithm
using OpenCvSharp;
class Program
{
static void Main()
{
using var src = new Mat("lenna.png", ImreadModes.Grayscale);
using var dst = new Mat();
Cv2.Canny(src, dst, 50, 200);
using (new Window("src image", src))
using (new Window("dst image", dst))
{
Cv2.WaitKey();
}
}
}Advanced: Using ResourcesTracker for automatic resource management
As mentioned above, objects of classes such as Mat and MatExpr have unmanaged resources and need to be manually released by calling the Dispose() method. Additionally, the +, -, *, and other operators create new objects each time, and these objects need to be disposed to prevent memory leaks. Despite having the using syntax, the code can still look verbose.
Therefore, a ResourcesTracker class is provided. The ResourcesTracker implements the IDisposable interface, and when the Dispose() method is called, all resources tracked by the ResourcesTracker are disposed. The T() method of ResourcesTracker can track an object or an array of objects, and the NewMat() method is equivalent to T(new Mat(...)). All objects that need to be released can be wrapped with T(). For example: t.T(255 - t.T(picMat * 0.8)). Example code is as follows:
using (var t = new ResourcesTracker())
{
Mat mat1 = t.NewMat(new Size(100, 100), MatType.CV_8UC3, new Scalar(0));
Mat mat3 = t.T(255-t.T(mat1*0.8));
Mat[] mats1 = t.T(mat3.Split());
Mat mat4 = t.NewMat();
Cv2.Merge(new Mat[] { mats1[0], mats1[1], mats1[2] }, mat4);
}
using (var t = new ResourcesTracker())
{
var src = t.T(new Mat(@"lenna.png", ImreadModes.Grayscale));
var dst = t.NewMat();
Cv2.Canny(src, dst, 50, 200);
var blurredDst = t.T(dst.Blur(new Size(3, 3)));
t.T(new Window("src image", src));
t.T(new Window("dst image", blurredDst));
Cv2.WaitKey();
} https://github.com/shimat/opencvsharp_samples/
http://shimat.github.io/opencvsharp/api/OpenCvSharp.html
Native binding (OpenCvSharpExtern.dll / libOpenCvSharpExtern.so) is required for OpenCvSharp to work. To use OpenCvSharp, you should add both OpenCvSharp4 and OpenCvSharp4.runtime.* packages to your project. Currently, native bindings for Windows, UWP, Ubuntu, Linux ARM, and WebAssembly are available.
Packages named OpenCvSharp3-* and OpenCvSharp-* are deprecated.
OpenCvSharp3-AnyCPU / OpenCvSharp3-WithoutDll / OpenCvSharp-AnyCPU / OpenCvSharp-WithoutDll
If you are not using NuGet, you can download the DLL files from the release page.
https://github.com/shimat?tab=packages
- Install Visual Studio 2022 or later
- VC++ features are required.
- Run
download_opencv_windows.ps1to download OpenCV libs and headers from https://github.com/shimat/opencv_files. Those lib files are precompiled by the owner of OpenCvSharp using GitHub Actions.
.\download_opencv_windows.ps1
- Build OpenCvSharp
- Open
OpenCvSharp.slnand build
- Open
If you want to use OpenCV features that are not included by default in OpenCvSharp (e.g., GPU support), you will need to build OpenCV yourself. The binary files of OpenCV for OpenCvSharp for Windows are created in the opencv_files repository. See the README for details.
git clone --recursive https://github.com/shimat/opencv_files- Edit
build_windows.ps1orbuild_uwp.ps1to customize the CMake parameters - Run the PowerShell script
- Build OpenCV with opencv_contrib: https://docs.opencv.org/4.x/d7/d9f/tutorial_linux_install.html
- Install .NET Core SDK: https://learn.microsoft.com/ja-jp/dotnet/core/install/linux-ubuntu
- Get OpenCvSharp source files
git clone https://github.com/shimat/opencvsharp.git
cd opencvsharp
git fetch --all --tags --prune && git checkout ${OPENCVSHARP_VERSION}
- Build native wrapper
OpenCvSharpExtern
cd opencvsharp/src
mkdir build
cd build
cmake -D CMAKE_INSTALL_PREFIX=${YOUR_OPENCV_INSTALL_PATH} ..
make -j
make install
You should add a reference to opencvsharp/src/build/OpenCvSharpExtern/libOpenCvSharpExtern.so
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/home/shimat/opencvsharp/src/build/OpenCvSharpExtern"
- Add
OpenCvSharp4NuGet package to your project
dotnet new console -n ConsoleApp01
cd ConsoleApp01
dotnet add package OpenCvSharp4
# -- edit Program.cs --- #
dotnet run
If you find the OpenCvSharp library useful and would like to show your gratitude by donating, here are some donation options. Thank you.