Всем привет! Кто-нибудь юзал книгу 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
Что за проблема такая?
Компилятор указывает на то, что не может найти реализацию функции cvSmooth().
Вообще, эта функция объявлена устаревшей. Из документации по OpenCV:
Функция является устаревшей. Используйте вместо неё GaussianBlur(), blur(), medianBlur() или bilateralFilter().
The function is now obsolete. Use GaussianBlur(), blur(), medianBlur() or bilateralFilter().
Возможно, эта функция была удалена из новых версий OpenCV или перемещена в какую-то отдельную библиотеку совместимости.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники