首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Ubuntu QtCreator OpenCV 攝像頭無法二次開啟:Qt 停止調試不觸發解構函數

     編輯:程式設計綜合問答

現象

QtCreator 中使用 OpenCV VideoCapture,第一次開啟攝像頭正常,點擊「停止調試」後再次運行報錯:libv4l2: error turning on stream: Invalid argument。雖然解構函數呼叫了 cap.release(),但資源未釋放。

根本原因

QtCreator「停止調試」按鈕會強制終止進程(SIGKILL),不會執行 C++ 解構函數,導致 VideoCapture 未釋放 /dev/video* 設備鎖定。直接點視窗關閉鍵(正常退出)則會執行解構函數,故可重複開啟。

解決方案

  1. 開發階段避免使用「停止調試」:在程式碼加入退出邏輯(如按 ESC 關閉視窗),或使用終端機運行編譯後的執行檔。
  2. 程式碼層面防禦性釋放:在開啟前先檢查並釋放:
    VideoCapture cap;
    void openCamera(int camId) {
        if (cap.isOpened()) cap.release(); // 確保釋放舊實例
        cap.open(camId);
        if (!cap.isOpened()) throw runtime_error("無法開啟攝像頭");
    }
    
  3. Qt 事件循環中處理關閉事件:
    void MainWindow::closeEvent(QCloseEvent *event) {
        if (cap.isOpened()) cap.release();
        QMainWindow::closeEvent(event);
    }
    

驗證方法

在終端機執行 lsof /dev/video0 確認進程是否仍佔用設備。若殘留,手動 kill -9 PID 後再測試。

替代方案:使用 GStreamer 後端

OpenCV 編譯時啟用 -D WITH_GSTREAMER=ON,運行時設定 cap.open("v4l2src device=/dev/video0 ! video/x-raw,format=BGR ! appsink", CAP_GSTREAMER),GStreamer 管線在進程結束時由系統自動清理,較穩健。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved