OpenCV 2.2 VS2010 - получите «чтение о нарушении доступа» в очень простом коде - PullRequest
4 голосов
/ 25 ноября 2011

Я только что установил OpenCV 2.2 и Visual C ++ 2010 и настроил его.Я не получаю ошибки компиляции, но при запуске этого кода я получаю эту ошибку

Unhandled exception at 0x6c2f22f2 (msvcr100.dll) in Es_CornerDetector.exe: 0xC0000005: access violation reading location 0x002a1000.

Код:

#include "opencv/highgui.h"
#include "opencv2/features2d/features2d.hpp"

int main(int argc, char** argv)
{
    cv::SurfFeatureDetector detector;
    detector.create("SURF");
}

Я действительно не понимаю, в чем может быть причина ..

Обновление:

Возможно, использование «dete.create ()» неверно, поэтому я попробовал что-то другое, но я получаю другую ошибку (всегда, когда пытаюсь получить доступ к «детектору»):

First-chance exception at 0x67608ef4 in Es_CornerDetector.exe: 0xC0000005: Access violation writing location 0x02655008.
Unhandled exception at 0x67608ef4 in Es_CornerDetector.exe: 0xC0000005: Access violation writing location 0x02655008.

Альтернативный код:

#include "opencv\cv.h"
#include "opencv\highgui.h"
#include "opencv2\features2d\features2d.hpp"
#include <vector>
#include <iostream>

int main()
{
    IplImage* img_temp = cvLoadImage("img.jpg");
    cv::Mat img(img_temp);
    if(img.empty()==1)
    {
            std::cout << "Can't load the image.." << endl;
        getchar();
        return -1;
    }

    cv::SurfFeatureDetector detector;
    vector<cv::KeyPoint> keypoints;
    detector.detect(img,keypoints);
    return 0;
}

Обновление 2

Я получаю одинаковую ошибку в 2 разных системах как с VS2010, так и с VS2008, а также при попытке запустить пример кодаdescriptor_extractor_matcher.cpp, который можно найти в .. \ OpenCV2.2 \ samples \ cpp \ descriptor_extractor_matcher.cpp

Попытка OpenCV 2.3.1 (как двоичные, так и скомпилированные):

Вау, новая экзотикаошибка:

Run-Time Check Failure #2 - Stack around the variable 'keypoints' was corrupted.

Я собираюсь сдаться ...

Ответы [ 9 ]

4 голосов
/ 13 апреля 2012

У меня была та же проблема, и я обнаружил, что каталог с двоичными файлами opencv в моем системном пути был неправильно приведен к неправильному каталогу, содержащему двоичные файлы opencv vc10 или vc9. Посмотрите, если ваша проблема что-то вроде этого. Надеюсь, это поможет.

3 голосов
/ 06 марта 2012

Необходимо убедиться, что следующие «Дополнительные зависимости» в разделе «Свойства-> Компоновщик-> Вход» относятся к правильным библиотекам OpenCV с поддержкой отладчика.

т.е.

C:\OpenCV2.2\lib\opencv_calib3d220d.lib
C:\OpenCV2.2\lib\opencv_core220d.lib
C:\OpenCV2.2\lib\opencv_features2d220d.lib
C:\OpenCV2.2\lib\opencv_highgui220d.lib
C:\OpenCV2.2\lib\opencv_imgproc220d.lib

вместо

C:\OpenCV2.2\lib\opencv_calib3d220.lib
C:\OpenCV2.2\lib\opencv_core220.lib
C:\OpenCV2.2\lib\opencv_features2d220.lib
C:\OpenCV2.2\lib\opencv_highgui220.lib
C:\OpenCV2.2\lib\opencv_imgproc220.lib
1 голос
/ 16 декабря 2014

Убедитесь, что вы включили opencv_nonfreeXXXX.lib, так же, как и другие библиотеки (например, opencv_coreXXXXd) в настройках зависимостей проекта.Затем вы ДОЛЖНЫ явно объявить эту строку кода:

initModule_nonfree ();

в вашем исходном коде перед выполнением любой операции с SURF или SIFT.Они больше не бесплатны!Потраченный впустую день, чтобы понять это

Полученное сообщение об ошибке не позволяет понять, что это потенциальная проблема.

1 голос
/ 06 апреля 2013

решение состоит в том, чтобы использовать библиотеки с суффиксом 'd', такие как "opencv_core244d.lib", для отладки и использовать обычные библиотеки, такие как "opencv_core244.lib", для выпуска.это просто работает.Удачи

1 голос
/ 26 ноября 2011

Попробуйте получить суперпак OpenCV 2.3.1 здесь . Если это все еще доставляет вам проблемы, я бы попытался скомпилировать OpenCV из исходного кода, используя CMake . Следуйте этому руководству для сборки OpenCV из исходного кода.

Помимо очевидной проблемы, связанной с тем, что DLL не находится в том же каталоге, что и исполняемый файл, похоже, что это может быть несоответствие между скомпилированной двоичной архитектурой (то есть 32-битная / VS2005 и 64-битная / VS2010) и тот, которым вы управляете.

Надеюсь, что это полезно!

РЕДАКТИРОВАТЬ: Можете ли вы попробовать скомпилировать и запустить этот код (это отлично работает на моей системе)? Убедитесь, что вы используете версию 2.3.1 для этого.

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <vector>

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
    Mat image = imread("yourimage.jpg", 0);

    Ptr<FeatureDetector> detector = FeatureDetector::create("FAST");

    vector<KeyPoint> points;
    detector->detect(image, points);

    Mat imageColor;
    cvtColor(image, imageColor, CV_GRAY2BGR);
    drawKeypoints(imageColor, points, imageColor, Scalar(255, 0, 0), DrawMatchesFlags::DRAW_OVER_OUTIMG);
    imshow("imageColor", imageColor);
    waitKey();

    return 0;
}

Можете ли вы также опубликовать ссылку на изображение, на котором вы пытаетесь запустить функцию обнаружения функции? Кроме того, как вы создаете свой проект в Visual Studio?

0 голосов
/ 05 ноября 2017

Проверьте, что .dll и d.dll, которые вы включаете, являются именно теми в ваших opencv forlder "d.dll" и ".dll", (для режима Release и Debug).Иногда мы следуем руководству и не проверяем, совпадают ли имена, которые они дают, с именами наших архивов.(Они могут использовать другую версию OpenCV, и имена будут меняться во что-то).

0 голосов
/ 26 августа 2015

Возможно, вы связываете библиотеки OpenCV с конфигурацией Visual Studio по умолчанию ( Все конфигурации ) вместо конфигурации Debug и Release отдельно.

Для изменения конфигурации выберите:

  1. Свойства проекта -> Конфигурация (Верхний левый угол) -> Выбрать Отладка
  2. Свойства проекта -> Линкер -> Ввод -> Дополнительные зависимости

Убедитесь, что вы связываете библиотеки отладки OpenCV (см. Окончательный вариант d , например opencv_calib3d220 d .lib):

C:\OpenCV_Path\lib\opencv_calib3d220d.lib
C:\OpenCV_Path\lib\opencv_core220d.lib
C:\OpenCV_Path\lib\opencv_features2d220d.lib
C:\OpenCV_Path\lib\opencv_highgui220d.lib
C:\OpenCV_Path\lib\opencv_imgproc220d.lib
  1. Свойства проекта -> Конфигурация (Верхний левый угол) -> Выбрать Отпустить
    1. Свойства проекта -> Линкер -> Ввод -> Дополнительные зависимости

Убедитесь, что вы связываете библиотеки релизов OpenCV (без окончательного d ):

C:\OpenCV_Path\lib\opencv_calib3d220.lib
C:\OpenCV_Path\lib\opencv_core220.lib
C:\OpenCV_Path\lib\opencv_features2d220.lib
C:\OpenCV_Path\lib\opencv_highgui220.lib
C:\OpenCV_Path\lib\opencv_imgproc220.lib

Надеюсь, что это полезно для вас.

0 голосов
/ 21 января 2013

Я изменил использование MFC на «MFC в общей DLL», и это устранило проблему для меня.

0 голосов
/ 25 ноября 2011

В VS посмотрите на t, чтобы увидеть, какие dll для opencv загружаются. Убедитесь, что dll - это то, что вы ожидаете.

Также вы можете использовать ProcMon, который является частью пакета SysInternals, чтобы увидеть, что загружается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...