Перейти к содержимому
Compvision.ru
AuST

Thread + MinGW + OpenCV

Recommended Posts

В качестве вступления, у меня стоит Qt SDK v1.1, 4.7.2 Qt библиотека и OpenCV 2.2, две последние вещи собраны MinGW.

В чем оказался подвох, если у тебя один поток, то все работает хорошо, если же ты создаешь еще один поток, и делаешь там обработку изображений

то программа постоянно падает с криками "Segmentation fault", тобишь ругаясь на память.

А падает она на следующих функциях:

cvThreshold (так как мне нужна была простая форма, я ее написал от руки)

cvFindContours (а вот тут я и встал, сам я пока не силен написать функцию поиска контуров).

Покопавшись во великой кладези знаний, т. е. в интернете, я обнаружил, что не в основном потоке cvThreshold не работает по MinGW из-за какой-то asm команды под названием SSE...

Скажите, есть ли несложные пути обойти такие проблемы или придется пересобирать всё студийным компилятором?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Было бы неплохо код увидеть

p.s. Я заметил, что некоторые опенцвшные функции дают в кьюти GUI ошибку, к примеру cvShowImage()

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В cmakeLists.txt есть строчки:

# enable everything, since the available set of instructions is checked at runtime

set(USE_O3 ON CACHE BOOL "Enable -O3")

set(USE_FAST_MATH ON CACHE BOOL "Enable -ffast-math")

set(ENABLE_SSE ON CACHE BOOL "Enable SSE instructions")

set(ENABLE_SSE2 ON CACHE BOOL "Enable SSE2 instructions")

set(ENABLE_SSE3 OFF CACHE BOOL "Enable SSE3 instructions")

set(ENABLE_SSSE3 OFF CACHE BOOL "Enable SSSE3 instructions")

set(ENABLE_SSE41 OFF CACHE BOOL "Enable SSE4.1 instructions")

set(ENABLE_SSE42 OFF CACHE BOOL "Enable SSE4.2 instructions")

Думаю они и управляют SSE инструкциями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

2 Troyashka Код показывать нет смысла. Можете попробовать даже самый простой вариант, загрузить изображение и Threshold его в родном потоке (мэйн) и потом во дополнительном потоке. В родном будет работать, во втором нет. GUI функции я не использую.

2 Smorodov чтож, попробуем их закоментить...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Все-таки проблема не в ССЕ, есть еще идеи?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я бы посмотрел стек вызовов внутри OpenCV в момент падения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ты же в QT Creator'е работаешь? У него должна быть возможность посмотреть стек (call stack или stack browser).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Насколько я понимаю, это вот и есть стек:

post-1-0-04408000-1304359434_thumb.png

Отображается по умолчанию при отладке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если кому-то интересно, то проблема решается переносом проекта в VS. Все прекрасно заработало при использовании студийного компилятора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×