本文已假設你的樹莓派已經使用cmake編譯並安裝好OpenCV和dotnet
OpenCV和dotnet安裝(本文使用OpenCV 4.4.0):
在樹莓派上安裝OpenCV教程(英文 - 建議):https://pimylifeup.com/raspberry-pi-opencv/
在樹莓派上安裝OpenCV教程(中文):https://www.cnblogs.com/fjlinww/p/11956264.html
在編譯的過程中會提示你有幾個文件找不到,需要去這個issue上下載這個老哥提供的缺失文件的地址https://github.com/opencv/opencv_contrib/issues/1301#issuecomment-447181426
然后復制到~/opencv_contrib/opencv_contrib-4.4.0/modules/xfeatures2d/src/下
在樹莓派上手動安裝dotnet教程(中文 - 官方):https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-debian#manual-install
記得在樹莓派應該下載linux-arm32的binaries
使用.Net Core進行OpenCV開發步驟:
1.從github:https://github.com/shimat/opencvsharp/releases上下載Release(例如4.4.0則下載OpenCvSharp-4.4.0-20200725.zip)
2.解壓zip文件后如下:
3.解壓后在自己Windows10的電腦上創建一個.Net Core 控制台項目,然后添加以下三個dll
4.然后再添加OpenCvSharpExtern.dll(注意,根據自己系統添加x64還是x86的,添加這個是為了方便自己在win上進行開發,部署到樹莓派需要編譯一個so文件復制到發布根目錄,后面會講到)
5.在新建的OpenCv .net項目引用完四個dll后在main方法嘗試粘貼並運行以下代碼:
static void Main(string[] args) { Mat mat = new Mat("lenna.png", ImreadModes.Color); for (int y = 0; y < mat.Height; y++) { for (int x = 0; x < mat.Width; x++) { Vec3b color = mat.Get<Vec3b>(y, x); byte temp = color.Item0; color.Item0 = color.Item2; // B <- R color.Item2 = temp; // R <- B mat.Set<Vec3b>(y, x, color); } } }
記得隨便復制一個圖片改成lenna.png放到\bin\Debug\netcoreapp3.1目錄下,方便調試的時候能夠讀到該圖片
如果跑起來沒問題說明已經可以進行下一步了。
在樹莓派上編譯libOpenCvSharpExtern.so文件(均在樹莓派4B上操作)
准備:先安裝Mono,請按順序執行以下命令:
sudo apt-get -y install apt-transport-https dirmngr gnupg ca-certificates sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF echo "deb https://download.mono-project.com/repo/debian stable-raspbianstretch main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list sudo apt-get update sudo apt-get install mono-complete
1.還是原來這個github repo:https://github.com/shimat/opencvsharp/releases上下載Source Code(例如4.4.0則下載Assets對應的Source Code.zip)
2.解壓源代碼執行以下命令
cd src mkdir build cd build cmake -D CMAKE_INSTALL_PREFIX=${YOUR_OPENCV_INSTALL_PATH} .. make -j4
sudo make install
注意:${YOUR_OPENCV_INSTALL_PATH}要換成你的OpenCv安裝路徑,我的樹莓派是在/usr/local/include/opencv4則填這個路徑
最后你能在/usr/local/include/opencv4的lib目錄下找到編譯好的libOpenCvSharpExtern.so文件。
在樹莓派上運行OpenCV + .Net Core 3.1:
1.將剛剛在win上寫的Open Cv .Net例子發布后將文件復制樹莓派上;
2.然后將剛剛編譯好的libOpenCvSharpExtern.so文件復制到.Net例子發布后在樹莓派上根目錄下
3.運行dotnet命令將你的例子跑起來看看有沒有報錯。
常見問題:
Unhandled exception. System.TypeInitializationException: The type initializer for 'OpenCvSharp.NativeMethods' threw an exception. ---> System.DllNotFoundException: Unable to load shared library 'OpenCvSharpExtern' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: libOpenCvSharpExtern: cannot open shared object file: No such file or directory at OpenCvSharp.NativeMethods.redirectError(CvErrorCallback errCallback, IntPtr userdata, IntPtr& prevUserdata) at OpenCvSharp.ExceptionHandler.RegisterExceptionCallback() in C:\Projects\opencvsharp\src\OpenCvSharp\PInvoke\ExceptionHandler.cs:line 49 at OpenCvSharp.NativeMethods.LoadLibraries(IEnumerable`1 additionalPaths) in C:\Projects\opencvsharp\src\OpenCvSharp\PInvoke\NativeMethods\NativeMethods.cs:line 83 at OpenCvSharp.NativeMethods..cctor() in C:\Projects\opencvsharp\src\OpenCvSharp\PInvoke\NativeMethods\NativeMethods.cs:line 54
因為在樹莓派運行opencvsharp需要libOpenCvSharpExtern.so文件,請檢查編譯后的so文件在與你的可執行文件的同級目錄
參考鏈接:https://nicruo.github.io/2020/02/12/opencvsharp-on-raspberry-pi-4.html