Ошибка IP-камеры Opencv
Я использую приложение andriod (IP webcam) в качестве ip-камеры. я запускаю ниже код в отдельном потоке. потому что, если я запускаю в основном потоке, это приводит к сбою программы.
VideoCapture cap; Mat img; cap.open("http://192.168.0.101:8080/video?x.mjpeg"); while(waitKey(33)!=27) { try{ cap>>img; cout<<"Thread active"<<endl; if(img.empty()) { cout<<"camera Closed"<<endl; break; } imshow("Video",img); } catch(...{} }
все работает нормально. даже если я выключу камеру(закрою приложение andriod), он напечатает "камера закрыта" в консоли. Проблема возникает, когда я выключаю Wi-Fi на своем устройстве andriod. в тот момент, когда я отключаю Wi-Fi напрямую(приложение все еще работает), поток зависает, даже если он находится в блоке try catch!
у меня есть событие button_click в моей форме, и я вызываю в нем Cap.release ();. если я нажму эту кнопку, то в visual studio появится следующая ошибка (нет ошибки из opencv)
HEAP[Test.exe]: HEAP: Free Heap block 6797780 modified at 67977d4 after it was freed Windows has triggered a breakpoint in Test.exe. This may be due to a corruption of the heap, which indicates a bug in Test.exe or any of the DLLs it has loaded. This may also be due to the user pressing F12 while Test.exe has focus. The output window may have more diagnostic information.
Кто-нибудь сталкивался с этой ошибкой?
Отладчик Visual Studio останавливается в строке cap.release();
Есть ли способ преодолеть эту проблему?
Спасибо и с уважением
P. S: Я использую Visual Studio 2013 с opencv 3.0 [C++/Cli (winforms)]
Что я уже пробовал:
Авария происходит с колпачком.~VideoCapture(); в button_clickEvent. Но никакого сбоя на img. release нет();
KarstenK
Похоже, проблема заключается в извлечении данных Wi-Fi, и это убивает приложение. Я бы попробовал сторожевой поток, который проверяет жизнь вашего потока камеры и перезапускает его, когда это необходимо.
Prakash1206
Привет Карстенк
Спасибо за ваш ценный ответ, он звучит как решение этой проблемы.
не знал о сторожевом потоке, но я могу разобрать, когда поток мертв.. я использовал целое число и продолжал увеличивать его до тех пор, пока поток не был мертв (я выключил Wi-Fi)
теперь проблема в том, что если я использую thread- & gt;Abort (); [попытка перезапустить поток], он вылетает! [сообщение об ошибке такое же, как показано в вопросе]
знаете ли вы какой-нибудь другой способ преодолеть эту головную боль?
Спасибо