SeqAcquisition.py#

#############################################################
 # 
 # FILE:        SeqAcquisition.py
 # DATE:        11/10/2021
 # COMPANY:     BitFlow, Inc.
 # DESCRIPTION: A simple example demonstrating sequential acquisition 
 #              using a BitFlow board. The program allocates and acquires
 #              frames to ten buffers and gives the option to save these 
 #              frames to the working directory.
 #
#############################################################

import platform
import os

if(platform.system() == 'Windows'):
    import sys
    import msvcrt

    if (sys.version_info.major >= 3 and sys.version_info.minor >= 8):
        #Following lines specifying, the location of DLLs, are required for Python Versions 3.8 and greater
        os.add_dll_directory("C:\BitFlow SDK 6.5\Bin64")
        os.add_dll_directory("C:\Program Files\CameraLink\Serial")

import BFModule.BufferAcquisition as Buf
import BFModule.Display as Disp

import time

def main():

    print('Sequential Acquisition Example')
    print('---------------------------------')
    
    numBuffers = 10

    SeqAq = Buf.clsSeqAcquisition()

    #Call Open board function by showing the Board select dialog
    SeqAq.Open()

    #Allocate the requested number of buffers
    BufArr = SeqAq.BufferSetup(numBuffers)

    #Setup acquisition using the default options
    SeqAq.AqSetup(Buf.SetupOptions.setupDefault)

    #Start acquisition
    SeqAq.AqControl(Buf.AcqCommands.Start, Buf.AcqControlOptions.Wait)

    #Wait until all 10 frames have been acquired
    print ('Acquiring frames . . .')
    SeqAq.WaitSequenceDone(15000)
    
    print('Done.')

    #Create display surface
    dispSurf = Disp.clsDisp(SeqAq)
    
    dispSurf.Open()
    
    print('\nDisplaying images . . .')

    print('Hit: \n    \'L\' to loop through all images once, \n    \'N\' to loop through one image at a time')
    
    flag = False
    loop = False

    while(not(flag)):
        val = input() 
        if (val.upper() == 'L'):
            loop = True
            flag = True
        elif(val.upper() == 'N'):
            loop = False
            flag = True
        else:
            print('Invalid Entry.')
            loop = False
            flag = False

    for i in range(0, numBuffers):
        print('\tDisplaying frame', (i+1), 'of ', numBuffers, '\r', end="")
        dispSurf.Update(BufArr[i])
        if(loop):
            time.sleep(0.25)
        else:
           input() 

    val = input('\n\nSave images? (Y/N): ')
    if (val.upper() == 'Y'):
        in1 = input('Enter the buffer number to save (\'A\' to save all images): ')
       
        try:
            if(in1.strip().isdigit()):
                i = int(in1)
                if(i<numBuffers):
                    #FileName = os.getcwd() + '\\' + 'Image_'+ str(i) + '.BMP'
                    FileName = 'Image_'+ str(i) + '.tiff'
                    SeqAq.WriteBuffer(FileName, i)
                    print('Image saved as: ', FileName)
                else:
                    print('Invalid entry. Buffer number has to be between 0 and ', numBuffers)
            elif(in1.isalpha()):
                if(in1.upper() == 'A'):
                    FileName = os.getcwd() + '/' + 'Image.TIFF'
                    SeqAq.WriteBuffers(FileName, 0, numBuffers)
                    print('Images saved in: ', os.getcwd())
                    pass
                else:
                    print('Invalid entry.')
            else:
                print('Invalid entry.')
        except Exception as e:
            print("\nImage save operation failed.")
            print(e)

    else:
        print("")


    print("\nClosing Display.")
    #Close display and free resources
    dispSurf.Close()

    #Deallocate buffers
    SeqAq.BufferCleanup()

    #Close the board
    SeqAq.Close()

if __name__ == "__main__":
    main()