Ужасная потеря данных при передаче матрицы в функцию (OpenCV 2.4.6

#c #qt #opencv #matrix

#c #qt #opencv #матрица

Вопрос:

Я боролся с ужасной проблемой, связанной с потерей данных матрицы, поскольку матрица (Mat) передается в качестве аргумента в одну из моих пользовательских функций.

Проблема застала меня врасплох, потому что она не обнаружилась при автономном запуске моего примера программы (скомпилированной с Visual Studio 2012). В случае автономного приложения данные были переданы и обработаны просто отлично. Проблема обнаружилась только тогда, когда образец приложения был скомпилирован в статическую библиотеку (.lib) и связан с основным приложением, работающим под управлением Qt 4.8.4.

Необходимый код

Основное приложение

 IMPORTED_IMAGE_bin.copyTo( FOREGR_BUFFER_CONNECTORS );
imwrite( "FOREGR_BUFFER_CONNECTORS1.png", FOREGR_BUFFER_CONNECTORS );
...
ind_Contours_Validate( IMPORTED_IMAGE, ..., FOREGR_BUFFER_CONNECTORS, ...);
  

Заголовочный файл

 void        Find_Contours_Validate(
                Mat                         IMPORTED_IMAGE,
                ...
                Mat                         amp;FOREGR_BUFFER_CONNECTORS );
  

Определение функции

 void        Find_Contours_Validate(
                Mat                         IMPORTED_IMAGE,
                ...
                Mat                         amp;FOREGR_BUFFER_CONNECTORS )
{
    ...
    imwrite( "FOREGR_BUFFER_CONNECTORS2.png", FOREGR_BUFFER_CONNECTORS );
}
  

Основные наблюдения

  1. Для большинства буферов данные передаются в функцию Find_Contours_Validate() и из нее просто отлично.
  2. FOREGR_BUFFER_CONNECTORS содержит ожидаемые данные непосредственно перед вызовом функции Find_Contours_Validate().
  3. FOREGR_BUFFER_CONNECTORS пуст сразу после вызова функции Find_Contours_Validate().
  4. ИМПОРТИРОВАННОЕ ИЗОБРАЖЕНИЕ содержит ожидаемые данные сразу после вызова функции Find_Contours_Validate().

Рассмотрены альтернативные варианты

  1. Я пробовал передавать буфер FOREGR_BUFFER_CONNECTORS как по ссылке, так и по значению:

    Mat и FOREGR_BUFFER_CONNECTORS против Mat FOREGR_BUFFER_CONNECTORS.

  2. Я попытался создать явную копию данных при вызове функции:

    Find_Contours_Validate(ИМПОРТИРОВАННОЕ ИЗОБРАЖЕНИЕ, …, FOREGR_BUFFER_CONNECTORS.clone(), …);

  3. Я пытался передать пустой буфер в функцию, но скопировать данные внутри функции:

аннулирует Find_Contours_Validate(
Mat IMPORTED_IMAGE,
Mat IMPORTED_IMAGE_bin,

Mat и FOREGR_BUFFER_CONNECTORS )
{

импортированный_имя_bin.CopyTo( FOREGR_BUFFER_CONNECTORS );
imwrite( «FOREGR_BUFFER_CONNECTORS2.png», FOREGR_BUFFER_CONNECTORS );
}

—> Наблюдение всегда одно и то же: FOREGR_BUFFER_CONNECTORS отлично отображается вне вызова функции, но как пустой внутри.

Как я уже сказал: проблема проявляется только тогда, когда я запускаю код как статическую библиотеку, связанную с интегрированным приложением (не тогда, когда я запускаю его автономно).

Есть предложения?

Комментарии:

1. I have tried passing the buffer FOREGR_BUFFER_CONNECTORS both by argument and by value: Что вы подразумеваете под передачей by argument ? В C нет такого понятия, как «передача по аргументу».

2. Как вы наблюдаете значения матрицы-нарушителя? Поскольку Mat это не что иное, как интеллектуальный указатель с подсчетом ссылок, большую часть времени нет смысла передавать его по ссылке.

3. Я хотел сказать передавать по значению или передавать по ссылке, как указано в примере инструкции: Mat FOREGR_BUFFER_CONNECTORS vs. Mat amp;FORGR_BUFFER_CONNECTORS