2013-08-01 59 views
3

我目前正在編寫我的第一個C++程序,並且到目前爲止,即使它不完整,我也想在處理所有編譯器錯誤後嘗試一些測試運行。我將在以下鏈接中提供大部分代碼: http://pastie.org/8196032 http://pastie.org/8196025 由於我只允許發佈2個鏈接,因此ImageComparison的標題缺失,這不是很重要,我認爲。 stdafx.h包含必需的opencv和std庫。 我跑了GDB,得到了這樣的結果:使用OpenCV的分段錯誤

Program received signal SIGSEGV, Segmentation fault. 
0x000000000040655c in cv::Mat::release()() 
(gdb) bt 
>#0 0x000000000040655c in cv::Mat::release()() 
>#1 0x0000000000406410 in cv::Mat::operator=(cv::Mat const&)() 
>#2 0x00000000004052ed in ImageComparison::LoadImages()() 
>#3 0x000000000040518e in ImageComparison::DoImCo()() 
#4 0x0000000000405019 in main() 

這並沒有給我任何線索,什麼是錯在這裏。 我很抱歉,如果我的問題只是轉儲,但我明白任何建議。

+2

你應該張貼,可以用來重現你的問題,不是所有的最短的一段代碼。 – stijn

+0

當然,但我認爲我的代碼非常簡單,易於理解,並且在大多數情況下人們會要求提供更多的代碼 – Auberotte

+0

在這裏可能不需要:LoadImages函數的第一眼我會看到char * buffer;當圖像沒有元素時,ItoS(i,buffer);'還有'images [i-1]'。其中任何一個都有可能是99.9%的罪魁禍首。這個ic C++使用std :: string。 – stijn

回答

3

在行:

vector<Mat> images; 

圖像[I-1] = imread( 「的ImageData /」 + m_object_type +「/ 「+ m_object_type +」 - 「+ buffer +」。jpeg「, 1);

您已聲明矢量images,但其大小仍未指定。因此你不能根據指數分配它的元素。相反,可以push_backMat元素:

images.push_back(imread( 「的ImageData /」 + m_object_type + 「/」 + m_object_type + 「 - 」 +緩衝液+ 「JPEG」, 1));

或者,你可以用一個尺寸的m_number_of_images初始化向量images

vector<Mat> images(m_number_of_images); 
+0

是的,兩個答案都是重要的,並幫助過,但我可以只選擇一個。感謝一個批次U 2 :) – Auberotte

+1

@Ouberotte,你也可以upvote有用的答案 –

+0

Sry,我剛剛登錄,感謝提示:> – Auberotte

2
char* buffer; 

這條線在LoadImages需要是一個實際的陣列或至少一些與new獲得性。

例如:

char buffer[100]; 
+0

但這應該是有效的指針聲明,或者我錯過了什麼?即使我在初始化期間確定它的大小並不會消除分段錯誤 – Auberotte

+0

是的,它是一個有效的指針。但是你不能寫一個指向內存中隨機地址的指針。這將seg段(如果你是幸運的)。你需要擁有指針指向的內存。參考其他答案來檢查其他錯誤。 – nvoigt

+0

是的,兩個答案都是重要的,並幫助過,但我可以只選擇一個。感謝一個很好的U 2 :) – Auberotte