2013-08-01 2 views
3

В настоящее время я пишу свою первую программу на C++, и до сих пор, даже если она не завершена, я хотел попробовать несколько тестовых прогонов после рассмотрения всех ошибок компилятора. Я предоставлю большую часть кода в следующих ссылках: http://pastie.org/8196032 http://pastie.org/8196025 Поскольку мне просто разрешено публиковать 2 ссылки, заголовок для ImageComparison отсутствует, что не очень важно, я думаю. stdafx.h включает необходимые opencv и std libs. Я побежал 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 *; 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_back новые Mat элементы:

images.push_back (imread ("ImageData /" + m_object_type + "/" + m_object_type + "-" + буфер + "JPEG", 1));

Или вы можете инициализировать вектор images с размером m_number_of_images:

vector<Mat> images(m_number_of_images); 
+0

YEAH, ОБОИХ ОТВЕТЫ БЫЛИ ВАЖНЫ И ПОМОЧИНЫ, НО Я МОГУ ТОЛЬКО ОСТАНОВИТЬСЯ.THANKS A LOT U 2 :) – Auberotte

+1

@Auberotte, вы также можете использовать полезные ответы –

+0

Sry, я только что вошел, спасибо за подсказку:> – Auberotte

2
char* buffer; 

Эта линия в LoadImages должен быть фактический массив или по крайней мере что-то Изучается с new.

Например:

char buffer[100]; 
+0

, но это должно быть допустимо для объявления указателя, или я что-то пропустил? и даже если я определяю его размер во время инициализации, он не убивает ошибку сегментации. – Auberotte

+0

Да, это действительный указатель. Но вы не можете писать указателю, который просто указывает на случайный адрес в памяти. Это будет segfault (если вам повезет). Вам нужно иметь память, на которую указывает указатель. Обратитесь к другому ответу, чтобы проверить другие ошибки. – nvoigt

+0

YEAH, ОБА ОТВЕТЫ БЫЛИ ВАЖНЫ И ПОМОЧИНЫ, НО Я МОГУ ТОЛЬКО ОСТАНОВИТЬСЯ. СПАСИБО LOT U 2 :) – Auberotte

Смежные вопросы