Я делаю очень простую программу, которая печатает видео AR.Drone во время полета на моем компьютере.
Он работает хорошо в течение нескольких секунд, а затем случайным образом прерывает работу программы, потому что кадр пуст. Я решил проверить это, но теперь, когда кадр пуст, все последующие кадры тоже пусты.
Вот мой простой код:
int main(void)
{
cv::VideoCapture cap;
cv::Mat image;
if (!cap.open("tcp://192.168.1.1:5555"))
{
printf("AR.Drone ERROR CONNECT\n");
return -1;
}
takeoff();
while (42)
{
cap >> image;
if (!image.empty())
{
cv::imshow("AR.Drone", image);
std::cout << "OK" << std::endl;
}
else
std::cout << "ERROR" << std::endl;
cv::waitKey(1);
}
return 0;
}
Мой вывод:
>OK
>OK
>[...]
>OK
>ERR
>ERR
>ERR
Но это должно быть:
>OK
>OK
>[...]
>OK
>ERR // okay you got an error ? ...
>OK // ... I give you a new frame :)
>OK
Почему это терпит неудачу навсегда?
Если я не защищаю его, я получаю сообщение об ошибке «Ошибка OpenCV: Bad flag», и оно прерывается.
Соединение на AR.Drone — TCP, поэтому я не могу замедлить waitKey …
Любая идея?
У меня возникла такая же проблема, когда я хотел получить стабильный видеопоток с AR.Drone 2.0
Это заняло некоторое время, но я понял, что кадр отсутствует, потому что дрон считает соединение потерянным через 2 секунды без AT-команды. Поэтому, если вы открываете поток и больше ничего не делаете, это нормально (поток будет хорошим), но после отправки любой AT-команды через 2 секунды дрон отключится. Поэтому все, что вам нужно сделать, чтобы отправить, например, команду зависания дрону, если никакая другая команда не отправила, чтобы сохранить соединение живым.