Функция SiftFeatureDetector .detect не работает?

Я пробовал SIFT/SURF из онлайн-ресурсов и хотел проверить это сам.

Сначала я попробовал без несвободных библиотек, используя этот код:

int _tmain(int argc, _TCHAR* argv[])
{
Mat img = imread("c:\\car.jpg", 0);
Ptr<FeatureDetector> feature_detector = FeatureDetector::create("SIFT");
vector<KeyPoint> keypoints;

feature_detector->detect(img, keypoints);

Mat output;

drawKeypoints(img, keypoints, output, Scalar(255, 0, 0));

namedWindow("meh", CV_WINDOW_AUTOSIZE);
imshow("meh", output);
waitKey(0);



return 0;

}

Здесь, если я делаю пошаговую отладку, он ломается на feature_detector->detect(img, keypoints);

Затем я попытался использовать несвободную библиотеку и попробовал этот код:

int main(int argc, char** argv) 
{
    const Mat input = cv::imread("/tmp/image.jpg", 0); //Load as grayscale

    SiftFeatureDetector detector;
    vector<KeyPoint> keypoints;
    detector.detect(input, keypoints);

    // Add results to image and save.
    Mat output;
    drawKeypoints(input, keypoints, output);
    imwrite("/tmp/SIFT_RESULT.jpg", output);

    return 0;

 }

Это снова компилируется без ошибок, но при запуске ломается на этом шаге: detector.detect(input, keypoints);

Я не могу найти причину, почему. Может кто-нибудь, пожалуйста, помогите мне здесь.

Спасибо

редактировать: это ошибка, которую я получаю, когда она ломается:

Необработанное исключение по адресу 0x007f0900 в SIFT.exe: 0xC0000005: место чтения нарушения прав доступа 0x00000000.

.

Моя установка: Microsoft Visual C++ 2010, OpenCV 2.4.2, Windows XP. Все библиотеки добавлены и связаны


person ipunished    schedule 31.10.2012    source источник
comment
Люди с большей вероятностью помогут вам, если вы более конкретно расскажете, как это «ломается». Какую ошибку вы получаете? Выбрасывается ли утверждение? И т.п.   -  person Aurelius    schedule 31.10.2012
comment
Спасибо, подробности добавлены. Это та самая ошибка, о которой вы говорили?   -  person ipunished    schedule 31.10.2012
comment
Похоже, что изображение может быть неправильно прочитано. Убедитесь, что ваши данные изображения не NULL, прежде чем вызывать detect()   -  person Aurelius    schedule 31.10.2012
comment
Спасибо, я тоже пробовал это раньше, и я отредактировал imshow следующим образом: imshow("meh", img); и когда я его запускаю (после комментирования проблемной строки), он отображает изображение правильно. Следовательно, это читается.   -  person ipunished    schedule 31.10.2012
comment
Я думаю, что я должен также отметить, что когда я отлаживаю шаг за шагом и проверяю значение ключевых точек непосредственно перед ошибкой, у него есть два параметра; размер и емкость: оба из которых имеют значение 0   -  person ipunished    schedule 31.10.2012
comment
Пожалуйста, также включите информацию о том, какую версию OpenCV вы используете и на какой платформе вы разрабатываете. Я только что попробовал ваш верхний код на OSX Mountain Lion, используя OpenCV 2.4.2 (и, конечно, другой файл изображения), и это сработало.   -  person Aurelius    schedule 31.10.2012
comment
Спасибо, подробности добавлены в исходный пост.   -  person ipunished    schedule 31.10.2012
comment
@ Аурелиус, ты сказал, что это сработало, когда ты попробовал. не могли бы вы указать, какие библиотеки вы использовали, #include. У меня есть почти все, что связано с обнаружением функций, и все равно получаю ту же ошибку.   -  person ipunished    schedule 01.11.2012


Ответы (1)


Используйте цветное изображение, а не оттенки серого, у меня так работает.
Вы также можете попробовать пропустить "const", если цветное изображение тоже не будет работать.

const Mat input = cv::imread("/tmp/image.jpg");
person Barney Szabolcs    schedule 02.11.2012