Указатель OpenCV на обработку растровых изображений

Я создал разделяемую библиотеку для обнаружения контуров, которая загружается из приложения Delphi / Lazarus. Основное приложение передает указатель на растровое изображение, которое будет обработано функцией внутри библиотеки.

Вот функция внутри библиотеки. Параметр «img» - это указатель на мое растровое изображение.

extern "C" {

  void detect_contour(int imgWidth, int imgHeight, unsigned char * img, int &x, int &y, int &w, int &h)
  {
    Mat threshold_output;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;

    Mat src_gray;
    int thresh = 100;
        int max_thresh = 255;
    RNG rng(12345);

    /// Load source image and convert it to gray
    Mat src(imgHeight, imgWidth, CV_8UC4);
    int idx;

    src.data = img;

    /// Convert image to gray and blur it
    cvtColor( src, src_gray, CV_BGRA2GRAY );

    blur( src_gray, src_gray, Size(10,10) );

    /// Detect edges using Threshold
    threshold( src_gray, threshold_output, thresh, 255, THRESH_BINARY );
    /// Find contours
    findContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

    /// Approximate contours to polygons + get bounding rects and circles
    vector<vector<Point> > contours_poly( contours.size() );
    vector<Rect> boundRect( contours.size() );
    vector<Point2f>center( contours.size() );
    vector<float>radius( contours.size() );

    int lArea = 0;
    int lBigger = -1;

    for( int i = 0; i < contours.size(); i++ )
       { 
         approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
         boundRect[i] = boundingRect( Mat(contours_poly[i]) );
         if(lArea < boundRect[i].width * boundRect[i].height)
         {
           lArea = boundRect[i].width * boundRect[i].height;
           lBigger = i;
         }
       }

    if(lBigger > -1)
    {
       x = boundRect[lBigger].x;
       y = boundRect[lBigger].y;
       w = boundRect[lBigger].width;
       h = boundRect[lBigger].height;
    }
  }
}

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

TBGRAPixel = packed record
  blue, green, red, alpha: byte;
end; 

Мне нужно обработать растровое изображение в памяти, поэтому я не загружаю файл изнутри библиотеки.

Вопрос в том, является ли это правильным способом присвоения растрового изображения cv :: Mat?

Я спрашиваю об этом, потому что код работает без проблем в Linux, но не работает в Windows, скомпилированной с помощью Mingw.

Примечание: это не удается с SIGSEGV в этой строке:

blur( src_gray, src_gray, Size(10,10) );

EDIT: SIGSEGV возникает только в том случае, если я компилирую OpenCV в режиме Release, в режиме Debug он работает нормально.

Заранее спасибо, Леонардо.

6
задан leonardorame 5 November 2011 в 16:08
поделиться