![](/img/trans.png)
[英]OpenCV imread(std::string filename, int flags) problem when using a variable for string filename in c++
[英]OpenCV imread(filename) fails in debug mode when using release libraries
我有一些C++代碼,除了 function imread(file)
之外, OpenCV一切正常。 它正確地找到了文件並加載了名稱,但沒有加載任何數據。
Mat pattImage = imread(fileName, 0);
在對 web 進行了一些研究后,我意識到我處於調試模式,但發布的是OpenCV庫,而不是調試庫。
debug library: opencv_core231d.lib
release library: opencv_core231.lib
雖然這是典型的愚蠢錯誤,但我認為這不應該做任何事情,調試庫應該允許OpenCV代碼調試,而發布庫允許更快地執行代碼,但我不明白為什么 imread 失敗了。
誰能解釋一下OpenCV中調試庫和發布庫之間的區別以及為什么會發生此錯誤?
它是OpenCV錯誤嗎?
我永遠不會厭倦告訴人們Windows的C ++ OpenCV界面有最大的錯誤 。
使用C接口編寫一個小測試來檢查它是否有效( cvLoadImage()
等)。
更新 :既然您知道C接口正常工作,您可以轉到郵件列表並在那里報告此錯誤或自己深入了解代碼以找出失敗的原因。
在發布模式下,您必須在調試模式下使用發布庫 - 調試庫。 這不是錯誤。
有這個問題使用Qt(Qt Creator),鏈接相應庫的調試版本修復它。 這可以在項目配置文件(.pro)中自動完成:
使用FORWARD斜杠(/),而不是反斜杠()。 即使在Windows中!
不正確:
cv::imread("C:\example\1.jpg");
正確:
cv::imread("C:/example/1.jpg");
通常,將“Debug”可執行配置與“Release”配置庫鏈接起來是完全合法的(為什么不應該在Debug和Release中將庫導出的符號相同)。 除非(由於某些原因)你不希望發生“混合”。 事實證明,opencv開發人員決定不允許這樣的混合,並且他們使用特定部分代碼執行此類問題(您可以在版本3.4.4第54行的文件cvdef.h中找到)。 這不是C ++接口錯誤,而是“通緝”行為。 您可以在https://github.com/opencv/opencv/pull/9161上找到更多信息,其中記錄了此更改。
您可以通過將 Debug 應用程序的運行時庫從 /MDd(多線程 DLL調試)更改為 /MD(多線程 DLL 運行時的常規發行版)來解決此問題。
與正常發布模式相比,您的代碼仍將未經優化且更易於調試,但您會丟失一些調試信息(例如 C 運行時內的崩潰)。 您還會丟失一些調試功能,例如調試堆,但如果您不知道那是什么,那么它不會影響您。
要解決此問題,只需將 go 到 Properties>C/C++/Code Generation 並將“Runtime Library”從 /MDd 更改為 /MD。
例如 OpenCV 4.2,
更改項目屬性如下:
配置:調試
配置屬性->鏈接器->輸入->附加依賴
添加 opencv_world420 d .lib
配置:發布
配置屬性->鏈接器->輸入->附加依賴
添加 opencv_world420.lib
然后你會沒事的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.