2015-11-20 44 views
3

我只是試圖寫入給定大小的矩陣。當我運行這個程序在Valgrind的,我得到的內存錯誤,如下圖所示:爲什麼在OpenCV中訪問這個矩陣時會出現內存錯誤?

main.cpp中:

#include <iostream> 
#include <opencv2/opencv.hpp> 

int main() 
{ 
    cv::Mat m = cv::Mat::zeros(cv::Size(59, 9), CV_32SC1); 
    m.at<int>(9, 4) = 1; 
} 

編譯說明:

g++ -I/usr/local/include/opencv -I/usr/local/include/opencv2 -L/usr/local/lib/ -g -o binary main.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_stitching 

最後運行Valgrind的:

valgrind ./binary 

它在我的機器上返回此消息:

==98408== Invalid write of size 4 
==98408== at 0x1000017F8: main (main.cpp:7) 
==98408== Address 0x10dd202cc is 4 bytes after a block of size 2,152 alloc'd 
==98408== at 0x100009EAB: malloc (in /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) 
==98408== by 0x10001D1E6: cv::fastMalloc(unsigned long) (in /usr/local/Cellar/opencv/2.4.12/lib/libopencv_core.2.4.12.dylib) 
==98408== by 0x1000F4C77: cv::Mat::create(int, int const*, int) (in /usr/local/Cellar/opencv/2.4.12/lib/libopencv_core.2.4.12.dylib) 
==98408== by 0x1000F0A51: cv::MatOp_Initializer::assign(cv::MatExpr const&, cv::Mat&, int) const (in /usr/local/Cellar/opencv/2.4.12/lib/libopencv_core.2.4.12.dylib) 
==98408== by 0x1000018FB: cv::MatExpr::operator cv::Mat() const (mat.hpp:1227) 
==98408== by 0x1000017BC: main (main.cpp:6) 

這是我的機器的規格:

Apple LLVM version 7.0.0 (clang-700.1.76) 
Target: x86_64-apple-darwin15.0.0 
Thread model: posix 

homebrew/science/opencv 2.4.12 
+1

我不知道答案我只是想讚揚這樣一個很好格式化,詳細的問題。 – GPPK

+0

@GPPK謝謝。你能在Valgrind中重現相同的結果嗎? –

+1

對我來說,這似乎是OpenCV中混亂的一個非常常見的來源。有沒有任何規範的問答? – anderas

回答

2

您似乎已將矩陣的尺寸混淆了。您可以構建一個矩陣列59和9行,並進入第10行,第4列:

cv::Size(width,height); // size specification 
m.at<int>(y,x); // access 

所以列9超出範圍。交換尺寸或指數!

2

您所訪問的矩陣出界。

cv::Mat m = cv::Mat::zeros(cv::Size(59, 9), CV_32SC1); 

將創建一個9x59矩陣(9行,59列)的矩陣。你正在訪問第10行。

相關問題