avgdvc.cpp

00001 
00007 #include "stdafx.h"
00008 #include <stdio.h>
00009 #include <stdlib.h>
00010 #include <time.h>
00011 #include <windows.h>
00012 #include <math.h>
00013 
00014 #include <dvcAPI.h>             
00015 #include <dvcImage.h>   
00021 int main(int argc, char* argv[])
00022 {       
00023         HANDLE hDevice ;
00024         HANDLE hEvent ;
00025         int i ;
00026         int nFrames = 8 ;
00027         int nWidth, nHeight ;
00028         int nWaitMsec ;
00029         BOOL bRC ;
00030         BOOL bSaveAsRGB = FALSE ;
00031         BOOL bVerbose = FALSE ;
00032         char fname[256] = "\0" ;
00033 
00034         CDVCImage sumImage ;            
00035         CDVCImage captureImage ;        
00036         CDVCImage averageImage ;        
00039         hDevice = dvcOpenCamera(1) ;
00040 
00041         if(hDevice == INVALID_HANDLE_VALUE)
00042         {
00043                 fprintf(stderr,"Error opening DVC Camera!\n");
00044                 return -1 ;
00045         }
00046 
00059         for( i = 1 ; i < argc ; i++ )
00060         {
00061                 if(i+1 < argc && !strcmp(argv[i],"-b")) // Set binning -b 0|1|2|3|4
00062                 {
00063                         int nBin = atoi(argv[++i]) ;
00064                         bRC = dvcSetBinning(hDevice, nBin) ;
00065                         if(!bRC)
00066                                 dvcPrintf(0,"%s: Error setting binning %d\n", argv[0],nBin);
00067                 }
00068                 else if(i+1 < argc && !strcmp(argv[i], "-g"))
00069                 {
00070                         int nGain = atoi(argv[++i]) ;
00071                         bRC = dvcSetGain(hDevice, nGain) ;
00072                         if(!bRC)
00073                                 dvcPrintf(0,"%s: Error setting gain %d\n", argv[0],nGain);
00074                 }
00075                 else if(i+1 < argc && !strcmp(argv[i], "-o"))
00076                 {
00077                         int nOffset = atoi(argv[++i]) ;
00078                         bRC = dvcSetOffset(hDevice, nOffset) ;
00079                         if(!bRC)
00080                                 dvcPrintf(0,"%s: Error setting offset %d\n", argv[0],nOffset);
00081                 }
00082                 else if(i+1 < argc && !strcmp(argv[i], "-e"))
00083                 {
00084                         double dExposeMsec = atof(argv[++i]) ;
00085                         double dReturnExp =     dvcSetExposeMsec(hDevice, dExposeMsec) ;
00086 
00087                         if(dReturnExp != dExposeMsec)
00088                                 dvcPrintf(0,"%s: Set expose to %g [ Not %g ]\n",
00089                                                                 argv[0], dReturnExp, dExposeMsec);
00090                         
00091                 }
00092                 else if(i+1 < argc && !strcmp(argv[i], "-n"))
00093                 {
00094                         nFrames = atoi(argv[++i]);
00095                         if(nFrames < 1) nFrames = 1 ;
00096                 }
00097                 else if(i+1 < argc && !strcmp(argv[i], "-f"))
00098                 {
00099                         sprintf(fname,"%s",argv[++i]) ;
00100                 }
00101                 else if(!strcmp(argv[i], "-rgb"))
00102                         bSaveAsRGB = TRUE ;
00103                 else if(!strcmp(argv[i], "-v"))
00104                         bVerbose = TRUE ;
00105         }
00106 
00107 
00108         // If no file name to save the data,  use the default..
00109         if(fname[0] == '\0') sprintf(fname,"dvcAvg%d.tif",nFrames);
00110 
00111         nWidth = dvcGetXDim(hDevice) ;
00112         nHeight = dvcGetYDim(hDevice) ;
00113 
00114         // 16 bit buffer to capture the raw data
00115         captureImage.Create(nWidth,nHeight,2) ;
00116         
00117         if( nFrames >= 16 )     // Create a 32 bit summation buffer
00118                 sumImage.Create(nWidth, nHeight,  4 ) ;
00119         else
00120                 sumImage.Create(nWidth, nHeight,  2 ) ;
00121 
00122         // 16 bit buffer to save the averaged data
00123         averageImage.Create(nWidth,nHeight,2) ;
00124 
00125 
00126         // Create an event handle to wait for captures..
00127         hEvent = CreateEvent(NULL,FALSE,FALSE,NULL) ;
00128         dvcSetReadCompleteEvent(hDevice, hEvent) ;
00129         // How long in milliseconds too wait before timing out ..
00130         nWaitMsec  = (int) dvcGetTimeToReadImage(hDevice) + 1000 ;
00131 
00132         bRC = dvcStartSequence(hDevice, 0) ;
00133         if(!bRC)
00134         {
00135                 dvcPrintf(0,"%s: Error starting video capture..\n", argv[0] );
00136                 dvcSetReadCompleteEvent(hDevice, NULL) ;
00137                 dvcCloseCamera(hDevice);
00138                 return -1 ;
00139         }
00140 
00141         for( i=0 ; bRC && i < nFrames; i++ )
00142         {
00143                 if(bVerbose) dvcPrintf(0,"Waiting for Frame %d\n", i+1) ;
00144                 bRC = WaitForSingleObject(hEvent, nWaitMsec) == WAIT_OBJECT_0 ;
00145                 if(bRC){
00146                         if(bVerbose) dvcPrintf(0,"Read Event rec'd %d\n", i+1) ;
00147                         captureImage.ReadCamera(hDevice,0, 0, nWidth, nHeight) ;
00148                         if(bVerbose) dvcPrintf(0,"Captured %d\n", i+1) ;
00149                         sumImage.Add(&captureImage) ;
00150                         if(bVerbose) dvcPrintf(0,"Summed %d\n", i+1) ;
00151                 }
00152                 else dvcPrintf(0,"Waiting for read complete failed!\n");
00153         }
00154 
00155         dvcStopSequence(hDevice) ;
00156 
00157         if(bRC) {
00158 
00159                 // Divided the summed data in sumImage by nFrames and
00160                 // copy the results to the averageImage buffer
00161                 if(bVerbose) dvcPrintf(0,"Averaging %d\n", nFrames) ;
00162                 averageImage.DivideCopy(&sumImage, nFrames) ;
00163 
00164                 RECT rect ;
00165                 rect.top = 0 ;
00166                 rect.left = 0 ;
00167                 rect.right = nWidth ;
00168                 rect.bottom = nHeight ;
00169 
00170                 int nRenderBits = dvcGetNBits(hDevice) ;
00171                 if(bSaveAsRGB) nRenderBits = 24 ;       // Save as 24-bit RGB 
00172 
00173                 if(bVerbose) dvcPrintf(0,"Saveing data in %s ( %d bits/pixel )\n", 
00174                                                 fname, nRenderBits ) ;
00175 
00176                 // Write the averageImage buffer as a TIFF file name fname
00177                 averageImage.Render(fname,
00178                                                         &rect,
00179                                                         nRenderBits,    
00180                                                         0) ;
00181 
00182                 averageImage.CloseFile();
00183                 
00184         }else dvcPrintf(0,"%s: Failed!\n", argv[0]) ;
00185 
00186         dvcSetReadCompleteEvent(hDevice, NULL) ;
00187         CloseHandle(hEvent) ;
00188 
00189         dvcCloseCamera(hDevice) ;
00190         return bRC ? 0 : -1 ;
00191 }
00192 

©DVC Company, 2006. All rights reserved.    www.dvcco.com   Created Thu Nov 16 10:07:21 2006