私は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をよりよく使うようにスクリプトをリファクタリングする必要がある場合は、教えてください。
ありがとうございます!
更新:60行目と61行目の画像フォーマットパラメータを 'RGB24'に変更しました。今私はなぜ32ビットRGBAバージョン+ .png + Windowsが動作していない/予想どおりに表示されているのだろうかと思っています。私はさまざまなファイル形式や色のビット深度で実験していませんが、私が行ったときにコメントを追加します。 –