307 lines
12 KiB
C++
Raw Normal View History

2025-12-10 00:01:32 +08:00
// main.cpp
/* @brief<65><66><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IKapC<70><43><EFBFBD><EFBFBD>IKapBoard<72>⣬ͨ<E2A3AC><CDA8><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
*
* @brief<EFBFBD><EFBFBD>This example shows users how to use IKapC and IKapBoard libraries to
* grab images continuously with grabber linked camera. */
#include <malloc.h>
#include <shlwapi.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include "../GeneralConfigureCamera/ConfigureCamera.h"
#include "GeneralGrabWithGrabber.h"
#pragma comment(lib, "IKapBoard.lib")
#pragma comment(lib, "IKapC.lib")
#pragma comment(lib, "shlwapi.lib")
/* @brief<65><66>ע<EFBFBD><D7A2><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @brief<EFBFBD><EFBFBD>Register callback functions. */
void RegisterCallbackWithGrabber(pItkCamera pCam);
/* @brief<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @brief<EFBFBD><EFBFBD>Unregister callback functions. */
void UnRegisterCallbackWithGrabber(pItkCamera pCam);
/* @brief<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>Ϊһ<CEAA><D2BB><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
* @param[in] pContext<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @brief<EFBFBD><EFBFBD>This function is registered as a callback function. When starting
* grabbing images, the function will be called.
* @param[in] pContext<EFBFBD><EFBFBD>Input parameter. */
void CALLBACK OnGrabStart(void* pContext);
/* @brief<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>Ϊһ<CEAA><D2BB><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ֡ͼ<D6A1><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
* @param[in] pContext<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @brief<EFBFBD><EFBFBD>This function is registered as a callback function. When a frame of
* image grabbing ready, the function will be called.
* @param[in] pContext<EFBFBD><EFBFBD>Input parameter. */
void CALLBACK OnFrameReady(void* pContext);
/* @brief<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>Ϊһ<CEAA><D2BB><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
* @param[in] pContext<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @brief<EFBFBD><EFBFBD>This function is registered as a callback function. When grabbing
* images time out, the function will be called.
* @param[in] pContext<EFBFBD><EFBFBD>Input parameter. */
void CALLBACK OnTimeout(void* pContext);
/* @brief<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>Ϊһ<CEAA><D2BB><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD>֡ʱ<D6A1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
* @param[in] pContext<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @brief<EFBFBD><EFBFBD>This function is registered as a callback function. When grabbing
* frame lost, the function will be called.
* @param[in] pContext<EFBFBD><EFBFBD>Input parameter. */
void CALLBACK OnFrameLost(void* pContext);
/* @brief<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>Ϊһ<CEAA><D2BB><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD>ֹͣʱ<D6B9><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
* @param[in] pContext<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @brief<EFBFBD><EFBFBD>This function is registered as a callback function. When stopping
* grabbing images, the function will be called.
* @param[in] pContext<EFBFBD><EFBFBD>Input parameter. */
void CALLBACK OnGrabStop(void* pContext);
int main()
{
/// \~chinese IKapC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ \~english Return value of IKapC functions
ITKSTATUS res = ITKSTATUS_OK;
/// \~chinese IKapBoard <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ \~english Return value of IKapBoard functions
int ret = IK_RTN_OK;
/// \~chinese <20><>ʼ<EFBFBD><CABC> IKapC <20><><EFBFBD>л<EFBFBD><D0BB><EFBFBD> \~english Initialize IKapC runtime environment
res = ItkManInitialize();
CHECK_IKAPC(res);
ItkCamera cam;
cam.g_bufferCount = 10;
sprintf_s(cam.g_saveFileName, "D:\\CImage.tif");
cam.g_SerialNumber = NULL;
cam.g_bSoftTriggerUsed = 1;
cam.g_bLoadGrabberConfig = 1;
uint32_t numDevices = 0;
res = ItkManGetDeviceCount(&numDevices);
CHECK(res);
// <20><>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5>豸ʱ<E8B1B8><CAB1>
//
// When there is no connected devices.
if (numDevices == 0) {
fprintf(stderr, "No device.\n");
ItkManTerminate();
pressEnterToExit();
exit(EXIT_FAILURE);
}
printCameraInfo(numDevices);
/// \~chinese <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸 \~english Open camera with 0 index and configure camera device
int tmpIndex = -1;
fprintf(stderr, "total device count: %d, the index of which you want to open is:", numDevices);
fflush(stderr);
int scanTmp = scanf_s("%u", &tmpIndex);
if (scanTmp != 1) {
fprintf(stderr, "Invalid input. Expect an integer.\n");
ItkManTerminate();
pressEnterToExit();
exit(EXIT_FAILURE);
}
if (tmpIndex >= numDevices)
{
fprintf(stderr, "index: %d is more than %d.\n", tmpIndex, numDevices - 1);
ItkManTerminate();
pressEnterToExit();
exit(EXIT_FAILURE);
}
{ int getCharTmp = getchar(); }
ConfigureCamera(&cam, tmpIndex);
if (cam.g_hBoard == INVALID_HANDLE_VALUE) {
fprintf(stderr,"Please select camera with grabber.\n");
ItkManTerminate();
pressEnterToExit();
exit(EXIT_FAILURE);
}
/// \~chinese <20><><EFBFBD>òɼ<C3B2><C9BC><EFBFBD><EFBFBD>豸 \~english Configure frame grabber device
ConfigureFrameGrabber(&cam);
/// \~chinese ע<><D7A2><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD> \~english Register callback functions.
RegisterCallbackWithGrabber(&cam);
/// \~chinese <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ \~english Configure trigger method of the camera
SetSoftTriggerWithGrabber(&cam);
/// \~chinese <20><>ʼͼ<CABC><CDBC><EFBFBD>ɼ<EFBFBD> \~english Start grabbing images
StartGrabImage(&cam);
if (cam.g_bSoftTriggerUsed) {
printf("Please intput t to softTrigger a frame and input e to exit: ");
while (true) {
char T = 0;
int scanTmp = scanf_s("%c", &T, (unsigned)sizeof(T));
if (T == 't') {
if (strcmp(cam.g_devInfo.DeviceClass, "CoaXPress") == 0 ||
strcmp(cam.g_devInfo.DeviceClass, "CameraLink") == 0) {
ret = IKapSetInfo(cam.g_hBoard, IKP_SOFTWARE_TRIGGER_START, 1);
} else {
res = ItkDevExecuteCommand(cam.g_hCamera, "TriggerSoftware");
}
CHECK_IKAPBOARD(ret);
} else if (T == 'e') {
break;
} else if (T != '\n') {
printf("Please intput t to softTrigger a frame and input e to exit: ");
}
}
}
/// \~chinese <20>ȴ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD> \~english Wait for grabbing images finished
{ int getCharTmp = getchar(); }
/// \~chinese ֹͣͼ<D6B9><CDBC><EFBFBD>ɼ<EFBFBD> \~english Stop grabbing images
ret = IKapStopGrab(cam.g_hBoard);
CHECK_IKAPBOARD(ret);
/// \~chinese <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD> \~english Unregister callback functions
UnRegisterCallbackWithGrabber(&cam);
/// \~chinese <20>رղɼ<D5B2><C9BC><EFBFBD><EFBFBD>豸 \~english Close frame grabber device
ret = IKapClose(cam.g_hBoard);
CHECK_IKAPBOARD(ret);
/// \~chinese <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸 \~english Close camera device
res = ItkDevClose(cam.g_hCamera);
CHECK_IKAPC(res);
/// \~chinese <20>ͷ<EFBFBD><CDB7>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Buffer<65><72>ַ<EFBFBD><D6B7><EFBFBD>ڴ<EFBFBD> \~english Release the memory that the user requests for setting the Buffer address
/*if (cam.g_user_buffer!=NULL)
free(cam.g_user_buffer);*/
/// \~chinese <20>ͷ<EFBFBD> IKapC <20><><EFBFBD>л<EFBFBD><D0BB><EFBFBD> \~english Release IKapC runtime environment
ItkManTerminate();
pressEnterToExit();
return 0;
}
/// \~chinese ע<><D7A2><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD> \~english Register callback functions
/// \~chinese ע<><D7A2><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʹ<EFBFBD><CAB9>static<69><63><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ó<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3>ڸó<DAB8>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>ǰ<EFBFBD><C7B0>ʹ<EFBFBD><CAB9> IKapUnRegisterCallback() ȡ<><C8A1>ע<EFBFBD><D7A2><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ͷŵ<CDB7><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// \~english Use a static function declared with 'static' to register a callback, if using a member function, be aware of the lifetime of the object that owns the member function and unregister the callback by IKapUnRegisterCallback() before the object is destroyed, or if the callback is triggered after the object has been released, it will cause an exception
void RegisterCallbackWithGrabber(pItkCamera pCam)
{
int ret = IK_RTN_OK;
ret = IKapRegisterCallback(pCam->g_hBoard, IKEvent_GrabStart, OnGrabStart, pCam);
CHECK_IKAPBOARD(ret);
/// \~chinese ֡<><D6A1><EFBFBD>ɻص<C9BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD>Ӧִ<D3A6>к<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1s/֡<><D6A1> <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>ʧ
/// \~english in OnFrameReady callback function, should not execute time-consuming operation, and finish in time of 1s/framerate, or could cause framelost
ret = IKapRegisterCallback(pCam->g_hBoard, IKEvent_FrameReady, OnFrameReady, pCam);
CHECK_IKAPBOARD(ret);
ret = IKapRegisterCallback(pCam->g_hBoard, IKEvent_FrameLost, OnFrameLost, pCam);
CHECK_IKAPBOARD(ret);
ret = IKapRegisterCallback(pCam->g_hBoard, IKEvent_TimeOut, OnTimeout, pCam);
CHECK_IKAPBOARD(ret);
ret = IKapRegisterCallback(pCam->g_hBoard, IKEvent_GrabStop, OnGrabStop, pCam);
CHECK_IKAPBOARD(ret);
}
void UnRegisterCallbackWithGrabber(pItkCamera pCam)
{
int ret = IK_RTN_OK;
ret = IKapUnRegisterCallback(pCam->g_hBoard, IKEvent_GrabStart);
CHECK_IKAPBOARD(ret);
ret = IKapUnRegisterCallback(pCam->g_hBoard, IKEvent_FrameReady);
CHECK_IKAPBOARD(ret);
ret = IKapUnRegisterCallback(pCam->g_hBoard, IKEvent_FrameLost);
CHECK_IKAPBOARD(ret);
ret = IKapUnRegisterCallback(pCam->g_hBoard, IKEvent_TimeOut);
CHECK_IKAPBOARD(ret);
ret = IKapUnRegisterCallback(pCam->g_hBoard, IKEvent_GrabStop);
CHECK_IKAPBOARD(ret);
}
void CALLBACK OnGrabStart(void* pContext)
{
printf("Start grabbing image.\n");
}
void CALLBACK OnFrameReady(void* pContext)
{
ITKSTATUS res = ITKSTATUS_OK;
int ret = IK_RTN_OK;
pItkCamera cam = (pItkCamera)pContext;
printf("Grab frame ready of camera with serialNumber:%s.\n", cam->g_devInfo.SerialNumber);
unsigned char* pUserBuffer = NULL;
int64_t nFrameSize = 0;
int nFrameCount = 0;
int nFrameIndex = 0;
IKAPBUFFERSTATUS status;
ret = IKapGetInfo(cam->g_hBoard, IKP_FRAME_COUNT, &nFrameCount);
CHECK_IKAPBOARD(ret);
ret = IKapGetInfo(cam->g_hBoard, IKP_CURRENT_BUFFER_INDEX, &nFrameIndex);
CHECK_IKAPBOARD(ret);
ret = IKapGetBufferStatus(cam->g_hBoard, nFrameIndex, &status);
CHECK_IKAPBOARD(ret);
/// \~chinese <20><>ͼ<EFBFBD>񻺳<EFBFBD><F1BBBAB3><EFBFBD><EFBFBD><EFBFBD>ʱ \~english When the buffer is full
if (status.uFull == 1) {
/// \~chinese <20><>ȡһ֡ͼ<D6A1><CDBC><EFBFBD>Ĵ<EFBFBD>С \~english Get the size of a frame of image
ret = IKapGetInfo64(cam->g_hBoard, IKP_FRAME_SIZE, &nFrameSize);
CHECK_IKAPBOARD(ret);
/// \~chinese <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MultiExposureTimeCount<6E><74><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>Ҳɼ<D2B2><C9BC><EFBFBD><EFBFBD><EFBFBD>IKP_MULTIPLE_LIGHT_COUNT<4E><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>MultiExposureTimeCount<6E><74>ͬ<EFBFBD><CDAC>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD><CBB6><EFBFBD><EFBFBD>ع⹦<D8B9>ܣ<EFBFBD><DCA3>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪN<CEAA><4E><EFBFBD>ع<EFBFBD>ʱ<EFBFBD>䣬[0~1*Height/N-1]<5D>ж<EFBFBD>ӦExposureSelectΪ1ʱ<31><CAB1>ExposureTime<6D><65>[1*Height/N~2*Height/N-1]<5D>ж<EFBFBD>ӦExposureSelectΪ2ʱ<32><CAB1>ExposureTime<6D><65>...<2E><>[(N-1)*Height/N~Height-1]<5D>ж<EFBFBD>ӦExposureSelectΪNʱ<4E><CAB1>ExposureTime. \~english If the MultiExposureTimeCount feature value is greater than 1, the multiple exposure function is turned on, The collected images were all divided into N exposure times, line [0~1 * Height / N-1] corresponds to the ExposureTime at a ExposureSelect of 1, line [1 * Height / N~2 * Height / N-1] corresponds to ExposureTime at ExposureSelect 2,..., line [(N-1) * Height / N~Height-1] corresponds to ExposureTime at ExposureSelect N.
/// \~chinese <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ \~english Get the buffer address
ret = IKapGetBufferAddress(cam->g_hBoard, nFrameIndex, (void**)&pUserBuffer);
CHECK_IKAPBOARD(ret);
/// \~chinese <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC> \~english Save image
/*
ret=IKapSaveBuffer(cam->g_hBoard,nFrameIndex,cam->g_saveFileName,IKP_DEFAULT_COMPRESSION);
CHECK_IKAPBOARD(ret);
*/
}
}
void CALLBACK OnTimeout(void* pContext)
{
printf("Grab image timeout.\n");
}
void CALLBACK OnFrameLost(void* pContext)
{
printf("Grab frame lost.\n");
}
void CALLBACK OnGrabStop(void* pContext)
{
printf("Stop grabbing image.\n");
}