2017-06-15 42 views
1

私は2つのカメラを持っています(OpenNIを使用して、ドライバAPIの同じインスタンスによって処理されるカメラごとに2つのストリームがあります)それぞれ独立したカメラから、すなわち、ドライバAPIの1つのインスタンスのために、cam_handlerを言って、私は、二つの流れdepthとカメラごとrgbを持っている。ここcam_handler.RGB1_streamcam_handler.DEPTH1_streamPythonのマルチスレッド化されたcv2.imshow()は動作しません

が同じのためのコードであると言う:

import threading 

def capture_and_save(cam_handle, cam_id, dir_to_write, log_writer, rgb_stream, 
        depth_stream, io): 
    t = threading.currentThread() 
    shot_idx = 0 
    rgb_window = 'RGB' + str(cam_id) 
    depth_window = 'DEPTH' + str(cam_id) 
    while getattr(t, "do_run", True): 
     if rgb_stream is not None: 

      rgb_array = cam_handle.get_rgb(rgb_stream) 
      rgb_array_disp = cv2.cvtColor(rgb_array, cv2.COLOR_BGR2RGB) 
      cv2.imshow(rgb_window, rgb_array_disp) 
      cam_handle.save_frame('rgb', rgb_array, shot_idx, dir_to_write + str(cam_id + 1)) 
      io.write_log(log_writer[cam_id], shot_idx, None) 

     if depth_stream is not None: 
      depth_array = cam_handle.get_depth(depth_stream) 
      depth_array_disp = ((depth_array/10000.) * 255).astype(np.uint8) 
      cv2.imshow(depth_window, np.uint8(depth_array_disp)) 
      cam_handle.save_frame('depth', depth_array, shot_idx, dir_to_write + str(cam_id + 1)) 
     shot_idx = shot_idx + 1 

     key = cv2.waitKey(1) 
     if key == 27: # exit on ESC 
      break 
    print "Stopping camera %d thread..." % (cam_id + 1) 
    return 

def main(): 
    ''' Setup camera threads ''' 
    cam_threads = [] 
    dir_to_write = "some/save/path" 
    for cam in range(cam_count): 
     cam = (cam + 1) % cam_count 
     cv2.namedWindow('RGB' + str(cam)) 
     cv2.namedWindow('DEPTH' + str(cam)) 
     one_thread = threading.Thread(target=capture_and_save, 
             name="CamThread" + str(cam + 1), 
             args=(cam_cap, cam, dir_to_write, 
              log_writer, 
              rgb_stream[cam], depth_stream[cam], io,)) 
     cam_threads.append(one_thread) 
     one_thread.daemon = True 
     one_thread.start() 

     try: 
      while True: 
       pass 
       # cv2.waitKey(1) 
     except KeyboardInterrupt: 
      ''' Stop everything ''' 
      for each_thread in cam_threads: 
       each_thread.do_run = False 
       each_thread.join(1) 
      cam_cap.stop_rgb(rgb_stream) 
      cam_cap.stop_depth(depth_stream) 

      ''' Stop and quit ''' 
      openni2.unload() 
      cv2.destroyAllWindows() 

if __name__ == '__main__': 
    main()  

だから、私の問題は、もし私がcv2.imshow()コードからの行はすべて期待どおりに実行され、両方のカメラ出力がファイルに保存されます。しかし、cv2.imshow()行では、 "空白"ウィンドウしか作成されず、スレッドは "スタック"しているように見え、出力はまったくありません。
namedWindowの作成をメインスレッドだけでなく、capture_and_saveスレッドに移動するなど、いくつかの提案を試みました。 OpenCVはメインスレッドでwaitKey()しか許可していないと言われたので、私はwaitKey()の周りを動かしてみました。しかし、違いはありませんでした。

答えて

0

mutablesを使用して、スレッドに辞書cam_disp = {}を渡して、メインスレッドの値を読み取って問題を解決しました。 cv2.imshow()は、メインスレッドに置いたときに最もうまく動作するので、これは完全に機能しました。これを「正しい」方法であるかどうかはわかりませんので、すべての提案は大歓迎です。

+0

あなたは、同様に変更されたコードを投稿してください可能性があり、私はちょうどhttps://github.com/kanishkaganguly/OpenNIMultiSensorCapture/blob/master/capture_cam.py を見てみましょう@csharpcoder最後の5時間 – csharpcoder

+0

ので、私の頭をぶつけています これは、上記の変更を加えた、最新のコードだと思います。 –

+0

私の悪い、私はちょうど最新の作業コードをコミットしました。 https://github.com/kanishkaganguly/OpenNIMultiSensorCapture/blob/master/capture_tool.py –

関連する問題