Обнаружена ошибка сегментации в простом коде OpenCV - PullRequest
0 голосов
/ 03 марта 2020

Инструменты

  • Платформа: 64-битная Windows
  • Цепочка компилятора: mingw с Qt
  • Система создания: CMake
  • Библиотеки : C ++ 11, OpenCV 4, Qt 5

Проблема (обновлена)

Следующий простой сегмент программы должен скомпилировать и отобразить сгенерированное изображение в OpenCV. Однако это всегда SIGSEGV только в режиме отладки (обратная трассировка в конце). Тем не менее, он прекрасно работает в режиме RELEASE.

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;

void testOPENCV()
{
   cv::Mat output(480, 640, CV_8UC3, cv::Scalar(255,0,100));
   cv::namedWindow( "Test", cv::WINDOW_AUTOSIZE );
   cv::imshow("Test",output);
   cv::waitKey(0);
}

int main(int argc, char** argv)
{
   testOPENCV();
   return 0;
}

У меня есть сценарий CMake, который создает только необходимые модули OpenCV и связывает их с зависимостями. Соответствующая часть:

build_external_project(opencv "https://github.com/opencv/opencv.git" "4.2.0" "-DCMAKE_INSTALL_PREFIX=${THIRDPARTY_INSTALLFOLDER} - DCMAKE_BUILD_TYPE=${THIRDPARTY_BUILDTYPE} -DBUILD_LIST=core,imgproc,imgcodecs,highgui")

target_link_libraries(OpenVideo ${OpenCV_LIBS})

Двоичный файл может быть запущен без отсутствующих ошибок DLL. Зависимость ходока также указывает на то же самое.

Вот обратный след:

Stack trace

Ответы [ 4 ]

1 голос
/ 08 марта 2020

Несколько вещей, чтобы проверить здесь.

Во-первых, откуда берется библиотека OpenCV? Это скомпилировано для вашего процессора? Похоже, это разбилось в инструкциях AVX. Может быть, процессор их не поддерживает.

Во-вторых, совсем не очевидно, что случилось со мной с .png файлами. Тот же segfault во время выполнения. Оказалось, что OpenCV был собран без поддержки png. Пожалуйста, проверьте, построен ли ваш OpenCV с -DWITH_JPEG=ON.

0 голосов
/ 10 марта 2020

Добавление к ответу karlphillips: Deubg и Release ведут себя совершенно иначе на Windows, чем на Linux (из-за выбора времени выполнения).

Особенно, если вы ссылаетесь на библиотеки релизов на Windows, но ваши библиотеки или исполняемый файл встраиваются в отладку. Если они используют разные среды выполнения, вы, скорее всего, столкнетесь с проблемами и ошибками. Поэтому проверьте флаги обоих проектов (типичные виновники - это флаги типа многопоточности (отладки), присутствующие на одном, но не на другом).

0 голосов
/ 09 марта 2020

Учитывая, что OpenCV отлично работает в режиме Release, я предлагаю пересобрать версию библиотеки Debug.

Предыдущий ответ :

Есть несколько потенциальных проблем с вашим кодом:

  • Использование Qt в этом примере не требуется и добавляет сложность, которая вам не нужна прямо сейчас. Удалите его из проекта и его библиотек по инструкции ссылки в скрипте CMake. Позже, вы можете вернуть его назад, чтобы узнать, вызвало ли оно крэ sh. Прямо сейчас вам нужно точно определить, есть ли проблема в OpenCV или Qt.
  • Изображение может быть отображено в окне, только если вызвано cv::waitKey();
  • Разделитель каталогов в Windows обычно \\, а не /;

Это полный исходный код для тестирования вашей сборки OpenCV:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

int main()
{
   std::string file_name("C:\\Images\\1.jpg");
   cv::Mat original_image = cv::imread(file_name, cv::IMREAD_COLOR);
   if (original_image.empty())
   {
       std::cout << "!!! image not found" << std::endl;
       return -1;
   }

   cv::imshow( "Display window", original_image ); 
   cv::waitKey(0);

   return 0;
}
0 голосов
/ 06 марта 2020

https://docs.opencv.org/2.4/doc/tutorials/introduction/display_image/display_image.html

Вы забыли создать окно

namedWindow( "Display window", WINDOW_AUTOSIZE );// Create a window for display.
...