Последнее обновление:
October 19, 2020

Есть мысль... Жми, напиши!
Что имеем: Постов : 141 Авторов: 1 Категорий: 22

AVFrame(AVPicture) конвертация в OpenCV::Mat

Понадобилось тут мне сконвертировать  AVFrame в Mat для дальнейших издевательст с помощью OpenCV, загуглил я это дело, и нашёл кучу способов.

Вот один из них:

void AVFrameToMat(const AVFrame * frame, Mat& image)
{
    int width = frame->width;
    int height = frame->height;
    image = Mat(height, width, CV_8UC3);
    int cvLinesizes[1];
    cvLinesizes[0] = image.step1();
    SwsContext* conversion = sws_getContext(width, height, (AVPixelFormat) frame->format, width, height, PIX_FMT_BGR24, SWS_FAST_BILINEAR, NULL, NULL, NULL);
    sws_scale(conversion, frame->data, frame->linesize, 0, height, &image.data, cvLinesizes);
    sws_freeContext(conversion);
}

Мне одному кажется, что столько преобразований излишни?  Ведь OpenCV напрямую позволяет работать со всеми форматами и можно сделать преобразование напрямую! 

В моём случае я работаю с форматом видео YUV420P.

if ( m_picture->format == AV_PIX_FMT_YUV420P ) {
    int numBytes=avpicture_get_size(AV_PIX_FMT_YUV420P, m_picture->width, m_picture->height);        
    uint8_t * buffer = reinterpret_cast<uint8_t *>(av_malloc(numBytes));
    avpicture_layout( ( AVPicture*)m_picture, AV_PIX_FMT_YUV420P, m_picture->width, m_picture->height, buffer, numBytes); //av_image_copy_to_buffer() в новом API


    Mat yuv = Mat(m_picture->height+m_picture->height/2, m_picture->width, CV_8UC1, buffer );
    Mat gray = Mat(m_picture->height, m_picture->width, CV_8UC1, buffer ); //-- Если нужно получить сразу в градациях серого (формат YUV содержит в первом канале как раз в градациях серого кадр)

    Mat rgb = Mat(m_picture->height, m_picture->width, CV_8UC3);
    cvtColor(yuv, rgb, CV_YUV420p2RGB);

    imshow("RGB", rgb);
    imshow("GRAY", gray);
}

ВАЖНО: Не забудьте очистить память из под buffer, так как после удаления Mat она не очищается самостоятельно!

В вашем случае замените форматы на те, с которыми работаете.

Вот как-то так…

 

 

Views :

439

Конвертация QVideoFrame to OpenCV Mat в Qt5.6 и OpenCV3.1

Потребовалось на днях обрабатывать кадры с камеры (Использовалась QCamera) через OpenCV.

Да,  OpenCV может сам захватывать фреймы, но в случае с Qt QCamera работает лучше и есть больше параметров (например выбо р формата YUV или MJPG).

Вот так выглядит конвертация:

QVideoFrame copy(frame);
if (frame.isValid() && copy.map(QAbstractVideoBuffer::ReadOnly)) {
    Mat frameYUV=Mat(copy.height() + copy.height()/2, copy.width(), CV_8UC1, (void*)copy.bits() );
    
    Mat frameRGB;
    cvtColor(frameYUV, frameRGB, CV_YUV2BGRA_I420);

    imshow("Video", frameRGB);
}

C камеры приходит QVideoFrame frame в формате YUV.

Вот и всё =)

 

 

Views :

430

OpenCV warpPerspective, warpAffine без обрезки (whole image) и размер результата (destination result image size)

В общем потребовалось восстановить перспективу картинки,
на примере этой:

sheet

Как обычно — нашли 4 точки на картинке, в данном случае — углы листа, по часовой стрелке, начиная с верхнего левого:

[20, 340]
[860,110]
[1160, 650]
[200, 950]

Хотим, что бы лист располагался прямо, а для этого мы знаем, что ширина и высота листа 870 на 620 пикселей, аналогично координаты по часовой стрелке, начиная с верхнего левого:

[0, 0]
[870, 0]
[870, 620]
[0, 620]

в данном случае левый верхний угол располагается в нуле (где ещё то), а правый нижний строго по горизонтали и вертикали (мы ведь хотим расположить прямо)

ладно, пора покодить (доки нам в помощь):

/*
* Пока что всё как обычно
* открываем картинку,
* задаём найденные и целевые точки,
*/
Mat input;
input = imread("/home/pavelk/Projects/OpenCVwrapPerspective/sheet.jpg");

Point2f inputQuad[4];
inputQuad[0] = Point2f( 20, 340 );
inputQuad[1] = Point2f( 860,110 );
inputQuad[2] = Point2f( 1160, 650 );
inputQuad[3] = Point2f( 200, 950 );

Point2f outputQuad[4];
outputQuad[0] = Point2f( 0, 0 );
outputQuad[1] = Point2f( 870, 0 );
outputQuad[2] = Point2f( 870, 620 );
outputQuad[3] = Point2f( 0, 620 );

/*
* Находим матрицу трансформации
*/
Mat M = getPerspectiveTransform( inputQuad, outputQuad );

/*
* Теперь применяем трансформацию на картинке с помощью warpPerspective
*/

Mat output;
warpPerspective(input, output, M, Size(2000, 2000));

Но тут сталкиваемся с первой засадой — нужно задать итоговый размер, а его мы до трансформации не знаем =(   Ну ладно, попробуем пока что подгадать.

Посмотрим на вывод:

output1

Как видим, перспективу то мы исправили,
но что если нам так же нужна вся плоскость картинки, а не только сам лист (например потому, что точки  мы можем найти только с помощью этого объекта, а нам нужен абсолютно другой)?
Да и с определением итогового размера можно не угадать, а заранее задавать слишком большой — тормоза для последующих обработок.

Почему так происходит?

Потому, что когда мы задали целевую точку верхнего левого угла [0, 0], то при трансформации получается (см. формулу warpPerspective), что нужно взять позицию с отрицательными координатами с картинки оригинала, а откуда на ней взяться отрицательному-то значению…  Вот и получается обрезка.  Можно, конечно, заранее подгадать смещение целевых точек, что бы не было отрицательных позиций, но мы не знаем, как может повернуться исходная картинка, да и проблему с размером результата мы не решим да и вообще гадать — не мой метод.

Что будем делать?

Как следует из написанного выше — нам нужно сместить целевые точки, поэтому будем выяснять насколько их смещать, а для этого нам нужно выяснить, где окажется левый верхний угол после трансформации. Но! Не забываем, что исходная картинка может быть как угодно повёрнута, и левый нижний окажется дальше в минусе, чем верхний левый. Поэтому выясняем положение после трансформации всех четырёх углов исходной картинки, а что бы не геммороиться с определением где какой угол — найдём их ограничительную рамку, благо для этого в OpenCV есть метод boundingRect и сместим целевые точки в обратную сторону от её позиции, а бонусом по её размеру мы знаем размер итоговой картинки=)

Покодим:

/**
* Выясняем положение углов исходной картинке,
* по ширине и высоте
*/
vector<Point2f> inputCorners(4);
inputCorners[0]=Point2f(0, 0);
inputCorners[1]=Point2f(input.cols, 0);
inputCorners[2]=Point2f(0, input.rows);
inputCorners[3]=Point2f(input.cols, input.rows);

/*
* Выясняем, где они будут - применяем трансформацию
*/
vector<Point2f> outputCorners(4);
perspectiveTransform(inputCorners, outputCorners, M);

/*
* Находим ограничительную рамку
*/
Rect br= boundingRect(outputCorners);

/*
* Сдвигаем все целевые точки в противоположное направление, 
* от того, куда ушла ограничительная рамка
*/
for(int i=0; i<4; i++) {
   outputQuad[i]+=Point2f(-br.x,-br.y);
}

/*
* Ну и заново вычисляем матрицу трансформацию
* с новыми целевыми точками
*/
 M = getPerspectiveTransform( inputQuad, outputQuad );

/*
* Применяем трансформацию к картинке
* размер - как ограничительная рамка
*/
warpPerspective(input, output, M, br.size());

/*
* Ну и показываем итоговую картинку
*/
imshow("Output2", output);
output2

Посмотрим на результат:

По-моему, получилось идеально? =)

Ок, полный листинг на Qt 5.6 console application:

#include <QApplication>
#include <QDebug>
#include <iostream>

#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>

using namespace std;
using namespace cv;


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
 
    Mat input = imread("/home/pavelk/Projects/OpenCVwrapPerspective/sheet.jpg");

    Point2f inputQuad[4];
    inputQuad[0] = Point2f( 20, 340 );
    inputQuad[1] = Point2f( 860,110 );
    inputQuad[2] = Point2f( 1160, 650 );
    inputQuad[3] = Point2f( 200, 950 );

    Point2f outputQuad[4];
    outputQuad[0] = Point2f( 0, 0 );
    outputQuad[1] = Point2f( 870, 0 );
    outputQuad[2] = Point2f( 870, 620 );
    outputQuad[3] = Point2f( 0, 620 );

    Mat M = getPerspectiveTransform( inputQuad, outputQuad );

    vector<Point2f> inputCorners(4);
    inputCorners[0]=Point2f(0, 0);
    inputCorners[1]=Point2f(input.cols, 0);
    inputCorners[2]=Point2f(0, input.rows);
    inputCorners[3]=Point2f(input.cols, input.rows);

    vector<Point2f> outputCorners(4);
    perspectiveTransform(inputCorners, outputCorners, M);

    Rect br= boundingRect(outputCorners);

    for(int i=0; i<4; i++) {
        outputQuad[i]+=Point2f(-br.x,-br.y);
    }

    M = getPerspectiveTransform( inputQuad, outputQuad );

    warpPerspective(input, output, M, br.size());

    resize(input, input, Size(1000,1000));
    imshow("Input", input);
    resize(output, output, Size(1000,1000));
    imshow("Output2", output);

    waitKey(5000);

    return app.exec();
}

Вот как-то так =)

Views :

3084

OpenCV захват видео с камеры в Qt

Надеюсь, компиляция прошла успешно =)

Обновил под OpenCV 4.1

Создаём новый консольный проект, в .pro файле дописываем:

INCLUDEPATH += "/usr/local/opencv/3.1/include/"
LIBS += -L"/usr/local/opencv/3.1/lib/"
LIBS += -lopencv_core \
        -lopencv_features2d \
        -lopencv_highgui \
        -lopencv_imgcodecs \
        -lopencv_imgproc \
        -lopencv_video \
        -lopencv_videoio \
        -lopencv_videostab

Теперь основное main.cpp:

#include <QApplication>
#include <QDebug>

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    qDebug()<<"Hello world";

    //-- Выбираем первую попавшуюся камеру
    VideoCapture cap(0);

    //-- Проверяем, удалось ли подключиться
    if (!cap.isOpened()) {
        qDebug()<<"Camera not opened!";
        return 0;
    }

    //-- Выставляем параметры камеры ширину и высоту кадра в пикселях
    cap.set(CAP_PROP_FRAME_WIDTH, 1280);
    cap.set(CAP_PROP_FRAME_HEIGHT, 960);

    Mat frame;

    while (true) {
        cap >> frame; //-- захватываем очередной кадр

        imshow("Video", frame); //-- показываем его

        char c = waitKey(33); //-- если была нажата клавиша, узнаём её код

        if (c==27) { //-- нажата ESC, прерываем цикл
            break;
        }

    }


    return app.exec();
}

Впринципе, ничего сложного.

Views :

6459

Правильный способ конвертирования cv::Mat в QImage

Некогда рассказывать почему так, но это реально работает =)

QImage Camera::mat2Qimg(const Mat &src) {
    cv::Mat temp;
    cvtColor(src, temp,CV_BGR2RGB);
    QImage dest((uchar*) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
    QImage dest2(dest);
    dest2.detach();
    return dest2;
}
Views :

1221

Компиляция OpenCV 4.1.0 в Windows для Qt 5.10

How-to по компиляции.

Проверено с OpenCV 4.1.0 и Qt 5.10 (только пути на свои замените).

Для начала, нам понадобиться:

  • OpenCV
  • CMake (Должен быть 32х битным, да же если система 64!)

Для удобства, основной путь у меня такой: E:\Projects\OpenCV  и в дальнейшем я отталкиваюсь именно от этой папки (В неё же и ставите OpenCV после скачивания).

Открываем консольку.

Должно скомпилироваться без проблем.

cd E:\Projects\OpenCV\opencv\build
set PATH=D:\Qt\5.10\mingw53_32\bin\;%PATH%
set PATH=D:\Qt\Tools\mingw530_32\bin\;%PATH%
cmake ../sources -G "MinGW Makefiles"  -DWITH_QT=ON -DWITH_QT_OPENGL=ON -DBUILD_EXAMLES=ON -DQT_QTCORE_LIBRARY_DEBUG="Qt5Cored.dll" -DQT_QTCORE_LIBRARY_RELEASE="Qt5Core.dll" -DQT_QMAKE_EXECUTABLE="qmake.exe" -DCMAKE_BUILD_TYPE=Release
mingw32-make -j4
mingw32-make install
Если нужны ещё и nonfree модули (например для SURF), то:
«git clone https://github.com/opencv/opencv_contrib ../opencv_contrib»
и к cmake добавить параметр: «-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules» и «-DOPENCV_ENABLE_NONFREE:BOOL=ON»
Если какой-то из модулей начнёт ебать мозг, то его можно отключить дополнительным параметром к cmake: «-DBUILD_opencv_modulename=OFF»
Мне пришлось отключить:
-DWITH_OPENCL_D3D11_NV=OFF
Так как мне он не нужен вовсе и были какие-то проблемы (заголовочников не было, скорее всего).
j4 — количество ядер в проце, чтобы быстрее компилилось.
После изменения параметров cmake необходимо из директории удалить файл CMakeCache.txt
MinGW необходимо использовать тот, который или идёт с Qt или тем, которым эти исходники уже компилировали!
Соответственно нужно заменить все пути на свои. И в выводе CMake убедитесь, что используется от Qt.
UPDT: OpenCV 3.0
Если во время сборки mingw32-make ругнётся на отсутствие -lRunTmChk  то cmake нужно перезапустить с флагом «-DWITH_IPP=OFF»
Если будет ругаться » error: base class ‘s
truct IUnknown’ has accessible non-virtual destructor [-Werror=non-virtual-dtor]»
то идём в папку с opencv d:\projects\opencv\sources\cmake\ открываем OpenCVCompilerOptions.cmake
ищем строку add_extra_compiler_option(-Werror=non-virtual-dtor) и ставим перед ней «#»
перезапускаем cmake.
Если будет ругаться «windres.exe: unknown option —W» то выполните заново cmake с дополнительным параметром «-DENABLE_PRECOMPILED_HEADERS=OFF»
Если будут проблемы на шаге videoio, например «sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA» и похожие, то в файле «\sources\modules\videoio\src\cap_dshow.hpp» добавьте в самом начале «#define NO_DSHOW_STRSAFE«

На этом установка закончена =)

Теперь попробуем тестовый проектик сделать.

Создаём новый консольный проект.

В  .pro файл дописываем:

INCLUDEPATH += E:/Projects/OpenCV/opencv/build/install/include/
LIBS +=-L"E:/Projects/OpenCV/opencv/build/install/x86/mingw/lib/"
LIBS +=  \
-lopencv_core410 \
-lopencv_highgui410 \
-lopencv_imgproc410 \
-lopencv_photo410 \
-lopencv_imgcodecs410

В main.cpp пишем:

#include <iostream>;
#include <opencv2/opencv.hpp>;
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
int main() {
   namedWindow("My Image");
   Mat image = imread("K:/Projects/OpenCV HelloWorld/img.jpg");

   imshow("My Image", image);
   waitKey(5000);

    return 0;
}
Чуть не забыл, в системную переменную PATH добавьте путь: «E:/Projects/OpenCV/opencv/build/install/x86/mingw/bin»,
E:/Projects/OpenCV/opencv/build/install/x86/mingw/bin;%path%»
иначе проект не соберётся и ребутнуть комп, или в Qt в настройках проекта — переменных окружения добавить.
Если переходите с предыдущей версии OpenCV, то в 4.0 много изменений (ну, к примеру, наименование констант CV_BGR2GRAY теперь COLOR_BGR2GRAY), в общем документация тут: https://docs.opencv.org/

Надеюсь, всё прошло удачно =) На этом, пока что, всё.

Views :

17613

Компиляция и установка OpenCV на Ubuntu для Qt 5.6 c поддержкой ffmpeg, gstreamer

Обновил для Qt 5.14, OpenCV 4.1 и Ubuntu 18.04

Ставим нужные пакеты:

sudo apt update 

sudo apt install build-essential checkinstall git cmake libfaac-dev libjack-jackd2-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libva-dev libvdpau-dev libvorbis-dev libx11-dev libxfixes-dev libxvidcore-dev texi2html yasm zlib1g-dev 

sudo apt install libgstreamer1.0-0 libgstreamer1.0-dev gstreamer1.0-tools gstreamer1.0-plugins-base libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-plugins-bad  gstreamer1.0-libav

sudo apt install libgtkglext1 libgtkglext1-dev

Добавим x264 и ffmpeg по вкусу:

sudo apt install nasm
git clone https://code.videolan.org/videolan/x264
cd x264
./configure --enable-shared --enable-pic
make
sudo make install
cd ..
sudo apt-get install libgtk2.0-0 libgtk2.0-dev
sudo apt-get install libjpeg62 libjpeg62-dev libjpeg9 libjpeg9-dev 

git clone https://github.com/FFmpeg/FFmpeg
cd FFmpeg

./configure --enable-gpl --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-nonfree --enable-postproc --enable-version3 --enable-shared

make
sudo make install
cd ..

Ну и теперь клонируем наш OpenCV, настраиваем:

git clone https://github.com/Itseez/opencv.git OpenCV
cd OpenCV
mkdir build
cd build
export PATH=/home/pavelk/Qt5.14.0/5.14.0/gcc_64/bin:$PATH
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/opencv/ -DWITH_OPENGL=ON -DWITH_QT=ON

В PATH только путь на свой замените.

Выхлоп должен быть примерно таким
— Detected processor: x86_64
— Looking for ccache — not found
— Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.so (found suitable version «1.2.11», minimum required is «1.2.3»)
— Could NOT find TIFF (missing: TIFF_LIBRARY TIFF_INCLUDE_DIR)
— Could NOT find Jasper (missing: JASPER_LIBRARIES JASPER_INCLUDE_DIR)
— Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.so (found version «1.2.11»)
— found Intel IPP (ICV version): 2019.0.0 [2019.0.0 Gold] — at: /home/pavelk/OpenCV/build/3rdparty/ippicv/ippicv_lnx/icv
— found Intel IPP Integration Wrappers sources: 2019.0.0
— at: /home/pavelk/OpenCV/build/3rdparty/ippicv/ippicv_lnx/iw
— Could not find OpenBLAS include. Turning OpenBLAS_FOUND off
— Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off
— Could NOT find Atlas (missing: Atlas_CBLAS_INCLUDE_DIR Atlas_CLAPACK_INCLUDE_DIR Atlas_CBLAS_LIBRARY Atlas_BLAS_LIBRARY Atlas_LAPACK_LIBRARY)
— A library with BLAS API not found. Please specify library location.
— LAPACK requires BLAS
— A library with LAPACK API not found. Please specify library location.
— Could NOT find JNI (missing: JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH)
— VTK is not found. Please set -DVTK_DIR in CMake to VTK build directory, or to VTK install subdirectory with VTKConfig.cmake file
— OpenCV Python: during development append to PYTHONPATH: /home/pavelk/OpenCV/build/python_loader
— Checking for module ‘libavresample’
— No package ‘libavresample’ found
— Checking for module ‘libdc1394-2’
— No package ‘libdc1394-2’ found
— Caffe: NO
— Protobuf: NO
— Glog: NO
— freetype2: YES (ver 21.0.15)
— harfbuzz: YES (ver 1.7.2)
— Could NOT find HDF5 (missing: HDF5_LIBRARIES HDF5_INCLUDE_DIRS) (found version «»)
— Module opencv_ovis disabled because OGRE3D was not found
— No preference for use of exported gflags CMake configuration set, and no hints for include/library directories provided. Defaulting to preferring an installed/exported gflags CMake configuration if available.
— Failed to find installed gflags CMake configuration, searching for gflags build directories exported with CMake.
— Failed to find gflags — Failed to find an installed/exported CMake configuration for gflags, will perform search for installed gflags components.
— Failed to find gflags — Could not find gflags include directory, set GFLAGS_INCLUDE_DIR to directory containing gflags/gflags.h
— Failed to find glog — Could not find glog include directory, set GLOG_INCLUDE_DIR to directory containing glog/logging.h
— Module opencv_sfm disabled because the following dependencies are not found: Eigen Glog/Gflags
— Checking for module ‘tesseract’
— No package ‘tesseract’ found
— Tesseract: NO
— Registering hook ‘INIT_MODULE_SOURCES_opencv_dnn’: /home/pavelk/OpenCV/modules/dnn/cmake/hooks/INIT_MODULE_SOURCES_opencv_dnn.cmake
— opencv_dnn: filter out cuda4dnn source code

— General configuration for OpenCV 4.2.0-dev =====================================
— Version control: 4.2.0-32-gf6ec467f19

— Extra modules:
— Location (extra): /home/pavelk/OpenCV/opencv_contrib/modules
— Version control (extra): 4.2.0-4-g648db235

— Platform:
— Timestamp: 2020-01-03T13:12:12Z
— Host: Linux 5.0.0-37-generic x86_64
— CMake: 3.10.2
— CMake generator: Unix Makefiles
— CMake build tool: /usr/bin/make
— Configuration: Release

— CPU/HW features:
— Baseline: SSE SSE2 SSE3
— requested: SSE3
— Dispatched code generation: SSE4_1 SSE4_2 FP16 AVX AVX2 AVX512_SKX
— requested: SSE4_1 SSE4_2 AVX FP16 AVX2 AVX512_SKX
— SSE4_1 (16 files): + SSSE3 SSE4_1
— SSE4_2 (2 files): + SSSE3 SSE4_1 POPCNT SSE4_2
— FP16 (1 files): + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 AVX
— AVX (5 files): + SSSE3 SSE4_1 POPCNT SSE4_2 AVX
— AVX2 (29 files): + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2
— AVX512_SKX (6 files): + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2 AVX_512F AVX512_COMMON AVX512_SKX

— C/C++:
— Built as dynamic libs?: YES
— C++ Compiler: /usr/bin/c++ (ver 7.4.0)
— C++ flags (Release): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG -DNDEBUG
— C++ flags (Debug): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -g -O0 -DDEBUG -D_DEBUG
— C Compiler: /usr/bin/cc
— C flags (Release): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -msse -msse2 -msse3 -fvisibility=hidden -O3 -DNDEBUG -DNDEBUG
— C flags (Debug): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -msse -msse2 -msse3 -fvisibility=hidden -g -O0 -DDEBUG -D_DEBUG
— Linker flags (Release): -Wl,—gc-sections
— Linker flags (Debug): -Wl,—gc-sections
— ccache: NO
— Precompiled headers: NO
— Extra dependencies: dl m pthread rt /usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libGLU.so
— 3rdparty dependencies:

— OpenCV modules:
— To be built: aruco bgsegm bioinspired calib3d ccalib core cvv datasets dnn dnn_objdetect dnn_superres dpm face features2d flann freetype fuzzy gapi hfs highgui img_hash imgcodecs imgproc line_descriptor ml objdetect optflow phase_unwrapping photo plot quality rapid reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking ts video videoio videostab xfeatures2d ximgproc xobjdetect xphoto
— Disabled: world
— Disabled by dependency: —
— Unavailable: cnn_3dobj cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev hdf java js matlab ovis python2 python3 sfm viz
— Applications: tests perf_tests apps
— Documentation: NO
— Non-free algorithms: NO

— GUI:
— QT: YES (ver 5.14.0)
— QT OpenGL support: YES (Qt5::OpenGL 5.14.0)
— GTK+: NO
— OpenGL support: YES (/usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libGLU.so)
— VTK support: NO

— Media I/O:
— ZLib: /usr/lib/x86_64-linux-gnu/libz.so (ver 1.2.11)
— JPEG: /usr/lib/x86_64-linux-gnu/libjpeg.so (ver 90)
— WEBP: build (ver encoder: 0x020e)
— PNG: /usr/lib/x86_64-linux-gnu/libpng.so (ver 1.6.34)
— TIFF: build (ver 42 — 4.0.10)
— JPEG 2000: build (ver 1.900.1)
— OpenEXR: build (ver 2.3.0)
— HDR: YES
— SUNRASTER: YES
— PXM: YES
— PFM: YES

— Video I/O:
— DC1394: NO
— FFMPEG: YES
— avcodec: YES (58.65.102)
— avformat: YES (58.35.101)
— avutil: YES (56.38.100)
— swscale: YES (5.6.100)
— avresample: NO
— GStreamer: YES (1.14.5)
— v4l/v4l2: YES (linux/videodev2.h)

— Parallel framework: pthreads

— Trace: YES (with Intel ITT)

— Other third-party libraries:
— Intel IPP: 2019.0.0 Gold [2019.0.0] — at: /home/pavelk/OpenCV/build/3rdparty/ippicv/ippicv_lnx/icv
— Intel IPP IW: sources (2019.0.0)
— at: /home/pavelk/OpenCV/build/3rdparty/ippicv/ippicv_lnx/iw
— Lapack: NO
— Eigen: NO
— Custom HAL: NO
— Protobuf: build (3.5.1)

— OpenCL: YES (no extra features)
— Include path: /home/pavelk/OpenCV/3rdparty/include/opencl/1.2
— Link libraries: Dynamic load

— Python (for build): /usr/bin/python2.7

— Java:
— ant: NO
— JNI: NO
— Java wrappers: NO
— Java tests: NO

— Install to: /usr/local/opencv
— ——————————————————————

— Configuring done
— Generating done
— Build files have been written to: /home/pavelk/OpenCV/build

наконец-то собираем и ставим:

make -j5
make install
Кстати, «-j5» отвечает за количество потоков сборки, можете увеличить, если больше есть.

Если нужны дополнительные модули, например xfeatures2d для работы со SURF, то нужно их скачать отдельно

cd OpenCV
git clone https://github.com/opencv/opencv_contrib

и в параметры компиляции у cmake добавить:

-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules
-DOPENCV_ENABLE_NONFREE:BOOL=ON
Если какой-либо модуль при сборке будет ебать мозг, то к cmake дописать -DBUILD_opencv_modulename=OFF

Все библиотеки будут в папке /usr/local/opencv/

Простенький пример для Qt Creator: Создаём консольное приложение, в *.pro файл проекта добавляем:

QT += widgets
INCLUDEPATH +="/usr/local/opencv/include/opencv4" 
LIBS += -L"/usr/local/opencv/lib/" 
LIBS += \
   -lopencv_core \ 
   -lopencv_features2d \ 
   -lopencv_highgui \ 
   -lopencv_imgcodecs \ 
   -lopencv_imgproc \ 
   -lopencv_video \ 
   -lopencv_videoio \ 
   -lopencv_videostab
#include <QApplication>

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    namedWindow("TestVideo", WINDOW_AUTOSIZE);

    VideoCapture cap("/home/pavelk/bumpy.mp4");

    if ( !cap.isOpened() ) {
        cout << "Cannot open the video file."<<endl;
        return -1;
    }

    while( true ) {
        Mat frame;

        if (!cap.read(frame)) {
            cout<<"Cannot read the video file."<<endl;
            break;
        }

        imshow("TestVideo", frame);

        if( waitKey(30)==27 ) { break; }
    }

    return a.exec();
}

Вот как-то так…

Views :

3896