Не компилируются примеры из книги Opencv C++

247
13 февраля 2018, 08:26

Всем привет! Кто-нибудь юзал книгу O'Reilly: Learning OpenCV Гари Рост Брадски и Эйдриан Калер? Я не могу понять, поему часть примеров из этой книги спокойно запускается, а часть нет. Например вот этот пример компилируется нормально:

#include<QApplication>
#include <opencv2/opencv.hpp>
using namespace cv;

int         g_slider_position   = 0;    // Позиция ползунка
CvCapture*  g_capture           = NULL; // Структура для видеофайла
// Вызывается каждый раз, когда происходит изменение положения ползунка
//
void onTrackbarSlide( int pos ) {
    // Установка свойства: положение
    //
    cvSetCaptureProperty(
         g_capture
        ,CV_CAP_PROP_POS_FRAMES
        ,pos // Номер кадра
    );
}
int main(int argc, char *argv[])
{
     QApplication app(argc, argv);
     cvNamedWindow( "TrackBar", CV_WINDOW_AUTOSIZE );    // Создание окна
     g_capture = cvCreateFileCapture( "/home/sergey/Загрузки/Bell.avi" );         // Открытие видеофайла для формирования структуры
     // Получение кол-ва кадров
     //
     int frames = (int) cvGetCaptureProperty(
          g_capture
         ,CV_CAP_PROP_FRAME_COUNT
     );
     if( 0 != frames ) {
         // Создание ползунка
         //
         cvCreateTrackbar(
              "Position"         // Имя ползунка
             ,"TrackBar"         // Окно для вывода ползунка
             ,&g_slider_position // Начальная позиция
             ,frames             // Максимальная позиция
             ,onTrackbarSlide    // Функция обработчик
         );
     }
     IplImage* frame; // Кадр
     while(1) {
         frame = cvQueryFrame( g_capture );    // Последовательное чтение кадров
         if( !frame ) {                      // Конец файла, кадров больше нет
             break;
         }
         cvShowImage( "PlayVideo", frame );  // Отображение кадра
         char c = cvWaitKey(33);             // Ожидание 33 мс, получение ASCII кода клавиши
         if( c == 27 ) {                     // Если Esc - выход из цикла
             break;
         }
     }
     cvReleaseCapture( &g_capture );   // Закрытие файла
     cvDestroyWindow( "PlayVideo" ); // Уничтожение окна
    return app.exec();
}

А вот этот нет:

#include <QCoreApplication>
#include <opencv2/opencv.hpp>
using namespace cv;
void TransformImg( IplImage* image )
{
    cvNamedWindow( "Transform-in" );    // Окно для отображения исходного изображения
    cvNamedWindow( "Transform-out" );   // Окно для преобразованного изображения
    cvShowImage( "Transform-in", image );
    // Создание контейнера для преобразованного изображения
    //
    IplImage* out = cvCreateImage(
         cvGetSize( image )
        ,IPL_DEPTH_8U
        ,3
    );
    // Сглаживание
    //
    cvSmooth( image, out, CV_GAUSSIAN, 3, 3 );
    // Отображение результата преобразования
    //
    cvShowImage( "Transform-out", out );
    // Высвобождение выделяемой памяти
    //
    cvReleaseImage( &out );
    // Ожидание нажатия клавиши для завершения программы
    //
    cvWaitKey( 0 );
    cvDestroyWindow( "Transform-out" );
    cvDestroyWindow( "Transform-in" );
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    IplImage* img = cvLoadImage("/home/sergey/Загрузки/icon.jpg"); // Получение имени изображения
    TransformImg( img );                                             // Преобразование исходного изображения
    cvReleaseImage( &img );                                          // Освобождение памяти из под изображения

    return a.exec();
}

Выдает ошибку:

:-1: ошибка: main.o: неопределённая ссылка на символ «cvSmooth»
/usr/local/lib/libopencv_imgproc.so.3.3:-1: ошибка: error adding symbols: DSO missing from command line
:-1: ошибка: collect2: error: ld returned 1 exit stat

Что за выборочная компиляция? Что-то компилируется, а что-то нет!

Хотя в файле .pro все одинаково:

QT -= gui
QT += widgets
CONFIG += c++11 console
CONFIG -= app_bundle
INCLUDEPATH += /usr/local/include/opencv
LIBS += -L/usr/local/lib -lopencv_core -lopencv_videoio -lopencv_imgcodecs -lopencv_highgui -lopencv_objdetect
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
SOURCES += main.cpp

Что за проблема такая?

Answer 1

Компилятор указывает на то, что не может найти реализацию функции cvSmooth().

Вообще, эта функция объявлена устаревшей. Из документации по OpenCV:

Функция является устаревшей. Используйте вместо неё GaussianBlur(), blur(), medianBlur() или bilateralFilter().

The function is now obsolete. Use GaussianBlur(), blur(), medianBlur() or bilateralFilter().

Возможно, эта функция была удалена из новых версий OpenCV или перемещена в какую-то отдельную библиотеку совместимости.

READ ALSO
Очистка реестра C++ WinAPI

Очистка реестра C++ WinAPI

Необходимо удалить ключи программ, которые есть в реестре, но которые уже не существуют на жестком дискеКак решить эту проблему? Как отслеживать...

209
Просмотр двоичного кода файла в c++

Просмотр двоичного кода файла в c++

Записать содержимое входного файла как последовательность бит в другой файл

257
Утечка памяти в stringstream

Утечка памяти в stringstream

Имеется черновой код программы, которая ищет числа дающие в третьей или четвертой или пятой степени полиндромыСама программа уже написана...

241
Проверка домена через DNS Google

Проверка домена через DNS Google

Добрый день, помогите пожалуйстаРеализована вот такая простая проверка на подмену ip, но это можно обойти

188