Я создал общую библиотеку для обнаружения контуров, которая загружается из приложения 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) );
РЕДАКТИРОВАТЬ: SIGSEGV поднимается, только если я компилирую OpenCV в режиме выпуска, в режиме отладки он работает нормально.
Заранее спасибо,
Leonardo.