Получение BeagleBone для захвата неподвижного кадра с использованием OpenCV

У меня BeagleBone под управлением Angström Linux 3.2.28, и я пытаюсь захватить кадр с моей камеры.

Поэтому я подключаю свою USB-камеру и проверяю /dev чтобы убедиться, что он обнаруживается.

Это так, как video0 (Нижний правый). Я знаю, что это правильно, потому что он исчезает после того, как я отключил камеру.

BO

Итак, теперь я запускаю Python и запускаю следующее:

root@beaglebone:/dev# python
Python 2.7.2 (default, Sep 11 2012, 16:15:43)
[GCC 4.5.4 20120305 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv
>>> capture=cv.CaptureFromCAM(-1)
>>> img=cv.QueryFrame(capture)
>>> type(capture)
<type 'cv2.Capture'>
>>> type(img)
<type 'NoneType'>

Как видите, я могу создать объект захвата в достаточной степени, но не могу вытащить из него рамку. Я также пробовал это с другими (или нет) целочисленными аргументами для идентификатора камеры (-1 в коде выше) безрезультатно.

Для справки, запуск того же кода на моем ноутбуке в IPython выглядит следующим образом:

In [1]: import cv
In [2]: capture=cv.CaptureFromCAM(-1)
In [3]: img=cv.QueryFrame(capture)
In [4]: type(capture)
Out[4]: cv2.Capture
In [5]: type(img)
Out[5]: cv2.cv.iplimage

Вы можете видеть, что здесь я действительно делаю снимок. Я не уверен точно, куда идти отсюда.

ОБНОВИТЬ:

Я немного поэкспериментировал с FFmpeg и смог заставить камеру реагировать (т. Е. Горит свет), выполнив следующую команду:

root@beaglebone:/# ffmpeg -f video4linux2 -i /dev/video0

Что интересно, потому что, по-видимому, CaptureFromCAM использует интерфейс V4L... Я не уверен, куда идти дальше.

3 ответа

Самое первое, что вам нужно сделать, это убедиться, CaptureFromCAM() удалось:

import cv
capture = cv.CaptureFromCAM(-1)
if not capture:
    print "Unable to open device #-1"
    sys.exit(1) 

Отправка -1 как аргумент говорит OpenCV открыть устройство камеры по умолчанию. В некоторых системах это не работает, и вам нужно увеличить количество. Попробуйте пройти 0, затем 1 и позже 2,

Второе, что вам нужно сделать, это убедиться, QueryFrame() также возвращает что-то действительное:

img = cv.QueryFrame(capture)
if not img:
    print "Unable to retrieve frame from the device"
    sys.exit(1) 

Я видел странное поведение между Python API OpenCV и API C (и даже C++). Если ничего из вышеперечисленного не поможет вам решить проблему, я предлагаю вам скомпилировать программу на C (которая имеет самый надежный API) с использованием OpenCV для получения данных с камеры. В некоторых случаях OpenCV C API работает, а Python - нет.

Эта программа на C получает кадры с камеры и отображает их в окне:

#include <stdio.h>
#include <highgui.h>
#include <cv.h>

int main() 
{
CvCapture* capture = NULL;
if ((capture = cvCaptureFromCAM(-1)) == NULL)
{
    fprintf(stderr, "ERROR: capture is NULL \n"); 
    return -1;
}

cvNamedWindow("mywindow", CV_WINDOW_AUTOSIZE);

cvQueryFrame(capture); // Sometimes needed to get correct data

while (1) 
{     
    IplImage* frame = cvQueryFrame(capture); // check return
    {
        fprintf( stderr, "ERROR: cvQueryFrame failed\n");
        break;
    }

    // At this point you already have the frame! There's no need to
    // repeat the thing 10x with cvGrabFrame and cvRetrieveFrame. 
    // You are probably sabotaging yourself doing this multiple times.

    cvShowImage("mywindow", frame); // Do not release the frame!

    int key = cvWaitKey(10);
    if (key  == 0x1b)
        break;
}    

cvReleaseCapture(&capture);   
cvDestroyWindow("mywindow");   

return 0;
}

Я не уверен, может ли это быть ответом. Попробуйте следующее.

Я думаю, драйвер камеры не поддерживается. Подключите камеру к плате и введите "dmesg" в терминале, и посмотрите, не обнаружено ли в ней имя производителя камеры.

Если имя производителя отсутствует в сообщении, драйвер терминала должен быть установлен с терминала:

opkg update
opkg install kernel-module-uvcvideo
modprobe uvcvideo

Если описанные выше шаги не помогли вам, попробуйте установить медиаплеер VLC или любой другой проигрыватель, который поддерживает видеовход с камеры, и попробуйте, работает ли он.:)

  1. Попробуйте использовать любое приложение V4L2 и попробуйте протестировать камеру без использования какого-либо кода. Существует программное обеспечение Qt V4L2, с которым вы можете загрузить и протестировать камеру.
  2. Если на первом этапе произойдет сбой, возникнут проблемы с драйвером камеры, и он не поддерживается.
  3. Если первый шаг выполнен успешно, проверьте ваш код и попробуйте использовать gstreamer или любые готовые примеры захвата V4L2.

У меня возникли проблемы с распознаванием камеры, но в драйвере есть ошибки, поэтому сначала проверьте, действительно ли драйвер камеры поддерживается вашим ядром. Упоминание вашей модели камеры тоже хорошо. Что это за интерфейс, MIPI или USB? Я подозреваю, что это проблема с драйверами.

Другие вопросы по тегам