Opencv学习笔记——release和debug两个模式的运行问题
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。博客不用于商業(yè)活動,博主對博客的使用,擁有最終解釋權(quán)?
本文為原創(chuàng)作品,未經(jīng)本人同意,禁止轉(zhuǎn)載,禁止用于商業(yè)用途!本人對博客使用擁有最終解釋權(quán)?
歡迎關(guān)注我的網(wǎng)上圖書室: 晨鳧追風(fēng)和 微信公眾號:青春當(dāng)追風(fēng)
作者:晨鳧追風(fēng)
關(guān)于Opencv的一個bug的解決方法
錯誤:
Opencv配置完之后運行一切都很正常,也愉快的弄了一些demo,然而突然有一天,我心血來潮想要在release下運行一下自己的代碼,于是出現(xiàn)了一個很美的畫面:
?
?
輸出窗口顯示錯誤信息:
0x50AA8B98(opencv_highgui249d.dll) (template_example.exe中)處的第一機會異常:?0xC0000005:?讀取位置 0xACC6BCCD時發(fā)生訪問沖突。
0x50AA8B98(opencv_highgui249d.dll) (template_example.exe中)處有未經(jīng)處理的異常:?0xC0000005:?讀取位置 0xACC6BCCD時發(fā)生訪問沖突。
還有一種情況是:
0x77715B68?處(位于?mouse_movement.exe?中)最可能的異常:?Microsoft?C++?異常:?cv::Exception,位于內(nèi)存位置?0x010AF3C8?處。
0x77715B68?處(位于?mouse_movement.exe?中)有未經(jīng)處理的異常:?Microsoft?C++?異常:?cv::Exception,位于內(nèi)存位置?0x010AF3C8?處。
這是在debug下運行錯誤。
?
提示內(nèi)存錯誤,算是Opencv的一個bug,在Debug下可以運行,在release下卻不能運行報錯。?
介紹一下來龍去脈:
在對Opencv進行配置的時候,配置鏈接庫的時候會有一堆 .lib的文件,其中Debug文件庫名有d結(jié)尾,release沒有d。
如:opencv_video249d.lib—debug庫。
opencv_video249.lib—release庫。
按照一般的網(wǎng)上配置教程,會出現(xiàn)debug下可以運行,release下不能運行的情況(報錯原因是由于字符串讀取問題引起的如圖像載入不了,內(nèi)存出現(xiàn)錯誤,指針錯誤等情況)。
因為在附加依賴項配置的時候,會優(yōu)先選擇寫在前面的那一類lib作為支持的調(diào)試方式,一般我們把帶d的寫在前面,于是就出現(xiàn)了默認在debug下可以載入圖像,識別字符串等操作。如果把不帶d的寫在前面,那就默認release下調(diào)試。
解決方法:
在配置的時候就添加一類依賴項,如:就只添加帶d的那一類,于是就只支持debug模式下的調(diào)試,這時候想要在release下也能調(diào)試,就在當(dāng)前工程的release模式下自己將不帶d的依賴項添加進去:【項目】—【屬性】—【配置屬性】—【鏈接器】—【輸入】—【附加依賴項】,添加即可。
上圖:1、選擇release模式調(diào)試
?
?
2、選擇當(dāng)前項目屬性
?
?
3、添加附加依賴項:把不帶d的庫添加進去,運用就ok了
4、
至此完成。
?
感覺在配置的時候只添加一類,只添加帶d的或者只添加不帶d的庫,這樣在用到另外一種模式的時候再去修改當(dāng)前工程的屬性配置(并不是之前的固有屬性)。這樣做讓人感覺更加清爽,兩個全部添加,畢竟系統(tǒng)只默認在前面的那一種庫。
方式二:
添加以下代碼:
#ifndef _OPENCV_LIB_ #define _OPENCV_LIB_#ifdef _DEBUG #pragma comment(lib, "opencv_calib3d249d.lib") #pragma comment(lib, "opencv_contrib249d.lib") #pragma comment(lib, "opencv_core249d.lib") #pragma comment(lib, "opencv_features2d249d.lib") #pragma comment(lib, "opencv_flann249d.lib") #pragma comment(lib, "opencv_gpu249d.lib") #pragma comment(lib, "opencv_highgui249d.lib") #pragma comment(lib, "opencv_imgproc249d.lib") #pragma comment(lib, "opencv_legacy249d.lib") #pragma comment(lib, "opencv_ml249d.lib") #pragma comment(lib, "opencv_nonfree249d.lib") #pragma comment(lib, "opencv_objdetect249d.lib") #pragma comment(lib, "opencv_photo249d.lib") #pragma comment(lib, "opencv_stitching249d.lib") #pragma comment(lib, "opencv_ts249d.lib") #pragma comment(lib, "opencv_video249d.lib") #pragma comment(lib, "opencv_videostab249d.lib") #else #pragma comment(lib, "opencv_calib3d249.lib") #pragma comment(lib, "opencv_contrib249.lib") #pragma comment(lib, "opencv_core249.lib") #pragma comment(lib, "opencv_features2d249.lib") #pragma comment(lib, "opencv_flann249.lib") #pragma comment(lib, "opencv_gpu249.lib") #pragma comment(lib, "opencv_highgui249.lib") #pragma comment(lib, "opencv_imgproc249.lib") #pragma comment(lib, "opencv_legacy249.lib") #pragma comment(lib, "opencv_ml249.lib") #pragma comment(lib, "opencv_nonfree249.lib") #pragma comment(lib, "opencv_objdetect249.lib") #pragma comment(lib, "opencv_photo249.lib") #pragma comment(lib, "opencv_stitching249.lib") #pragma comment(lib, "opencv_ts249.lib") #pragma comment(lib, "opencv_video249.lib") #pragma comment(lib, "opencv_videostab249.lib") #endif#endif
重命名為:opencv_lib.h,把該文件放到opencv的包含路徑中:...\opencv\build\include\opencv2目錄下面,即和 #include <opencv2/opencv.hpp> 在同一個目錄,之后只需要包含頭文件 #include <opencv2/opencv_lib.h>
就可以在Debug和Release版本之間任意切換
當(dāng)然要在包含庫中把原來的庫刪除即可
如有不足之處歡迎批評指正,原創(chuàng)作品,轉(zhuǎn)載請注明出處!謝謝!后續(xù)的學(xué)習(xí)總結(jié)會陸續(xù)推出!歡迎廣大愛好者交流!
?
?
總結(jié)
以上是生活随笔為你收集整理的Opencv学习笔记——release和debug两个模式的运行问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pcb钻孔披锋改善报告_高速高频PCB技
- 下一篇: HTML5 API详解(1):fulls