問題:opencv與qwxwidgets都靜態連結到tiff,jpeg,png,zlib四個庫,當opencv使用靜態編譯時間,在wxwidgets的event事件中處理使用opencv讀寫jpg,tiff,png圖片有時候會出錯。原因是opencv讀取圖片的代碼可能與wxwidgets衝突了(具體原因未深入研究)。我遇到的情況是讀寫jpg檔案來出錯,讀寫png,tiff檔案正常。
對比opencv與wxwidgets使用第三方映像庫的版本如下(版本沒有大改動,按理說應該不會有問題,除非有一方的代碼實現對其進行了某些改動)
第三方庫 opencv242 wxWidgets294
jpeg 6b (6.2) 6b
png 1.5.9 1.5.7
tiff 4.0.1 3.8.2
zlib 1.2.6 1.2.3
解決辦法:雙方都使用同一個第三方映像庫
前提:擁有已經編譯好的第三方映像庫。(下載原始碼,用gcc編譯一下,不難)
opencv 有BUILD_***, WITH_***(其中***表第三方庫名稱)這兩種選項。取消BUILD_***,選中WITH_***表示不使用opencv內部的第三方庫,但支援讀取***映像的功能。由於取消了BUILD_***,所以必須手動指定這些庫的位置,不然opencv還是會使用自身帶的第三方庫的。指定庫的位置指指定其include,lib的位置,如zlib庫需定義ZLIB_LIBRARY
ZLIB_INCLUDE_DIR兩個變數。cmake可以命令列中指定也可以介面中指定,介面中指定效果如下:
-
people3.jpg (128.13 KiB) 被瀏覽 7 次
提醒一下:本人使用這個方法它只能識別tfii,zlib. png與jpeg庫cmake還是檢測不到,不知道為什麼。最後是直接使用opencv產生的第三方庫作為系統的第三方庫給wxwidgets連結的。
wxwidgets方法就簡單多了,它提供了--with-***=sys的選項(但只能在./configure中配置,所以使用mingw32-make編譯它提供的makefile.gcc是不行的,得使用msys環境自己配置一下makefile檔案).
這是我使用的命令./configure --enable-unicode --enable-static --disable-shared --enable-monolithic --with-libpng=sys --with-zlib=sys --with-libtiff=sys --with-libjpeg=sys. 同樣,這也得讓gcc找得到第三方映像庫的位置(這個簡單,把第三方映像為的標頭檔和庫檔案放到gcc的include與lib檔案夾裡),不然configure不成功。