Последнее обновление:
August 9, 2018

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

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 :

125

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

Обновил для OpenCV 3.1

А началось всё с того что не работает CvCapture* capture = cvCreateFileCapture( filename );

capture возрашает ноль. Сука. Т.е. OpenCV отказывается воспроизводить mp4 видео.

У меня основной путь будет такой  cd /home/pavelk/Projects/OpenCV

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

sudo apt-get update
sudo apt-get 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-get install libgstreamer0.10-0 libgstreamer0.10-dev gstreamer0.10-tools gstreamer0.10-plugins-base libgstreamer-plugins-base0.10-dev gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-plugins-bad gstreamer0.10-ffmpeg

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

git clone git://git.videolan.org/x264.git
cd x264
./configure --enable-shared --enable-pic
make
sudo make install
cd ..

git clone git://git.videolan.org/ffmpeg.git 
cd ffmpeg

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

Чёто жопой чую половину тут нафиг не надо… Пофиг пляшем.

make
sudo make install
cd ..
sudo apt-get install libgtk2.0-0 libgtk2.0-dev
sudo apt-get install libjpeg62 libjpeg62-dev

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

git clone https://github.com/Itseez/opencv.git OpenCV
cd OpenCV
mkdir build
cd build
export PATH=/opt/Qt/5.6/gcc_64/bin:$PATH
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/opencv/ -DWITH_QT=ON
make -j5
make install

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

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

в параметры cmake добавить:

-DOPENCV_EXTRA_MODULES_PATH=<opencv_contrib>/modules

Если какой-либо модуль при сборке будет ебать мозг, то к cmake дописать -DBUILD_opencv_modulename=OFF

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

Простенький пример:

В *.pro файл проекта добавляем:

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

Здесь мы подключаем все библиотеки OpenCV

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;
}

Всё должно получиться =)

 

Views :

3338