2017-05-10 15 views
0

私はPython(2.7.12)とOpenCV(3.2.0)スクリプトを作成しようとしています。これは左右のカメラXimea xiQカメラを開き、取得を開始し、毎秒1回ずつ各カメラから写真をスナップしてファイルに書き込み、KeyboardInterruptまで繰り返します。すべてが機能しているように見えますが、.png画像を見ると空白です(またはプレビューで黒く表示されますが、それらはすべて〜2.5 MBなので空ではありません)。トリガーを使用したXimea Pythonスクリプトが空白の画像につながる

私はOpenCVとこれらのカメラ/ APIを初めて使いましたが、まだPythonに慣れていません(しかし、私は回避することができます)。皆さんは私の脚本を見て、あなたが問題と思われることを教えてもらえますか?ここだけ含まPythonの例のより精巧なバージョンである私がしようとしていますコードは(だ:

from ximea import xiapi 
import cv2 

increment_val = 0 
##which_camera = 'Left\\' 

save_location = 'C:\\Users\\mah_usernames\\Desktop\\camera_test\\' 
image_file_name = 'image' 
image_file_type = '.png' 
##saved_image_full_path = save_location + which_camera + image_file_name + image_file_type 
saved_image_full_path = save_location + image_file_name + image_file_type 

#create instance for first connected camera 
left_cam = xiapi.Camera(dev_id=0) 
right_cam = xiapi.Camera(dev_id=1) 

#start communication 
#to open specific device, use: 
#cam.open_device_by_SN('41305651') 
#(open by serial number) 
print('Opening left side camera...') 
left_cam.open_device() 

print('Opening right side camera...') 
right_cam.open_device() 

#settings 

##left_cam.enable_aeag() #enable auto exposure, auto gain 
##right_cam.enable_aeag() 
##left_cam.set_acq_timing_mode('XI_ACQ_TIMING_MODE_FREE_RUN') 
##right_cam.set_acq_timing_mode('XI_ACQ_TIMING_MODE_FREE_RUN') 

left_cam.set_led_selector('XI_LED_SEL3') #choose bottom LED 
left_cam.set_led_mode('XI_LED_ON') #always on, power indicator 
left_cam.set_led_selector('XI_LED_SEL2') #choose middle LED 
left_cam.set_led_mode('XI_LED_FRAME_ACTIVE') #blinks when frame is active 
left_cam.set_led_selector('XI_LED_SEL1') #choose top LED 
left_cam.set_led_mode('XI_LED_ACQUISITION') #blinks when data is transferred 
## 
right_cam.set_led_selector('XI_LED_SEL3') #choose bottom LED 
right_cam.set_led_mode('XI_LED_ON') #always on, power indicator 
right_cam.set_led_selector('XI_LED_SEL2') #choose middle LED 
right_cam.set_led_mode('XI_LED_FRAME_ACTIVE') #blinks when frame is active 
right_cam.set_led_selector('XI_LED_SEL1') #choose top LED 
right_cam.set_led_mode('XI_LED_ACQUISITION') #blinks when data is transferred 

left_cam.set_trigger_source('XI_TRG_EDGE_RISING') 
right_cam.set_trigger_source('XI_TRG_EDGE_RISING') 
left_cam.set_trigger_selector('XI_TRG_SEL_EXPOSURE_ACTIVE') 
right_cam.set_trigger_selector('XI_TRG_SEL_EXPOSURE_ACTIVE') 

left_cam.set_gpi_mode('XI_GPI_TRIGGER') 
right_cam.set_gpi_mode('XI_GPI_TRIGGER') 
left_cam.set_exposure(5000) 
right_cam.set_exposure(5000) 
print('Left Camera exposure was set to %i us' %left_cam.get_exposure()) 
print('Right Camera exposure was set to %i us' %right_cam.get_exposure()) 
left_cam.set_imgdataformat('XI_RGB32') 
right_cam.set_imgdataformat('XI_RGB32') 

#create instance of Image to store image data and metadata 
##img = xiapi.Image() 
img_left = xiapi.Image() 
img_right = xiapi.Image() 

#start data acquisition 
print('Starting data acquisition...') 
left_cam.start_acquisition() 
right_cam.start_acquisition() 

try: 
    while True: 
     print str(increment_val) 
     #get data and pass them from camera to img 
     ## left_cam.get_image(img_left) 
     ## right_cam.get_image(img_right) 
     left_cam.get_image(img_left) 
     right_cam.get_image(img_right) 

     #get raw data from camera 
     #for Python2.x function returns string 
     #for Python3.x function returns bytes 
     left_cam_data = img_left.get_image_data_numpy() 
     right_cam_data = img_right.get_image_data_numpy() 

     ## #transform data to list 
     ## data = list(data_raw) 
     ## 
     ## #print image data and metadata 
     ## print('Image number: ' + str(i)) 
     ## print('Image width (pixels): ' + str(img_left.width)) 
     ## print('Image height (pixels): ' + str(img_left.height)) 
     ## print('First 10 pixels: ' + str(left_cam_data[:10])) 
     ## print('\n') 

     ## #show acquired image 
     ## print('Drawing image...') 
     ## cv2.imshow('Left side camera', left_cam_data) 
     ## cv2.imshow('Right side camera', right_cam_data) 
     ## cv2.waitKey(0) 
     ## cv2.destroyAllWindows() 

     #save acquired image 
     print('Saving image...') 
     cv2.imwrite((save_location + 'Left\\' + image_file_name + str(increment_val) + image_file_type), left_cam_data) 
     cv2.imwrite((save_location + 'Right\\' + image_file_name + str(increment_val) + image_file_type), right_cam_data) 
     increment_val += 1 
     print str(increment_val) 

except: 
    KeyboardInterrupt 
    #stop data acquisition 
    print ('Stopping acquisition...') 
    left_cam.stop_acquisition() 
    right_cam.stop_acquisition() 

    #stop communication 
    left_cam.close_device() 
    right_cam.close_device() 

    print ('All finished!') 

これに先立ち、私は...缶詰例のわずかに少ない修正バージョンを使用していた

from ximea import xiapi 
import cv2 

##increment_val = 0 
##which_camera = 'Left\\' 

save_location = 'C:\\Users\\mah_usernames\\Desktop\\camera_test\\' 
image_file_name = 'image' 
image_file_type = '.png' 
##saved_image_full_path = save_location + which_camera + image_file_name + image_file_type 
saved_image_full_path = save_location + image_file_name + image_file_type 

#create instance for first connected camera 
left_cam = xiapi.Camera(dev_id=0) 
right_cam = xiapi.Camera(dev_id=1) 

#start communication 
#to open specific device, use: 
#cam.open_device_by_SN('41305651') 
#(open by serial number) 
print('Opening left side camera...') 
left_cam.open_device() 

print('Opening right side camera...') 
right_cam.open_device() 

#settings 
left_cam.set_exposure(10000) 
right_cam.set_exposure(8000) 
print('Left Camera exposure was set to %i us' %left_cam.get_exposure()) 
print('Right Camera exposure was set to %i us' %right_cam.get_exposure()) 
left_cam.set_imgdataformat('XI_RGB24') 
right_cam.set_imgdataformat('XI_RGB24') 

#create instance of Image to store image data and metadata 
##img = xiapi.Image() 
img_left = xiapi.Image() 
img_right = xiapi.Image() 

#start data acquisition 
print('Starting data acquisition...') 
left_cam.start_acquisition() 
right_cam.start_acquisition() 


for i in range(10): 
    increment_val = i 
    print str(increment_val) 
    #get data and pass them from camera to img 
## left_cam.get_image(img_left) 
## right_cam.get_image(img_right) 
    left_cam.get_image(img_left) 
    right_cam.get_image(img_right) 

    #get raw data from camera 
    #for Python2.x function returns string 
    #for Python3.x function returns bytes 
    left_cam_data = img_left.get_image_data_numpy() 
    right_cam_data = img_right.get_image_data_numpy() 

## #transform data to list 
## data = list(data_raw) 
## 
## #print image data and metadata 
## print('Image number: ' + str(i)) 
## print('Image width (pixels): ' + str(img_left.width)) 
## print('Image height (pixels): ' + str(img_left.height)) 
## print('First 10 pixels: ' + str(left_cam_data[:10])) 
## print('\n') 

## #show acquired image 
## print('Drawing image...') 
## cv2.imshow('Left side camera', left_cam_data) 
## cv2.imshow('Right side camera', right_cam_data) 
## cv2.waitKey(0) 
## cv2.destroyAllWindows() 

    #save acquired image 
    print('Saving image...') 
    cv2.imwrite((save_location + 'Left\\' + image_file_name + str(increment_val) + image_file_type), left_cam_data) 
## which_camera = 'Right\\' 
    cv2.imwrite((save_location + 'Right\\' + image_file_name + str(increment_val) + image_file_type), right_cam_data) 

#stop data acquisition 
print('Stopping acquisition...') 
left_cam.stop_acquisition() 
right_cam.stop_acquisition() 

#stop communication 
left_cam.close_device() 
right_cam.close_device() 

print('Done.') 

...それはうまくいきました。すなわち、各カメラから画像が取り込まれ、すべての画像が正しく表示されたため、セットアップをトリガーしなければならない方法と思います。 GPS受信機からの1PPS信号をGPIピンへのトリガー入力として使用します。

とにかく、この問題に関する助言や、OpenCV APIをよりよく使うようにスクリプトをリファクタリングする必要がある場合は、教えてください。

ありがとうございます!

+0

更新:60行目と61行目の画像フォーマットパラメータを 'RGB24'に変更しました。今私はなぜ32ビットRGBAバージョン+ .png + Windowsが動作していない/予想どおりに表示されているのだろうかと思っています。私はさまざまなファイル形式や色のビット深度で実験していませんが、私が行ったときにコメントを追加します。 –

答えて

0

最初のコメントで私が上に示した解決策は、実行可能な回答であり、これを閉じるには十分です。なぜ私がRGBAファイルを見ることができなかったかを見ていくつもりですが、Python/Open CVスクリプトの問題ではなく、Windowsがそのファイルタイプを扱う方法ともっと関係していると思います。

Ximeaのドキュメントが不足しているため、OpenCVでPythonでトリガされた2つのXimeaカメラソリューションが必要な人には、これを残しておきます。

幸運を祈る!

関連する問題