QT + OpenCV
От: zverjuga Беларусь  
Дата: 08.10.19 23:23
Оценка:
приветствую знатоков
есть кот

Mat m1 = Mat(100, 100, CV_32FC1);
randu(m1, 0, 1e6); // случайное значение от 0 до 1e6


компилятор выдает ошибку
undefined reference to `cv::randu(cv::_InputOutputArray const&, cv::_InputArray const&, cv::_InputArray const&)


если посмотреть определение функции randu, то оно такое
CV_EXPORTS_W void randu(InputOutputArray dst, InputArray low, InputArray high);


если посмотреть класс _InputOutputArray, то там есть такие конструктор
_InputOutputArray(Mat& m);


если посмотреть класс _InputArray, то там есть такой конструктор
_InputArray(const double& val);


то есть кот (в самом верху) является верным и должен компилироваться. но так как он не компилируется, то я так подозреваю, что установлены неправильные настройки компилятора. я попытался включить компилятор 17
QMAKE_CXXFLAGS += -std=c++17


но это не помогло.
есть какие идеи, что можно сделать?
проклятый антисутенерский закон
Отредактировано 08.10.2019 23:25 zverjuga . Предыдущая версия . Еще …
Отредактировано 08.10.2019 23:24 zverjuga . Предыдущая версия .
Re: QT + OpenCV
От: velkin Удмуртия http://blogs.rsdn.org/effective/
Дата: 09.10.19 01:31
Оценка: 8 (2)
Здравствуйте, zverjuga, Вы писали:

Z>компилятор выдает ошибку

Z>
Z>undefined reference to `cv::randu(cv::_InputOutputArray const&, cv::_InputArray const&, cv::_InputArray const&)
Z>

Z>есть какие идеи, что можно сделать?

В нормальном GNU/Linux, если у тебя установлен пакет разработчика для opencv, то добавить в файл проекта *.pro ссылку на библиотеку в которой находится cv::randu.
LIBS += -lopencv_core

И так для каждой библиотеки, плюс если используется собственная сборка, то ещё добавить пути.
# library opencv
INCLUDEPATH += -I"/usr/local/include/opencv"
LIBS += -L"/usr/local/lib" -lopencv_core -lopencv_imgproc -lopencv_highgui

Имена остальных библиотек найти не сложно. В винде аналогично.
Re: QT + OpenCV
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 09.10.19 06:54
Оценка:
Здравствуйте, zverjuga, Вы писали:

Z>есть какие идеи, что можно сделать?


velkin уже всё написал. Вдогонку порекомендую использовать CMake, с ним проще. Благо сами qt'шники уже отказались от дальнейшей поддержки как qmake, так и qbs.
Re[2]: QT + OpenCV
От: zverjuga Беларусь  
Дата: 09.10.19 09:04
Оценка:
Здравствуйте, velkin, Вы писали:

V>В нормальном GNU/Linux, если у тебя установлен пакет разработчика для opencv, то добавить в файл проекта *.pro ссылку на библиотеку в которой находится cv::randu.


все библиотеки откомпилированы и установлены

.pro файл
TARGET = opencvtest
TEMPLATE = app
CONFIG += console
#CONFIG += c++17
CONFIG -= app_bundle

#QMAKE_CXXFLAGS_DEBUG += -Z -MD
#QMAKE_CXXFLAGS_RELEASE += -MT
#QMAKE_CXXFLAGS += -std=c++17

SOURCES += \
        main.cpp

INCLUDEPATH += e:/opencv/build/
INCLUDEPATH += e:/opencv/sources/include/

INCLUDEPATH += e:/opencv/sources/modules/core/include/
INCLUDEPATH += e:/opencv/sources/modules/imgcodecs/include/
INCLUDEPATH += e:/opencv/sources/modules/highgui/include/
INCLUDEPATH += e:/opencv/sources/modules/calib3d/include/
INCLUDEPATH += e:/opencv/sources/modules/features2d/include/
INCLUDEPATH += e:/opencv/sources/modules/flann/include/
INCLUDEPATH += e:/opencv/sources/modules/dnn/include/
INCLUDEPATH += e:/opencv/sources/modules/videoio/include/
INCLUDEPATH += e:/opencv/sources/modules/imgproc/include/
INCLUDEPATH += e:/opencv/sources/modules/ml/include/
INCLUDEPATH += e:/opencv/sources/modules/objdetect/include/
INCLUDEPATH += e:/opencv/sources/modules/photo/include/
INCLUDEPATH += e:/opencv/sources/modules/shape/include/
INCLUDEPATH += e:/opencv/sources/modules/stitching/include/
INCLUDEPATH += e:/opencv/sources/modules/superres/include/
INCLUDEPATH += e:/opencv/sources/modules/video/include/
INCLUDEPATH += e:/opencv/sources/modules/videostab/include/

LIBS += -LE:/opencv/build/lib/Debug/ \
         -lopencv_core411d \
         -lopencv_imgcodecs411d \
         -lopencv_highgui411d \
         -lopencv_imgproc411d


и сдается мне, что это не ошибка линкера, а ошибка компилятора
проклятый антисутенерский закон
Re[2]: QT + OpenCV
От: zverjuga Беларусь  
Дата: 09.10.19 09:07
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>velkin уже всё написал. Вдогонку порекомендую использовать CMake, с ним проще. Благо сами qt'шники уже отказались от дальнейшей поддержки как qmake, так и qbs.


CMake использовался для того, чтобы отконфигурировать исходники OpencCV. дальше библиотеки компилировались при помощи Visual Studio 2019.
меня вот один момент смущает, что QT Creator используетя конфигурацию WinGW x86, а студия компилируетс своим компилятором. может это как то влияет?
проклятый антисутенерский закон
Re[3]: QT + OpenCV
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 09.10.19 09:12
Оценка: 4 (1) +1
Здравствуйте, zverjuga, Вы писали:

Z>CMake использовался для того, чтобы отконфигурировать исходники OpencCV. дальше библиотеки компилировались при помощи Visual Studio 2019.

Z>меня вот один момент смущает, что QT Creator используетя конфигурацию WinGW x86, а студия компилируетс своим компилятором. может это как то влияет?

Влияет, но вряд ли на эту ошибку. Вообще, надо собирать одним компилятором, потому что тут C++ API, ошибки легко могут полезть в процессе работы.
Мой совет остаётся прежним: выкидывай qmake и pro, используй CMake и собирай всё одним компилятором.
Re[3]: QT + OpenCV
От: velkin Удмуртия http://blogs.rsdn.org/effective/
Дата: 09.10.19 14:38
Оценка: 4 (1)
Здравствуйте, zverjuga, Вы писали:

Z>Здравствуйте, velkin, Вы писали:


V>>В нормальном GNU/Linux, если у тебя установлен пакет разработчика для opencv, то добавить в файл проекта *.pro ссылку на библиотеку в которой находится cv::randu.

Z>все библиотеки откомпилированы и установлены

Мне вот это не нравится.

Z>.pro файл

Z>INCLUDEPATH += e:/opencv/build/
Z>INCLUDEPATH += e:/opencv/sources/include/
Z>INCLUDEPATH += e:/opencv/sources/modules/core/include/
Z>...
Z>INCLUDEPATH += e:/opencv/sources/modules/videostab/include/


Что у тебя ссылка на source. Не знаю как там всё это в винде скомпилировалось, потому могу только делать предположения, но в первую очередь посмотрел бы внутрь папки build и поискал там include. Когда-то давным давно во времена ещё второй версии opencv в *.cpp после изменения *.pro файла делал вот такие включения не пытаясь сокращать путь до *.hpp:
#include <opencv2/imgproc/imgproc.hpp>

У тебя винда, версия opencv уже 4.11, надо заново всё смотреть, чтобы сказать что-то точно. Просто по мне как-то некрасиво ссылаться на source, когда уже всё собрано, как-то это всё подозрительно.

Но проблема у тебя undefined reference, то есть ссылка не определена, не найдена.

Z>LIBS += -LE:/opencv/build/lib/Debug/ \

Z> -lopencv_core411d \
Z> -lopencv_imgcodecs411d \
Z> -lopencv_highgui411d \
Z> -lopencv_imgproc411d
Z>[/ccode]
Z>и сдается мне, что это не ошибка линкера, а ошибка компилятора

Или вот такие определения -lopencv_core411d, то есть файл называется как-то так opencv_core411d.dll? Для MinGW наверное что-то вроде opencv_core411d.so. Получается opencv_core411d, а не opencv_core или opencv_cored. Лично я такие проблемы решаю методом научного тыка.

Z>CMake использовался для того, чтобы отконфигурировать исходники OpencCV. дальше библиотеки компилировались при помощи Visual Studio 2019.

Z>меня вот один момент смущает, что QT Creator используетя конфигурацию WinGW x86, а студия компилируетс своим компилятором. может это как то влияет?

MinGW. И вот это зря, в Qt и OpenCV или используй MinGW, или компилятор в Visual Studio. MinGW пытались сделать совместимым, но они же имеют дело с Microsoft, результат непредсказуем, ведь Microsoft то на других плевать, им наоборот хорошо, чтобы ничего не работало.

Потому или бери:
1) Visual Studio вроде у них там насколько помню раньше был nmake и Qt и OpenCV.
или
2) QtCreator с MinGW x86 и Qt и OpenCV.

IDE в отличие от компиляторов, конечно, можно менять, но я бы не рекомендовал. А так уже "сто лет" в винде ничего не делал, но начальных этапах лучше остановись на второй связке QtCreator с MinGW x86, то есть даже лучше в начале избежать MinGW x64, а то там тоже непонятно, что в итоге будет.

1) Возмёшь MinGW, который привязан к QtCreator, посмотришь внутри настроек QtCreator.
2) Потом настроишь компиляцию OpenCV на этот самый MinGW, насколько помню OpenCV использует CMake и скомпилируешь.
3) А дальше попробуешь подключиться к OpenCV ещё раз.

Могу ещё дать такой совет если нужно всего лишь провести опыты, не создавать папку build внутри папки с исходинками opencv, а компилировать прямо в opencv. В итоге билд загрязнит папку с исходниками, но зато с некоторыми библиотеками не обязательно opencv, тот же qt для примера, проще потом работать. Но с другой стороны может даже лучше к такому не привыкать и делать всё сразу нормально.

А вообще советую поставить GNU/Linux, тот же Debian в дуалбут (мультибут). Даже если не ставить библиотеку из репозиториев, возни с компиляцией меньше, чем в винде. У тебя будет один набор компиляторов GCC, в винде они тебе известны как MinGW. Просто есть такое мнение, что Windows для казуалов пользователей, а GNU/Linux для красноглазых пользователей. Но когда дело касается программирования, то как раз GNU/Linux для казуальных программистов, а Windows для красноглазых программистов.

Но по идее у тебя должно получится скомпилировать и подключить библиотеки в винде, главное на начальных этапах не распыляйся на компиляторы и внимательней смотри на результат.
Re[4]: QT + OpenCV
От: zverjuga Беларусь  
Дата: 09.10.19 16:28
Оценка:
Здравствуйте, velkin, Вы писали:

V>Мне вот это не нравится.


Z>>.pro файл

Z>>INCLUDEPATH += e:/opencv/build/
V>Z>INCLUDEPATH += e:/opencv/sources/include/
Z>>INCLUDEPATH += e:/opencv/sources/modules/core/include/
Z>>...
Z>>INCLUDEPATH += e:/opencv/sources/modules/videostab/include/


V>Что у тебя ссылка на source. Не знаю как там всё это в винде скомпилировалось, потому могу только делать предположения, но в первую очередь посмотрел бы внутрь папки build и поискал там include. Когда-то давным давно во времена ещё второй версии opencv в *.cpp после изменения *.pro файла делал вот такие включения не пытаясь сокращать путь до *.hpp:


на самом деле это артефакты. сначала я пробовал с версией opencv 4.x, там достаточно одного include, потом скачал версию 3.x, там уже пришлось прописывать все пути, вот они и остались. причина не в них, так как в версии 3.x там как то разбросано по разным местам, пришлось вручную прописывать пути. потом вернулся к версии 4.x, а старые пути не удалил.

V>Или вот такие определения -lopencv_core411d, то есть файл называется как-то так opencv_core411d.dll? Для MinGW наверное что-то вроде opencv_core411d.so. Получается opencv_core411d, а не opencv_core или opencv_cored. Лично я такие проблемы решаю методом научного тыка.


я использую статическу. линковку. для винды это opencv_core411d.lib. такие имена сгенерировал компилятор вижуал студии. а проект для вижуал студии сгенерировать CMake. я уже не стал менять ничего на данном этапе, мне пока что главное запустить, чтобы не было ошибок. потом возможно подредактирую.

V>MinGW. И вот это зря, в Qt и OpenCV или используй MinGW, или компилятор в Visual Studio. MinGW пытались сделать совместимым, но они же имеют дело с Microsoft, результат непредсказуем, ведь Microsoft то на других плевать, им наоборот хорошо, чтобы ничего не работало.


V>Потому или бери:

V>1) Visual Studio вроде у них там насколько помню раньше был nmake и Qt и OpenCV.
V>или
V>2) QtCreator с MinGW x86 и Qt и OpenCV.

когда конфигурировал исходники opencv при помощи CMake, то в качестве компилятора выбрал компилятор студии. пытался отконфигурировать при помощи MinGW, но полезли ошибки, в которых я не стал разбираться. а потом оказалось, что QT Creator почему то не может использовать конфигурацию, в которой используется компилятор студии. а вот конфигурацию с MinGW — пожалуйста. так что да, вероятно проблема тут и зарылась, буду пытаться исправить, чтобы использовать одинаковый компилятор и в студии и в QT. по идее, можно даже и не заморачиваться, можно писать проект в вижуал студии, а не в qt creator. если решение проблемы затянется надолго, то вероятно я так и сделаю.

V>2) Потом настроишь компиляцию OpenCV на этот самый MinGW, насколько помню OpenCV использует CMake и скомпилируешь.


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

V>А вообще советую поставить GNU/Linux, тот же Debian в дуалбут (мультибут). Даже если не ставить библиотеку из репозиториев, возни с компиляцией меньше, чем в винде. У тебя будет один набор компиляторов GCC, в винде они тебе известны как MinGW. Просто есть такое мнение, что Windows для казуалов пользователей, а GNU/Linux для красноглазых пользователей. Но когда дело касается программирования, то как раз GNU/Linux для казуальных программистов, а Windows для красноглазых программистов.


в данном случае я с этим согласен
проклятый антисутенерский закон
Re[5]: QT + OpenCV
От: velkin Удмуртия http://blogs.rsdn.org/effective/
Дата: 09.10.19 17:00
Оценка:
Здравствуйте, zverjuga, Вы писали:

Z>QT Creator почему то не может использовать конфигурацию, в которой используется компилятор студии. а вот конфигурацию с MinGW — пожалуйста.


В QtCreator нужно вручную создать конфигурацию, то есть прописать nmake и прочее, по крайне мере это то что помню со старых времён. Когда-то собирал Qt в винде используя компиляторы более старой Visual Studio, так же собирал статически и проводил прочие опыты. Та же тема Как собрать Qt 4.8 статически? (2012.02.06)
Автор: velkin
Дата: 16.02.12
, правда тут речь о mingw. Но потом мне лень стало разбираться, смысл компилировать компиляторами Microsoft, когда можно везде использовать GCC (MinGW), тем более в GNU/Linux никакой Visual Studio у меня всё равно нет, а вот QtCreator везде. И плюс GNU/Linux ещё разбаловали, сделали меня казуалом ожидающим, что всё устанавливается и конфигурируется с одной кнопки. А по поводу ошибок в CMake используй CMake GUI на этапе конфигурации, по мне там их проще устранить. Конечно, если хочется запустить всё с помощью компиляторов Microsoft, то это тоже возможно, причём можно использовать как Visual Studio, так и QtCreator, по крайне мере раньше это работало.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.