Зеленый экран в режиме реального времени с Leopard IMX477 Camera + TX2 Developer Kit
Недавно я купил 4 камеры Leopard Imaging IMX477, 1 адаптер для нескольких камер с 6 портами и комплект разработчика TX2. LI отправил 2 .txt файла с инструкциями по установке необходимых драйверов для камер. Я выполнял каждый шаг правильно и ожидал получить живое видео с камеры IMX477, но в итоге получил зеленый экран. Согласно руководствам Leopard Imaging, есть несколько способов получить видео с камеры в режиме реального времени:
1) используя nvgstcapture-1.0, я должен был получить живой вывод. Единственное, что здесь важно, - это убедиться, что на порту J1 мультикамерного адаптера есть камера, что я и сделал. Выполнения следующей команды на терминале должно быть достаточно для получения выходного видео в реальном времени:
nvgstcapture-1.0
Но почему-то все, что я вижу, это зеленый экран.
Сообщения на терминале:
vid_rend: syncpoint wait timeout
vid_rend: syncpoint wait timeout
vid_rend: syncpoint wait timeout
vid_rend: syncpoint wait timeout
Socket read error. Camera Daemon stopped functioning.....
** Message: <main:5374> Capture completed
** Message: <main:5424> Camera application will now exit
2) использование gstreamer - еще один способ получения живого изображения. Согласно руководствам LI, выполнение следующей команды должно было сработать:
gst-launch-1.0 nvcamerasrc fpsRange="20.0 20.0" sensor-id=0 ! 'video/x-raw(memory:NVMM), width=(int)4056, height=(int)3040, format=(string)I420, framerate=(fraction)20/1' ! nvtee ! nvvidconv flip-method=2 ! 'video/x-raw, format=(string)I420' ! xvimagesink -e
Но опять же, на выходе ничего, кроме зеленого экрана.
Сообщения на терминале:
Received error from camera daemon....exiting....
Socket read error. Camera Daemon stopped functioning.....
Got EOS from element "pipeline0"
Execution ended after 0:00:16.224172704
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
3) использование argus - еще один способ сделать это. После установки программного обеспечения argus (что я и сделал) я смог получить вывод живого видео, выполнив на терминале следующую команду:
argus_camera --device=0
должен был дать вывод камеры на порт J1. Приложение Argus открывается правильно, но не может отображать изображения, когда я нажимаю кнопку "Захват".
Сообщения на терминале:
Executing Argus Sample Application (argus_camera)
Argus Version: 0.96.2 (multi-process)
(Argus) Error EndOfFile: Unexpected error in reading socket (in src/rpc/socket/client/ClientSocketManager.cpp, function recvThreadCore(), line 212)
(Argus) Error EndOfFile: Receiving thread terminated with error (in src/rpc/socket/client/ClientSocketManager.cpp, function recvThreadWrapper(), line 315)
(Argus) Error InvalidState: Receive thread is not running cannot send. (in src/rpc/socket/client/ClientSocketManager.cpp, function send(), line 94)
(Argus) Error InvalidState: (propagating from src/rpc/socket/client/SocketClientDispatch.cpp, function dispatch(), line 101)
Segmentation fault (core dumped)
4) Использование VideoCapture в OpenCV также является способом захвата изображений. Согласно руководствам Leopard Imaging, следующий код должен был сработать:
VideoCapture cap("nvcamerasrc ! video/x-raw(memory:NVMM), width=(int)1280, height=(int)720,format=(string)I420, framerate=(fraction)24/1 ! nvvidconv flip-method=2 ! video/x-raw, format=(string)BGRx ! videoconvert ! 'video/x-raw, format=(string)BGR' ! appsink");
Код компилируется, но я получаю следующую ошибку при запуске:
VIDEOIO ERROR: V4L: device nvcamerasrc ! video/x-raw(memory:NVMM), width=(int)1280, height=(int)720,format=(string)I420, framerate=(fraction)24/1 ! nvvidconv flip-method=2 ! video/x-raw, format=(string)BGRx ! videoconvert ! 'video/x-raw, format=(string)BGR' ! appsink: Unable to query the number of channels
Я посмотрел его в интернете и нашел решение, которое помогло мне с этой ошибкой. Я добавил CAP_FFMPEG во второй аргумент объекта VideoCapture и попытался отобразить изображение:
VideoCapture cap("nvcamerasrc ! video/x-raw(memory:NVMM), width=(int)1280, height=(int)720,format=(string)I420, framerate=(fraction)24/1 ! nvvidconv flip-method=2 ! video/x-raw, format=(string)BGRx ! videoconvert ! 'video/x-raw, format=(string)BGR' ! appsink", CAP_FFMPEG);
namedWindow("Test", CV_WINDOW_KEEPRATIO);
bool loop = true;
Mat image;
while(loop){
bool readImage = cap.read(image);
imshow("Test", image);
if(waitKey(10) == 27){
loop = false;
}
}
destroyAllWindows();
Но я получаю следующую ошибку (вероятно, из-за того, что захваченное изображение пустое, или изображение вообще не захвачено, или цветовое пространство как-то отличается), когда я его запускаю:
OpenCV Error: Assertion failed (size.width>0 && size.height>0) in imshow, file /home/nvidia/src/opencv-3.4.0/modules/highgui/src/window.cpp, line 331 terminate called after throwing an instance of 'cv::Exception'
what(): /home/nvidia/src/opencv-3.4.0/modules/highgui/src/window.cpp:331: error: (-215) size.width>0 && size.height>0 in function imshow
The program has unexpectedly finished
Я искал это в интернете, чтобы найти решение. Некоторые люди говорят, что камера выдает необработанные данные, и мне как-то приходится конвертировать изображение в RGB. Я попробовал некоторые методы преобразования цветового пространства с помощью функции cvtColor с разными аргументами, но они также не помогли в OpenCV.
Также должен сказать, что WiFi модуль TX2 Developer Kit перестал работать после установки драйверов камеры. Я запускаю следующую команду для просмотра списка всех установленных сетевых драйверов:
sudo lshw -C network
Обычно я тоже должен был видеть беспроводной интерфейс, но больше не вижу его после установки драйверов камеры. Я вижу только интерфейс Ethernet.
Есть ли кто-нибудь, кто сталкивался с такими же / похожими проблемами и сумел их решить, или просто дал мне несколько советов о них?