Проблемы работы с Opencv на ARM Linux

Проблемы работы с Opencv на ARM Linux

Сообщение Smilegobo » 04 авг 2012, 10:25

Собрал Opencv под arm cortex-A8 Linux 2.6 версии 2.4.2 и 2.3.1. Обработку изображений делать удается, входные и выходные jpeg'и выдает, а вот работать с камерами USB, или просто читать avi файл не получается пример:
Код: Выделить всё
int main( int argc, char** argv ){
    if (argc!=2) return 1;
    CvCapture* capture = cvCaptureFromFile(argv[1]);
    if (capture==NULL){
        printf("\nerr capture video:%s\n",argv[1]);
        return -1;
    }
    IplImage *frame = 0;
    /* get fps, needed to set the delay */
    int fps = ( int )cvGetCaptureProperty( capture, CV_CAP_PROP_FPS );

    char name[20];
    int num=0;
    while(cvGrabFrame(capture)){
        frame=cvRetrieveFrame(capture);
        sprintf(name,"frame%.4d.jpg",num++);
   
        IplImage* new_frame=cvCloneImage(frame);
        cvSmooth(new_frame,new_frame,CV_MEDIAN,3,3);
        cvSaveImage(name,new_frame);
   
    }
    printf("that's all!\n");
}


На PC Linux Debain все прекрасно работает, а вот на таргете почему-то CvCapture* capture = cvCaptureFromFile(argv[1]); всегда возвращает NULL,
Сборка 2.4.2 проводилась с ffmpeg так и без него, библиотеки v4l все установленны, есть подозрение, что для захвата камеры нужен GTK, но его пока собрать не удалось. Никак кодов ошибки найти не могу... куда копать?
Smilegobo
 
Сообщения: 11
Зарегистрирован: 04 авг 2012, 10:12
programming: C++

Re: Проблемы работы с Opencv на ARM Linux

Сообщение noonv » 04 авг 2012, 11:00

а при подключении камеры устройство /dev/video0 появлется? что говорит dmesg? веб-камера поддерживает UVC?
GTK нужен только для отображения графики, а для захвата видео - нет.
попробуйте сначала работает ли mjpeg-streamer. а потом можно самостоятельно написать свою обёртку для v4l2.
Аватара пользователя
noonv
Администратор
 
Сообщения: 557
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++

Re: Проблемы работы с Opencv на ARM Linux

Сообщение Smilegobo » 04 авг 2012, 11:17

Устройство /dev/video0 появляется - с помощью gst-launch могу отображать видео на LCD, а с помощью ffmpeg могу записывать ролики, которые тестировались на приведенном примере, на хост-машине. Проблема в том что даже avi не хочет открывать...
mjpeg-streamer это что за зверь?
А написание собственной обертки позволит нормально подцепить в opencv камеры и видео потоки? Можно по подробнее как это должно выглядеть?
Smilegobo
 
Сообщения: 11
Зарегистрирован: 04 авг 2012, 10:12
programming: C++

Re: Проблемы работы с Opencv на ARM Linux

Сообщение noonv » 04 авг 2012, 11:23

хм... на счёт avi ничего подсказать не могу - скорее всего - не хватает кодеков.
захват видео OpenCV в линуксе уже идёт через v4l2, но стандартный действительно иногда почему-то глючит и я использую свою обёртку для видеозахвата.
Аватара пользователя
noonv
Администратор
 
Сообщения: 557
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++

Re: Проблемы работы с Opencv на ARM Linux

Сообщение Smilegobo » 06 авг 2012, 09:42

касательно захватов в версии 2.4.2 можно выбрать опционально такие библиотеки XINE, PvAPI, OPENEXR, FFMPEG.
В хидерах обнаружил
Код: Выделить всё
enum
{
    CV_CAP_ANY      =0,     // autodetect

    CV_CAP_MIL      =100,   // MIL proprietary drivers

    CV_CAP_VFW      =200,   // platform native
    CV_CAP_V4L      =200,
    CV_CAP_V4L2     =200,

    CV_CAP_FIREWARE =300,   // IEEE 1394 drivers
    CV_CAP_FIREWIRE =300,
    CV_CAP_IEEE1394 =300,
    CV_CAP_DC1394   =300,
    CV_CAP_CMU1394  =300,

    CV_CAP_STEREO   =400,   // TYZX proprietary drivers
    CV_CAP_TYZX     =400,
    CV_TYZX_LEFT    =400,
    CV_TYZX_RIGHT   =401,
    CV_TYZX_COLOR   =402,
    CV_TYZX_Z       =403,

    CV_CAP_QT       =500,   // QuickTime

    CV_CAP_UNICAP   =600,   // Unicap drivers

    CV_CAP_DSHOW    =700,   // DirectShow (via videoInput)

    CV_CAP_PVAPI    =800,   // PvAPI, Prosilica GigE SDK

    CV_CAP_OPENNI   =900,   // OpenNI (for Kinect)

    CV_CAP_ANDROID  =1000,  // Android
   
    CV_CAP_XIAPI    =1100   // XIMEA Camera API
};

/* start capturing frames from camera: index = camera_index + domain_offset (CV_CAP_*) */
CVAPI(CvCapture*) cvCreateCameraCapture( int index );


Получается для захвата камеры можно использовать внешние либы указав нужную константу? Я правильно понимаю?
И для чего нужен кстати ffmpeg?
Smilegobo
 
Сообщения: 11
Зарегистрирован: 04 авг 2012, 10:12
programming: C++

Re: Проблемы работы с Opencv на ARM Linux

Сообщение noonv » 06 авг 2012, 17:02

Nuzhny - Проблема открытия видеофайла в opencv:
небольшой ликбез по поводу OpenCV и работы с видео.

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

На Windows используются родные Video for Windows (vfw) и DirectShow.

Причём vfw используется, начиная с самых ранних версий OpenCV, заканчивая самой последней. Что такое vfw? Это старая технология, корнями уходящяя в Windows 3.1, а то и позже, я тогда в детский сад ходил. Декодеры для vfw сейчас почти не пишутся, вероятность проигрывания или записи файла с помощью vfw очень низка. В OpenCV для этого есть функция cvCreateFileCapture_VFW.

DirectShow использовалась в нескольких версиях OpenCV как библиотека VideoInput (см. #ifdef HAVE_VIDEOINPUT CV_CAP_DSHOW, #endif). На сегодня DirectShow является предпочтительным средством работы с видео в Windows. Декодеры и кодеры популярных видеокодеков, как правило, оформляют в виде DirectShow фильтров, плейеры используют их, всевозможные грабберы тоже. Что надо сделать, чтобы задействовать DirectShow в OpenCV? Очевидно, сконфигурировать CMake, установив HAVE_VIDEOINPUT в TRUE. Или самому в файле cvconfig.h найти и установить HAVE_VIDEOINPUT.

Теперь перейдём к ffmpeg. Это кроссплатформенная библиотека, которую можно использовать как в Windows, так и в Линуксе. В моей, последней версии OpenCV 2.3.2 ffmpeg задействуется через opencv_ffmpeg.dll. Её надо кидать в папку к своему exe. И, вроде, всё. Во всяком случае при проигрывании файла *.mp4 именно её функции использовались для декодирования видео, глубже в отладчике я не заглядывал. В предыдущих версиях OpenCV мне приходилось совершать серию шаманских действий для задействования ffmpeg.

Что ещё? А много чего!
XINE = HAVE_XINE + cvCreateFileCapture_XINE
GSTREAMER = HAVE_GSTREAMER + cvCreateCapture_GStreamer
QUICKTIME = HAVE_QUICKTIME + cvCreateFileCapture_QT
AVFOUNDATION = HAVE_AVFOUNDATION + cvCreateFileCapture_AVFoundation
И ещё можно найти, если порыскать по исходникам. То есть различные операционные системы, сторонние библиотеки, аппаратные платформы. Всё это можно найти в документации. Надо лишь установить библиотеки и сконфигурировать CMake. И проиграется практически ЛЮБОЙ файл и захватится видео практически с ЛЮБОЙ камеры.

Теперь посмотрим как оно работает в OpenCV 2.3.2 (файл cap.cpp):
Код: Выделить всё
CV_IMPL CvCapture * cvCreateFileCapture (const char * filename)
{
    CvCapture * result = 0;

    if (! result)
        result = cvCreateFileCapture_FFMPEG_proxy (filename);

    #ifdef HAVE_XINE
    if (! result)
        result = cvCreateFileCapture_XINE (filename);
    #endif

    #ifdef HAVE_GSTREAMER
    if (! result)
        result = cvCreateCapture_GStreamer (CV_CAP_GSTREAMER_FILE, filename);
    #endif

    #ifdef HAVE_QUICKTIME
    if (! result)
        result = cvCreateFileCapture_QT (filename);
    #endif
   
    #ifdef HAVE_AVFOUNDATION
    if (! result)
        result = cvCreateFileCapture_AVFoundation (filename);
    #endif
   
    if (! result)
        result = cvCreateFileCapture_Images (filename);

    return result;
}


То есть при проигрывании файла OpenCV пытается по очереди найти доступный декодер из тех, с которыми сконфигурирован CMake. Самая первая попытка - создание cvCreateFileCapture_FFMPEG_proxy. Если ffmpeg не находится, то на Windows вызывается функция cvCreateFileCapture_VFW (её на листинге нет, она находится внутри cvCreateFileCapture_FFMPEG_proxy). И дальше по очереди.

Что делать, если файл всё таки не проигрывается? Надо воспользоваться отладчиком. Зайти внутрь функции cvCreateFileCapture и посмотреть какие декодеры вообще задействованы и какие обламываются, хотя должны были бы работать. И, соответственно, посмотреть, почему они обламываются. Это не так сложно.
Например, я попытался проиграть, записанный на телефоне, файл *.mp4. ffmpeg не нашёл opencv_ffmpeg.dll, а vfw не захотел его открывать (что логично). Остальные библиотеки у меня не были задействованы. Поэтому я просто закинул opencv_ffmpeg.dll и всё заработало.
Если бы потребовалось проиграть QuickTime видео, то необходимо было бы найти в документации способ подключения QuickTime и выставить в cvconfig.h HAVE_QUICKTIME (либо сделать это в CMake - так правильней).
Аватара пользователя
noonv
Администратор
 
Сообщения: 557
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++

Re: Проблемы работы с Opencv на ARM Linux

Сообщение Smilegobo » 07 авг 2012, 14:15

спасибо за ликбез натолкнул меня на пару мыслей, пойду их проверю!
Smilegobo
 
Сообщения: 11
Зарегистрирован: 04 авг 2012, 10:12
programming: C++

Re: Проблемы работы с Opencv на ARM Linux

Сообщение Smilegobo » 08 авг 2012, 07:26

В общем результат отрицательный...
Вот я не понимаю некоторых моментов
    Почему OpenCV собирается без статических библиотек (lib*.a)
    Что дает указание использовать или не использовать прекомпилированные заголовки
    У меня собран ffmpeg библиотеки:libavformat.a (.so);libavcodec.a(.so); libavutil.a(.so);libavdevice.a(so);libavutil.a(.so).Достаточно ли их или я что-то не дособрал.
Что собирать надо с FFMPEG я указал в CMAKE, но все равно захват видео не происходит. Я попробую запустить GDB сервер, но как-то не ясно почему не используется стандартный механизм.
Smilegobo
 
Сообщения: 11
Зарегистрирован: 04 авг 2012, 10:12
programming: C++

Re: Проблемы работы с Opencv на ARM Linux

Сообщение Smilegobo » 08 авг 2012, 08:25

Покурил какой мне генерит cvconfig.h для кросссборки и для PC

Кросс:
Код: Выделить всё
/* V4L capturing support */
/* #undef HAVE_CAMV4L */

/* V4L2 capturing support */
/* #undef HAVE_CAMV4L2 */

/* V4L/V4L2 capturing support via libv4l */
/* #undef HAVE_LIBV4L */

/* Carbon windowing environment */
/* #undef HAVE_CARBON */

/* IEEE1394 capturing support */
/* #undef HAVE_DC1394 */

/* libdc1394 0.9.4 or 0.9.5 */
/* #undef HAVE_DC1394_095 */

/* IEEE1394 capturing support - libdc1394 v2.x */
/* #undef HAVE_DC1394_2 */

/* ffmpeg in Gentoo */
/* #undef HAVE_GENTOO_FFMPEG */

/* FFMpeg video library */
/* #undef HAVE_FFMPEG */

/* FFMpeg version flag */
/* #undef NEW_FFMPEG */

/* ffmpeg's libswscale */
/* #undef HAVE_FFMPEG_SWSCALE */


если я тупо задефайню в ручную она это схавает?
Smilegobo
 
Сообщения: 11
Зарегистрирован: 04 авг 2012, 10:12
programming: C++

Re: Проблемы работы с Opencv на ARM Linux

Сообщение noonv » 08 авг 2012, 09:03

угу - можно попробовать - я так поддержку Kinect прикручивал - просто добавил нужный define и пересобрал OpenCV.
Аватара пользователя
noonv
Администратор
 
Сообщения: 557
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++

Re: Проблемы работы с Opencv на ARM Linux

Сообщение Smilegobo » 08 авг 2012, 12:40

Почти победил не могу понять почему не хочет собирать
libopencv_highgui.so: undefined reference to `cvCreateCameraCapture_V4L(int)

Код: Выделить всё
/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
   systems. This function is required for `alloca.c' support on those systems.
   */
/* #undef CRAY_STACKSEG_END */

/* Define to 1 if using `alloca.c'. */
/* #undef C_ALLOCA */

/* Define to 1 if you have `alloca', as a function or macro. */
/* #undef HAVE_ALLOCA */

/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
   */
/* #undef HAVE_ALLOCA_H */

/* V4L capturing support */
#define HAVE_CAMV4L

/* V4L2 capturing support */
#define HAVE_CAMV4L2

/* V4L/V4L2 capturing support via libv4l */
#define HAVE_LIBV4L

/* Carbon windowing environment */
/* #undef HAVE_CARBON */

/* IEEE1394 capturing support */
/* #undef HAVE_DC1394 */

/* libdc1394 0.9.4 or 0.9.5 */
/* #undef HAVE_DC1394_095 */

/* IEEE1394 capturing support - libdc1394 v2.x */
/* #undef HAVE_DC1394_2 */

/* ffmpeg in Gentoo */
/* #undef HAVE_GENTOO_FFMPEG */

/* FFMpeg video library */
#define HAVE_FFMPEG

/* FFMpeg version flag */
/* #undef NEW_FFMPEG */

/* ffmpeg's libswscale */
#define HAVE_FFMPEG_SWSCALE

/* GStreamer multimedia framework */
/*#define HAVE_GSTREAMER */

/* GTK+ 2.0 Thread support */
/* #undef HAVE_GTHREAD */

/* GTK+ 2.x toolkit */
/* #undef HAVE_GTK */

/* OpenEXR codec */
/* #undef HAVE_ILMIMF */

/* Apple ImageIO Framework */
/* #undef HAVE_IMAGEIO */

/* Define to 1 if you have the <inttypes.h> header file. */
/* #undef HAVE_INTTYPES_H */

/* JPEG-2000 codec */
/* #undef HAVE_JASPER */

/* IJG JPEG codec */
#define HAVE_JPEG

/* Define to 1 if you have the `dl' library (-ldl). */
#define HAVE_LIBDL

/* Define to 1 if you have the `gomp' library (-lgomp). */
/* #undef HAVE_LIBGOMP */

/* Define to 1 if you have the `m' library (-lm). */
/*#define HAVE_LIBM*/

/* libpng/png.h needs to be included */
#define HAVE_LIBPNG_PNG_H

/* Define to 1 if you have the `pthread' library (-lpthread). */
#define HAVE_LIBPTHREAD

/* Define to 1 if you have the `lrint' function. */
/* #undef HAVE_LRINT */

/* PNG codec */
#undef HAVE_PNG

/* Define to 1 if you have the `png_get_valid' function. */
/* #undef HAVE_PNG_GET_VALID */

/* png.h needs to be included */
#define HAVE_PNG_H

/* Define to 1 if you have the `png_set_tRNS_to_alpha' function. */
/* #undef HAVE_PNG_SET_TRNS_TO_ALPHA */

/* QuickTime video libraries */
/* #undef HAVE_QUICKTIME */

/* AVFoundation video libraries */
/* #undef HAVE_AVFOUNDATION */

/* TIFF codec */
#define HAVE_TIFF

/* Unicap video capture library */
/* #undef HAVE_UNICAP */

/* Define to 1 if you have the <unistd.h> header file. */
#define  HAVE_UNISTD_H 1

/* Xine video library */
/* #undef HAVE_XINE */

/* OpenNI library */
/* #undef HAVE_OPENNI */

/* LZ77 compression/decompression library (used for PNG) */
#define HAVE_ZLIB

/* Intel Integrated Performance Primitives */
/* #undef HAVE_IPP */

/* OpenCV compiled as static or dynamic libs */
#define  BUILD_SHARED_LIBS

/* Name of package */
#define  PACKAGE "opencv"

/* Define to the address where bug reports for this package should be sent. */
#define  PACKAGE_BUGREPORT "opencvlibrary-devel@lists.sourceforge.net"

/* Define to the full name of this package. */
#define  PACKAGE_NAME "opencv"

/* Define to the full name and version of this package. */
#define  PACKAGE_STRING "opencv 2.4.2"

/* Define to the one symbol short name of this package. */
#define  PACKAGE_TARNAME "opencv"

/* Define to the version of this package. */
#define  PACKAGE_VERSION "2.4.2"

/* If using the C implementation of alloca, define if you know the
   direction of stack growth for your system; otherwise it will be
   automatically deduced at runtime.
   STACK_DIRECTION > 0 => grows toward higher addresses
   STACK_DIRECTION < 0 => grows toward lower addresses
   STACK_DIRECTION = 0 => direction of growth unknown */
/* #undef STACK_DIRECTION */

/* Version number of package */
#define  VERSION "2.4.2"

/* Define to 1 if your processor stores words with the most significant byte
   first (like Motorola and SPARC, unlike Intel and VAX). */
/* #undef WORDS_BIGENDIAN */

/* Intel Threading Building Blocks */
/* #undef HAVE_TBB */

/* Eigen Matrix & Linear Algebra Library */
/* #undef HAVE_EIGEN */

/* NVidia Cuda Runtime API*/
/* #undef HAVE_CUDA */

/* NVidia Cuda Fast Fourier Transform (FFT) API*/
/* #undef HAVE_CUFFT */

/* NVidia Cuda Basic Linear Algebra Subprograms (BLAS) API*/
/* #undef HAVE_CUBLAS */

/* Compile for 'real' NVIDIA GPU architectures */
#define CUDA_ARCH_BIN ""

/* Compile for 'virtual' NVIDIA PTX architectures */
#define CUDA_ARCH_PTX ""

/* NVIDIA GPU features are used */
#define CUDA_ARCH_FEATURES ""

/* Create PTX or BIN for 1.0 compute capability */
/* #undef CUDA_ARCH_BIN_OR_PTX_10 */

/* VideoInput library */
/*#define HAVE_VIDEOINPUT*/

/* XIMEA camera support */
/* #undef HAVE_XIMEA */

/* OpenGL support*/
/* #undef HAVE_OPENGL */
Smilegobo
 
Сообщения: 11
Зарегистрирован: 04 авг 2012, 10:12
programming: C++

Re: Проблемы работы с Opencv на ARM Linux

Сообщение noonv » 08 авг 2012, 12:43

а если убрать
Код: Выделить всё
#define HAVE_CAMV4L
?
Аватара пользователя
noonv
Администратор
 
Сообщения: 557
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++

Re: Проблемы работы с Opencv на ARM Linux

Сообщение Smilegobo » 08 авг 2012, 13:35

та же фигня, если только все отрубить, но я бы хотел что бы стандартный механизм линукс работал
Smilegobo
 
Сообщения: 11
Зарегистрирован: 04 авг 2012, 10:12
programming: C++

Re: Проблемы работы с Opencv на ARM Linux

Сообщение Smilegobo » 08 авг 2012, 15:35

Без V4L работает только с avi буду биться дальше отпишу в блоге всю процедуру полностью
Smilegobo
 
Сообщения: 11
Зарегистрирован: 04 авг 2012, 10:12
programming: C++

Re: Проблемы работы с Opencv на ARM Linux

Сообщение randomind » 16 янв 2013, 15:14

Очень интересно как удалось разобраться, ибо проблема та же...

UPD: Пересобрал OpenCV вот по этому мануальчику http://www.samontab.com/web/2012/06/ins ... 12-04-lts/
Авишки воспроизводит и вебкамера тоже работает :)
randomind
 
Сообщения: 1
Зарегистрирован: 16 янв 2013, 15:12
programming: C++

След.

Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron
© 2009-2019 |  О проекте  |  Политика Конфиденциальности  |