2012-11-24 44 views
3

對於我允許的類型使用任何類型的墊子,我得到一個類似下面的錯誤,當我嘗試做一些分配或寫入流等它發生在MSVC++ 2010 Express編譯器,它不會發生在gnu g ++編譯器中。OpenCV的錯誤訪問CV ::墊數據

例如有缺陷的用法:

Mat M = Mat::zeros(image.size(), DataType<int>::type ); 

std::cout << M.at<int>(0,0) << std::endl; // error 

// OR 

int x = M.at<int>(0,0); // error 

兩個錯誤一起燒製:

彈出窗口

Unhandled exception at <some hex adress> in test.exe:Microsoft C++ exception: cv:xception at memory location <some hex adress> 

並在控制檯窗口

OpenCV Error: Assertion failed ... \mat.hpp, line 537 

任何建議

上?

回答

6

使矩陣數據類型爲CV_16U

.at存取函數非常細緻,需要非常精確的數據類型。一些編譯器忽略了這些問題,而另一些編譯器則很早就接受了。

而不是引用matrix.at<int>(row, col),CV_16U的元素引用unsigned short數據類型。因此,這些元素可以通過matrix.at<unsigned short>(row, col)進行訪問。

+0

我做了以下(已經和現在一次),但它不工作... Mat M = Mat :: zeros(image.size(), CV_16S); std :: cout << M.at(0,0)<< std :: endl; – Zoran

+1

沒錯,但是你把事物稱爲int而不是簡短。根據您的編譯器,它們可能會無縫地解決,而且可能不會。不要假設在你的矩陣引用 – Chris

+0

Thanx中隱式轉換。顯式投射是關鍵。儘管如此,我還沒有完全解決我的問題。如果我想要從mat分配值,該怎麼辦? M1.at (0,0)= M2.at (I,J)假設他們都是CV_32F或在當M2是CV_32S – Zoran

0

我不相信OpenCV的int數據類型的圖像。整數類型通常是CV_16s,即16位短,所以使用

+0

它在我知道的v.2.4.x中有效,但是應該正確處理鑄件。 – Zoran