Проблема такая, что qmake компилирует нормально, но сборка с cmake выдает ошибку, подозреваю что я не указал какую-то либу.
CMakeLists.txtcmake_minimum_required(VERSION 3.5)
cmake_minimum_required(VERSION 2.8)
project( DisplayImage )
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
set(Qt5_DIR "/home/us/qt_5.15c++/5.15.0/gcc_64/lib/cmake/Qt5")
set(Qt5Core_DIR "/home/us/qt_5.15c++/5.15.0/gcc_64/lib/cmake/Qt5Core")
set(QT_QMAKE_EXECUTABLE "/home/us/qt_5.15c++/5.15.0/gcc_64/bin/qmake")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
#if(CMAKE_VERSION VERSION_LESS "3.7.0")
# set(CMAKE_INCLUDE_CURRENT_DIR ON)
#endif()
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
# Check
doc.qt.io/qt-5/deployment-android.html for more information.
# They need to be set before the find_package(Qt5 ...) call.
#if(ANDROID)
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
# if (ANDROID_ABI STREQUAL "armeabi-v7a")
# set(ANDROID_EXTRA_LIBS
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so)
# endif()
#endif()
find_package(Qt5 COMPONENTS Widgets REQUIRED)
if(ANDROID)
add_library(untitled1 SHARED
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
else()
add_executable(untitled1
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
endif()
target_link_libraries(untitled1 PRIVATE Qt5::Widgets
${OpenCV_LIBS}
)
Код если нужен#include
#include
using namespace std;
using namespace cv;
// Объявления функций обратного вызова
void cbMouse(int event, int x, int y, int flags, void*);
void tb1_Callback(int value, void *);
void tb2_Callback(int value, void *);
void checkboxCallBack(int state, void *);
void radioboxCallBack(int state, void *id);
void pushbuttonCallBack(int, void *font);
// Глобальные определения и переменные
Mat orig_img, tmp_img;
const char main_win[]="main_win";
char msg[50]="";
int main() {
const char track1[]="TrackBar 1";
const char track2[]="TrackBar 2";
const char checkbox[]="Check Box";
const char radiobox1[]="Radio Box1";
const char radiobox2[]="Radio Box2";
const char pushbutton[]="Push Button";
int tb1_value = 50; // Начальное значение полосы прокрутки 1
int tb2_value = 25; // Начальное значение полосы прокрутки 2
orig_img = imread("/home/us/Рабочий стол/ccc/tut1/1.png"); // Открываем и читаем изображение
if (orig_img.empty()) {
cout << "Ошибка!!! Не удалось загрузить изображение..." << endl;
return -1;
}
namedWindow(main_win); // Создаем главное окно
//// Создаем шрифт для добавления текста поверх изображения
QtFont font = fontQt("Arial", 20, Scalar(255,0,0,0),
QT_FONT_BLACK, QT_STYLE_NORMAL);
// Задаем функции обратного вызова
setMouseCallback(main_win, cbMouse, NULL);
createTrackbar(track1, main_win, &tb1_value, 100, tb1_Callback);
createButton(checkbox, checkboxCallBack, 0, QT_CHECKBOX);
//// Передаем значение (шрифт) функции обратного вызова
createButton(pushbutton, pushbuttonCallBack,
(void *)&font, QT_PUSH_BUTTON);
createTrackbar(track2, "win", &tb2_value,
50, tb2_Callback);
// Передаем значения функциям обратного вызова
createButton(radiobox1, radioboxCallBack,
(void *)radiobox1, QT_RADIOBOX);
createButton(radiobox2, radioboxCallBack,
(void *)radiobox2, QT_RADIOBOX);
imshow(main_win, orig_img); // показываем исходное изображение
cout << "Для выхода нажмите любую клавишу..." << endl;
waitKey(); // Бесконечный цикл обработки событий
return 0;
}
void tb1_Callback(int value, void *) {
sprintf(msg, "Полоса прокрутки 1 изменилась. Новое значение=%d", value);
displayOverlay(main_win, msg);
return;
}
void tb2_Callback(int value, void *) {
sprintf(msg, "Полоса прокрутки 2 изменилась. Новое значение=%d", value);
displayStatusBar(main_win, msg, 1000);
return;
}
void cbMouse(int event, int x, int y, int flags, void*) {
// В статических переменных хранятся значения между вызовами
static Point p1, p2;
static bool p2set = false;
// Нажата левая кнопка мыши
if (event == EVENT_LBUTTONDOWN) {
p1 = Point(x, y); // Точка, в которой произошло событие
p2set = false;
} else if (event == EVENT_MOUSEMOVE &&
flags == EVENT_FLAG_LBUTTON) {
// Перемещение мыши с нажатой левой кнопкой
// Проверяем выход за границы
if (x > orig_img.size().width)
x = orig_img.size().width;
else if (x < 0)
x = 0;
// Проверяем выход за границы
if (y > orig_img.size().height)
y = orig_img.size().height;
else if (y < 0)
y = 0;
p2 = Point(x, y); // Устанавливаем конечную точку
p2set = true;
// Копируем исходное изображение во временное
orig_img.copyTo(tmp_img);
// Рисуем прямоугольник
rectangle(tmp_img, p1, p2, Scalar(0, 0 ,255));
// Показываем временное изображение с прямоугольником
imshow(main_win, tmp_img);
} else if (event == EVENT_LBUTTONUP && p2set) {
// Левая кнопка отпущена в области окна
// Подмассив исходного изображения с выбранным прямоугольником
Mat submat = orig_img(Rect(p1, p2));
// Здесь должен быть код обработки подматрицы
//...
// Отмечаем границы выбранного прямоугольника
rectangle(orig_img, p1, p2, Scalar(0, 0, 255), 2);
imshow("main_win", orig_img);
}
return;
}
void checkboxCallBack(int state, void *) {
sprintf(msg, "Флажок изменился. Новое состояние=%d", state);
displayStatusBar(main_win, msg);
return;
}
void radioboxCallBack(int state, void *id) {
// Ид переключателя передается функции обратного вызова
sprintf(msg, "%s изменился. Новое состояние=%d",
(char *)id, state);
displayStatusBar(main_win, msg);
return;
}
void pushbuttonCallBack(int, void *font) {
// Добавить текст поверх изображения
addText(orig_img, "Нажата кнопка",
Point(50,50), *((QtFont *)font));
imshow(main_win, orig_img); // Показываем исходное изображение
return;
}