#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 );
}
Основные наблюдения
- Для большинства буферов данные передаются в функцию Find_Contours_Validate() и из нее просто отлично.
- FOREGR_BUFFER_CONNECTORS содержит ожидаемые данные непосредственно перед вызовом функции Find_Contours_Validate().
- FOREGR_BUFFER_CONNECTORS пуст сразу после вызова функции Find_Contours_Validate().
- ИМПОРТИРОВАННОЕ ИЗОБРАЖЕНИЕ содержит ожидаемые данные сразу после вызова функции Find_Contours_Validate().
Рассмотрены альтернативные варианты
- Я пробовал передавать буфер FOREGR_BUFFER_CONNECTORS как по ссылке, так и по значению:
Mat и FOREGR_BUFFER_CONNECTORS против Mat FOREGR_BUFFER_CONNECTORS.
-
Я попытался создать явную копию данных при вызове функции:
Find_Contours_Validate(ИМПОРТИРОВАННОЕ ИЗОБРАЖЕНИЕ, …, FOREGR_BUFFER_CONNECTORS.clone(), …);
-
Я пытался передать пустой буфер в функцию, но скопировать данные внутри функции:
аннулирует 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