Всем привет! Кто-нибудь юзал книгу 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 или перемещена в какую-то отдельную библиотеку совместимости.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Необходимо удалить ключи программ, которые есть в реестре, но которые уже не существуют на жестком дискеКак решить эту проблему? Как отслеживать...
Записать содержимое входного файла как последовательность бит в другой файл
Имеется черновой код программы, которая ищет числа дающие в третьей или четвертой или пятой степени полиндромыСама программа уже написана...
Добрый день, помогите пожалуйстаРеализована вот такая простая проверка на подмену ip, но это можно обойти