關於如何在XP系統上運行opencv生成的C++動態庫

先講下爲什麼要在xp系統上運行opencv生成的C++動態庫,原因是我做了一個圖像檢測項目,使用C#編寫的,C#裏有個opencvsharp圖像處理包,對於C#程序員調用在舒服不過了,但是!客戶比較守舊,非要項目支持XP系統,我想那就放XP上跑唄,跑了才發現總是報錯

排查了好久才知道XP不支持較高版本的opencv,更別提opencvsharp了。網上有說XP支持opencv3.0,於是就從網上down下來,編譯成庫,寫了個demo調用,(剛開始我用的是vs2017,環境配置詳細可看這位仁兄的https://blog.csdn.net/shitangdejiaozi/article/details/54139438 屬性配置裏把VC++目錄中的包含目錄和庫目錄填上opencv3.0的include和lib,鏈接器的輸入中的附加依賴項把相關的lib庫都填上了)把demo放到XP上,還是報錯,在XP用dependency工具查看動態庫,發現一大堆系統動態庫找不到,這裏省略10000字,歷經坎坷,發現要把配置屬性常規裏的平臺工具集選成Visual Studio 2017 - Windows XP (v141_xp),還要把C/C++代碼生成裏的運行庫選擇多線程(/MT),這樣好了,demo終於可以在XP上跑起來了,我想這下應該沒什麼難的了,只需要把opencvsharp的接口改成對應opencv的,估計參數啥的都不用變。

       事實證明我還是太年輕,在動態庫裏改了之後調用,卻怎麼都出不來調用opencvsharp的效果,鬱悶啊,難道都是opencv還有啥多大區別?好吧,最坑的就是這兩位了adaptiveThreshold,findContours,先說adaptiveThreshold,這個函數作用是自適應二值化,最後一個參數c之前用opencvsharp的時候調整了好長時間,終於調出最佳效果了,然後用opencv不好使了,各種試啊,最後實在沒招了,調成負的試試,我去,居然好了,這什麼邏輯。。。管他呢,效果出來就行,來不及開心啊,因爲程序跑着跑着就退出了,啥錯也沒報啊,怎麼辦一行一行註釋找唄,最後定位在這兩個函數上,有你沒我,不能共存,我的心是崩潰且處在麻木的邊緣,這怎麼搞,然後網上又一通搜,沒啥幫助,後來想到opencv3.0裏x86下面對應的vc12,然後我用的是vs2017,是不是不對應?網上一查,果然,cv12對應vs2013........怎麼辦?下唄,又折騰了幾個小時把vs2013給裝上了,裝好之後,趕緊操作一通,好了!可以正常調用了!如釋重負,這個週末可以好好過了,感恩!對了,vs2013的平臺工具集要選擇這個Visual Studio 2013 - Windows XP (v120_xp),還有C#項目的.NET工具集也不能太高。

        關於C++編寫動態庫:新建項目,選擇win32控制檯應用程序,然後選擇DLL,在生成的stdafx中添加如下代碼:

#include <opencv2\opencv.hpp>
#include <opencv\cv.hpp>
#include <opencv2\highgui.hpp>

添加對應項目名的.h,在.h文件中添加供外界調用的接口

#ifdef OPENCVTEST_EXPORTS
#define OPENCVTEST_API extern "C" __declspec(dllimport)
#else
#define OPENCVTEST_API extern "C" __declspec(dllexport)
#endif

接口前要添加OPENCVTEST_API,在cpp中寫接口的實現。

然後就是C#中的調用了

using System.Runtime.InteropServices;

[DllImport("opencvdll.dll", CallingConvention = CallingConvention.Cdecl)]//爲了解決問題託管調試助手 "PInvokeStackImbalance":的調用導致堆棧不對稱
public static extern void DrawCircleOnPicture(String filename);

這裏貌似要成對出現,不然接口找不到定義。

好了,這裏記錄我的坎坷,希望也能幫到你

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章