問題1:記憶體配置不足
運行opencv時會出現記憶體配置不足的情況:如下圖所示
OpenCV Error: Insufficient memory (Failed to allocate ……. )
一般也會伴隨著錯誤提示:Unhandled exception at at 0x76D85B68 in DEVISIGN_read.exe: Microsoft C++ exception: cv::Exception at memory location 0x0098EDDC.
開始想自己電腦32G記憶體,開啟工作管理員,記憶體使用量率還不到20%,很不理解為什麼出現這個記憶體不足以分配的問題。經過尋找資料,發現VS的配置是32位,VS分配是有限制的。那麼一次性最多分類4GB記憶體,當需要不斷分配記憶體很多時(處理視頻),可能就不足了。這個時候將VS的opencv重新設定為64位的,就可以解決記憶體配置不足的問題了。 問題2:錯誤 14 error C2589: “(”:“::”右邊的非法標記 和 錯誤 15 error C2059: 語法錯誤:“::” 1.錯誤碼:
const size_t key_size_upper_bound = std::min(sizeof(BucketKey) * CHAR_BIT + 1, sizeof(size_t) * CHAR_BIT);
2.錯誤原因分析:
std::min()的原意是找到std標準庫(C++定義的標準庫)中min的函數模板
// TEMPLATE FUNCTION mintemplate<class _Ty> inline _Post_equal_to_(_Right < _Left ? _Right : _Left) const _Ty& (min)(const _Ty& _Left, const _Ty& _Right) { // return smaller of _Left and _Right return (_DEBUG_LT(_Right, _Left) ? _Right : _Left); }
但由於全域的宏的存在,優先順序比範圍操作符::高,發生衝突,會使用min的宏定義:
#define min(a,b) (((a) < (b)) ? (a) : (b))
如果使用宏定義,那麼前面的範圍操作符::就使用錯誤了,出現以上的語法錯誤。 3.解決方案
消除歧義,將min指向std下的函數模板就可以。
第一種解決方案:給std::min加上括弧(std::min),與min宏定義區分開.
第二種解決方案(限於使用VS開發),設定項目屬性為不適用min宏定義,操作如下:
項目屬性 ——> C/C++ ——> 前置處理器 ——> 前置處理器定義 (此處添加預定義編譯開關 NOMINMAX)
http://blog.csdn.net/ben_ben_niao/article/details/45971095