OpenCV の Web カメラ アクセスと画像表示機能を Qt のネットワーク機能 (OpenCV 2.4.2 highguiを使用した Qt 4.8.1 C++ コンソール アプリケーション) と組み合わせようとしています。現在、cv::Mat を Qt 形式に変換して、簡単にするためにカスタム Qt GUI で表示することを避けようとしています。
このために、すべての OpenCV の処理を行うラッパー クラスを作成しています (cap = new VideoCapture()、namedWindow()、cap->read()、imshow()、destroyAllWindows()、cap->release()) を制御します。 QTimerによってQThreadに移動します。これはほとんど機能しますが (まだウィンドウ タイトルの文字化け)、スレッドの親クラスがその QTCPServer からシグナルを受信しているときに、OpenCV が新しいウィンドウを作成することがあります。これにより、もはや更新されない「死んだ」画像ウィンドウが発生します。
作成の順序 (OpenCV スレッド / QTcpServer) は問題ではないようですが、クライアントが接続されていない場合、OpenCV が最初に小さなウィンドウを作成し、その結果、ビデオ イメージのサイズに合わせて拡大されることがわかります。クライアントが接続すると、ほとんどの場合、小さいウィンドウが残り (「ét」のようなウィンドウ タイトルのゴミ)、新しいウィンドウが画像データを適切に受け取ります (「、ét」のようなウィンドウ タイトルのゴミ)。
OpenCV ラッパー オブジェクトをスレッドに移動しないことも同様に機能しますが、同じ問題が発生します (さらに悪いことに、2 つのデッド ウィンドウが作成され、そのうちの 2 つ目は既にイメージ フレームを受信しています)。
このような動作を引き起こすために、一般的に何が間違っている可能性がありますか?
この問題は、QOBject ラッパー クラスの 2 つの異なるメソッド (コンストラクターとスロット) で作成され、アクセスされる名前付きウィンドウが原因である可能性があると思われます。または、QTCPServer が Qt イベント ループをブロックしていますか? または、Signal-Slot メカニズムが QTCPServer イベントによってトリガーされ、 imshowが新しいウィンドウを作成するときに、何らかの理由で OpenCV ウィンドウ ハンドルが「ガベージ コレクション」されることはありますか? ポインターでウィンドウにアクセスする明確な方法はないため、これが理由であるに違いありません。最初の namedWindow() を削除すると、小さな空のウィンドウがなくなりますが、それでも 2 つのウィンドウが作成されます。
結局、自分で画像を変換して表示する必要があるようです-または別の方法はありますか?