Получение BeagleBone для захвата неподвижного кадра с использованием OpenCV
У меня BeagleBone под управлением Angström Linux 3.2.28, и я пытаюсь захватить кадр с моей камеры.
Поэтому я подключаю свою USB-камеру и проверяю /dev
чтобы убедиться, что он обнаруживается.
Это так, как video0
(Нижний правый). Я знаю, что это правильно, потому что он исчезает после того, как я отключил камеру.
Итак, теперь я запускаю 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 или любой другой проигрыватель, который поддерживает видеовход с камеры, и попробуйте, работает ли он.:)
- Попробуйте использовать любое приложение V4L2 и попробуйте протестировать камеру без использования какого-либо кода. Существует программное обеспечение Qt V4L2, с которым вы можете загрузить и протестировать камеру.
- Если на первом этапе произойдет сбой, возникнут проблемы с драйвером камеры, и он не поддерживается.
- Если первый шаг выполнен успешно, проверьте ваш код и попробуйте использовать gstreamer или любые готовые примеры захвата V4L2.
У меня возникли проблемы с распознаванием камеры, но в драйвере есть ошибки, поэтому сначала проверьте, действительно ли драйвер камеры поддерживается вашим ядром. Упоминание вашей модели камеры тоже хорошо. Что это за интерфейс, MIPI или USB? Я подозреваю, что это проблема с драйверами.